Skip to content

Commit 6b3e81c

Browse files
committed
Move selection of runs by date from models to views
- What "recent" means is specific to a presentation layer, it shouldn't be part of the data - Setting _TODAY at import time works for a static page, but would start misbehaving if naucse ever switches to being dynamic - For the same reason, the "is_ongoing" helper shouldn't be reified; and whe it isn't there's not much reason for it any more.
1 parent a3a19e1 commit 6b3e81c

File tree

3 files changed

+47
-55
lines changed

3 files changed

+47
-55
lines changed

naucse/models.py

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
import re
33
from collections import OrderedDict
4+
from operator import attrgetter
45
import datetime
56

67
import cssutils
@@ -21,7 +22,6 @@
2122

2223

2324
_TIMEZONE = 'Europe/Prague'
24-
_TODAY = datetime.date.today()
2525
allowed_elements_parser = AllowedElementsParser()
2626

2727

@@ -485,10 +485,6 @@ def is_link(self):
485485
def is_derived(self):
486486
return self.base_course is not None
487487

488-
@reify
489-
def is_ongoing(self):
490-
return self.end_date >= _TODAY
491-
492488

493489
class Course(CourseMixin, Model):
494490
"""A course – ordered collection of sessions"""
@@ -852,20 +848,12 @@ def safe_run_years(self):
852848

853849
return safe_years
854850

855-
@reify
856-
def ongoing_and_recent_runs(self):
857-
"""Get runs that are either ongoing or ended in the last 3 months."""
858-
ongoing = [run for run in self.safe_runs.values()
859-
if run.is_ongoing]
860-
cutoff = _TODAY - datetime.timedelta(days=3*31)
861-
recent = [run for run in self.safe_runs.values()
862-
if not run.is_ongoing and run.end_date > cutoff]
863-
return {"ongoing": ongoing, "recent": recent}
864-
865851
def runs_from_year(self, year):
866-
"""Get all runs that either started or ended in a given year."""
867-
return [run for run in self.safe_runs.values()
868-
if run.start_date.year <= year and run.end_date.year >= year]
852+
"""Get all runs started in a given year."""
853+
run_year = self.safe_run_years.get(year)
854+
if run_year:
855+
return sorted(run_year, key=attrgetter('start_date'))
856+
return []
869857

870858
def get_lesson(self, name):
871859
if isinstance(name, Lesson):

naucse/templates/run_list.html

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -49,49 +49,43 @@ <h4>
4949

5050
{% block list %}
5151

52-
{% if all is none %}
53-
{% if year is none %}
54-
<h1>Aktuální kurzy</h1>
55-
{% if run_data["ongoing"] | length > 0 %}
56-
{% for run in run_data["ongoing"] | sort(attribute='start_date', reverse=True) %}
57-
{{ show_run(run) }}
58-
{% endfor %}
59-
{% else %}
60-
<div class="empty-run-list">
61-
Nemáme žádné aktuální kurzy.
62-
</div>
63-
{% endif %}
64-
65-
{% if run_data["recent"] | length > 0 %}
66-
{{ pagination() }}
67-
68-
<h1>Nedávno proběhlé kurzy</h1>
69-
{% for run in run_data["recent"] | sort(attribute='start_date', reverse=True) %}
70-
{{ show_run(run) }}
71-
{% endfor %}
72-
{% endif %}
52+
{% if all is none and year is none %}
53+
<h1>Aktuální kurzy</h1>
54+
{% if run_data["ongoing"] | length > 0 %}
55+
{% for run in run_data["ongoing"] | sort(attribute='start_date', reverse=True) %}
56+
{{ show_run(run) }}
57+
{% endfor %}
7358
{% else %}
59+
<div class="empty-run-list">
60+
Nemáme žádné aktuální kurzy.
61+
</div>
62+
{% endif %}
63+
64+
{% if run_data["recent"] | length > 0 %}
7465
{{ pagination() }}
7566

76-
<h1>{{ year }}</h1>
77-
{% if run_data | length > 0 %}
78-
{% for run in run_data | sort(attribute='start_date', reverse=True) %}
79-
{{ show_run(run) }}
80-
{% endfor %}
81-
{% else %}
82-
<div class="empty-run-list">
83-
V tomto roce neproběhly žádné kurzy.
84-
</div>
85-
{% endif %}
67+
<h1>Nedávno proběhlé kurzy</h1>
68+
{% for run in run_data["recent"] | sort(attribute='start_date', reverse=True) %}
69+
{{ show_run(run) }}
70+
{% endfor %}
8671
{% endif %}
8772
{% else %}
8873
{{ pagination() }}
89-
90-
<h1>Všechny kurzy</h1>
91-
{% for year, run_year in run_data.items() | sort(reverse=True) %}
92-
<h2>{{ year }}</h2>
74+
{% if year %}
75+
<h1>{{ year }}</h1>
76+
{% else %}
77+
<h1>Všechny kurzy</h1>
78+
{% endif %}
79+
{% for section, run_year in run_data.items() | sort(reverse=True) %}
80+
{% if (run_data | length) > 1 %}
81+
<h2>{{ section }}</h2>
82+
{% endif %}
9383
{% for run in run_year | sort(attribute='start_date', reverse=True) %}
9484
{{ show_run(run) }}
85+
{% else %}
86+
<div class="empty-run-list">
87+
V tomto roce neproběhly žádné kurzy.
88+
</div>
9589
{% endfor %}
9690
{% endfor %}
9791
{% endif %}

naucse/views.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,22 @@ def runs(year=None, all=None):
127127
paginate_prev = {'year': first_year}
128128
paginate_next = {'all': 'all'}
129129
elif year is None:
130-
run_data = model.ongoing_and_recent_runs
130+
# Show runs that are either ongoing or ended in the last 3 months
131+
runs = (model.runs_from_year(today.year) +
132+
model.runs_from_year(today.year - 1) +
133+
model.runs_from_year(today.year - 2))
134+
ongoing = [run for run in runs if run.end_date >= today]
135+
cutoff = today - datetime.timedelta(days=3*31)
136+
recent = [run for run in runs if today > run.end_date > cutoff]
137+
run_data = {"ongoing": ongoing, "recent": recent}
131138

132139
paginate_prev = {'year': None}
133140
paginate_next = {'year': last_year}
134141
else:
135-
run_data = model.runs_from_year(year)
142+
run_data = {year: [run for run
143+
in model.runs_from_year(year) +
144+
model.runs_from_year(year - 1)
145+
if run.end_date.year >= year]}
136146

137147
past_years = [y for y in all_years if y < year]
138148
if past_years:

0 commit comments

Comments
 (0)