1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
# Copyright (C) 2017 Alban Gruin
#
# celcatsanitizer is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# celcatsanitizer is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with celcatsanitizer. If not, see <http://www.gnu.org/licenses/>.
import datetime
from django.db.models import Max
from django.db.models.functions import Length
from django.http import Http404
from django.shortcuts import get_object_or_404, render
from .models import Timetable, Group, Course, Year
from .utils import get_current_week, get_current_or_next_week, get_week, group_courses
import edt
def index(request):
years = Year.objects.order_by("name")
return render(request, "index.html", {"elements": years})
def mention_list(request, year_slug):
year = get_object_or_404(Year, slug=year_slug)
timetables = Timetable.objects.order_by("name").filter(year=year)
return render(request, "index.html", {"year": year, "elements": timetables})
def group_list_common(request, timetable, groups):
start, _ = get_week(*get_current_week())
end = start + datetime.timedelta(weeks=4)
groups_weeks = Course.objects.get_weeks(begin__gte=start, begin__lt=end, timetable=timetable) \
.values("groups__mention", "groups__subgroup",
"year", "week")
for group in groups:
for group_week in groups_weeks:
if group.corresponds_to(timetable.id, group_week["groups__mention"],
group_week["groups__subgroup"]):
if not hasattr(group, "weeks"):
group.weeks = []
date, _ = get_week(group_week["year"], group_week["week"])
if date not in group.weeks:
group.weeks.append(date)
if hasattr(group, "weeks"):
group.weeks.sort()
return render(request, "group_list.html", {"timetable": timetable, "groups": groups})
def group_list(request, year_slug, timetable_slug):
timetable = get_object_or_404(Timetable, year__slug=year_slug, slug=timetable_slug)
groups = Group.objects.get_relevant_groups(timetable)
return group_list_common(request, timetable, groups)
def timetable(request, year_slug, timetable_slug, group_slug, year=None, week=None):
current_year, current_week = get_current_or_next_week()
is_old_timetable, provided_week = False, True
if year is None or week is None:
year, week = current_year, current_week
provided_week = False
elif (int(year), int(week)) < (current_year, current_week):
is_old_timetable = True
start, end = get_week(int(year), int(week))
timetable = get_object_or_404(Timetable, year__slug=year_slug, slug=timetable_slug)
group = get_object_or_404(Group, slug=group_slug, timetable=timetable)
if Group.objects.filter(timetable=timetable, mention=group.mention,
subgroup__startswith=group.subgroup).count() > 1:
subgroups = Group.objects.get_relevant_groups(timetable, mention=group.mention,
subgroup__startswith=group.subgroup)
return group_list_common(request, timetable, subgroups)
courses = Course.objects.get_courses_for_group(group, begin__gte=start, begin__lt=end)
if courses.count() == 0 and provided_week:
raise Http404
last_update = courses.aggregate(Max("last_update"))["last_update__max"]
grouped_courses = group_courses(courses)
return render(request, "timetable.html", {"group": group, "courses": grouped_courses,
"last_update": last_update,
"year": year, "week": int(week),
"is_old_timetable": is_old_timetable})
def calendars(request, year_slug, timetable_slug, group_slug):
group = get_object_or_404(Group, timetable__year__slug=year_slug,
timetable__slug=timetable_slug, slug=group_slug)
groups = Group.objects.get_parents(group).annotate(length=Length("subgroup")) \
.order_by("length")
return render(request, "calendars.html", {"group": group, "groups": groups})
def ctx_processor(request):
return {"celcatsanitizer_version": edt.VERSION}
|