From 00bd85d3d19ad829566835d20cb04fecf324a6c1 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Wed, 18 Oct 2017 13:37:36 +0200 Subject: Suppression des imports inutiles --- management/commands/timetables.py | 1 - tests.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/management/commands/timetables.py b/management/commands/timetables.py index 35fb26e..2d8a17e 100644 --- a/management/commands/timetables.py +++ b/management/commands/timetables.py @@ -18,7 +18,6 @@ import datetime from django.core.management.base import BaseCommand from django.db import transaction from django.db.models import Min -from django.utils import timezone from edt.models import Course, Timetable from edt.utils import get_week, tz_now diff --git a/tests.py b/tests.py index be7b884..a3475ff 100644 --- a/tests.py +++ b/tests.py @@ -14,8 +14,6 @@ # along with celcatsanitizer. If not, see . from django.test import TestCase -from django.utils import timezone - from .models import Course, Group, Timetable, Year from .utils import tz_now -- cgit v1.2.1 From ff0e5d6388e921ddab2c05cafb27dd662595dee0 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 19 Oct 2017 14:04:41 +0200 Subject: Changement radical du fonctionnement de la regex en vue d’un gros changement de la structure de la base de données --- utils.py | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/utils.py b/utils.py index 28a1ba2..5d55eca 100644 --- a/utils.py +++ b/utils.py @@ -48,32 +48,24 @@ def group_courses(courses): def parse_group(name): # Explication de la regex # - # ^(.+?)\s+((CM(\w))|(TD(\w)(\d))|(TP(\w)(\d)(\d)))?(\s+\(.+\))?$ - # ^ début de la ligne - # (.+?) correspond à au moins un caractère - # \s+ un ou plusieurs espaces - # ((CM(\w))| correspond à CM suivi d'une lettre ou… - # (TD(\w)(\d))| … à TD suivi d’une lettre et d'un chiffre ou… - # (TP(\w)(\d)(\d)) … à TP suivi d’une lettre et de deux chiffres - # )? groupe optionnel - # (\s+ un ou plusieurs espaces - # \(.+\)) un ou plusieurs caractères quelconques entre parenthèses - # ? groupe optionnel - # $ fin de la ligne - group_regex = re.compile(r"^(.+?)\s+((CM(\w))|(TD(\w)(\d))|(TP(\w)(\d)(\d)))?(\s+\(.+\))?$") + # ^(.+?)\s*(s\d\s+)?((CM|TD|TP|G)(\w\d{0,3}))?(\s+\(.+\))?$ + # ^ début de la ligne + # (.+?) correspond à au moins un caractère + # \s* éventuellement un ou plusieurs espaces + # (s\d\s+)? éventuellement un s suivi d’un nombre et d’un ou plusieurs espaces + # ((CM|TD|TP|G) « CM » ou « TD » ou « TP » ou « G » + # (\w\d{0,3}) suivi d’un caractère puis entre 0 et 3 chiffres + # )? groupe optionnel + # (\s+ un ou plusieurs espaces + # \(.+\))? un ou pliseurs caractères entre parenthèses + # $ fin de la ligne + group_regex = re.compile(r"^(.+?)\s*(s\d\s+)?((CM|TD|TP|G)(\w\d{0,3}))?(\s+\(.+\))?$") search = group_regex.search(name) if search is None: - return name, None, None, None + return name, None parts = search.groups() - if parts[1] is None: # Pas de groupe précis indiqué - return parts[0], None, None, None - elif parts[2] is not None: # Groupe de CM - return parts[0], parts[3], None, None - elif parts[4] is not None: # Groupe de TD - return parts[0], parts[5], parts[6], None - elif parts[7] is not None: # Groupe de TP - return parts[0], parts[8], parts[9], parts[10] + return parts[0], parts[4] def tz_now(): """Retourne la date et l’heure avec le bon fuseau horaire""" -- cgit v1.2.1 From 044e7412856aeefa3c82b39130aa8df6582a0826 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 19 Oct 2017 19:04:23 +0200 Subject: Suppressions des champs td, tp et parents --- models.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/models.py b/models.py index fbbf877..bfc026b 100644 --- a/models.py +++ b/models.py @@ -92,11 +92,6 @@ class Group(models.Model): mention = models.CharField(max_length=128) subgroup = models.CharField(max_length=1, verbose_name="sous-groupe", null=True) - td = models.IntegerField(verbose_name="groupe de TD", null=True) - tp = models.IntegerField(verbose_name="groupe de TP", null=True) - parent = models.ForeignKey("self", verbose_name="groupe parent", null=True, - default=None, related_name="children") - slug = models.SlugField(max_length=64, default="") hidden = models.BooleanField(verbose_name="caché", default=False) @@ -110,7 +105,7 @@ class Group(models.Model): @property def group_info(self): - return self.timetable.id, self.mention, self.subgroup, self.td, self.tp + return self.timetable.id, self.mention, self.subgroup def __str__(self): return self.name @@ -120,12 +115,12 @@ class Group(models.Model): self.name = self.celcat_name self.slug = slugify(self.name) - self.mention, self.subgroup, self.td, self.tp = parse_group(self.name) + self.mention, self.subgroup = parse_group(self.name) super(Group, self).save() class Meta: - index_together = ("mention", "subgroup", "td", "tp",) + index_together = ("mention", "subgroup",) unique_together = (("name", "timetable",), ("celcat_name", "timetable",), ("slug", "timetable",),) -- cgit v1.2.1 From 05b8c81e21dbd33680683238ee044d20a9882a04 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 19 Oct 2017 21:38:40 +0200 Subject: Suppression des champs retirés de l’interface d’administration. La longueur du champ sous-groupe est maintenant fixée à 16. --- admin.py | 4 ++-- models.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/admin.py b/admin.py index e17948a..c93b6b3 100644 --- a/admin.py +++ b/admin.py @@ -44,12 +44,12 @@ class TimetableAdmin(admin.ModelAdmin): class GroupAdmin(admin.ModelAdmin): fieldsets = ( (None, {"fields": ("name", "celcat_name", "timetable", "hidden",)}), - ("Groupes", {"fields": ("mention", "subgroup", "td", "tp", "parent",)}),) + ("Groupes", {"fields": ("mention", "subgroup",)}),) list_display = ("name", "timetable", "hidden",) list_editable = ("hidden",) list_filter = ("timetable",) ordering = ("timetable",) - readonly_fields = ("celcat_name", "mention", "subgroup", "td", "tp",) + readonly_fields = ("celcat_name", "mention",) actions = (make_hidden, make_visible,) diff --git a/models.py b/models.py index bfc026b..868cbd1 100644 --- a/models.py +++ b/models.py @@ -90,8 +90,9 @@ class Group(models.Model): verbose_name="emploi du temps") mention = models.CharField(max_length=128) - subgroup = models.CharField(max_length=1, verbose_name="sous-groupe", + subgroup = models.CharField(max_length=16, verbose_name="sous-groupe", null=True) + slug = models.SlugField(max_length=64, default="") hidden = models.BooleanField(verbose_name="caché", default=False) -- cgit v1.2.1 From f033f310ac8331de24a5fc2028ba22978c1d941e Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 19 Oct 2017 21:48:39 +0200 Subject: Adaptation de corresponds_to() et des tests de parsage --- models.py | 11 +++++++---- tests.py | 12 ++++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/models.py b/models.py index 868cbd1..c69bec3 100644 --- a/models.py +++ b/models.py @@ -97,12 +97,15 @@ class Group(models.Model): hidden = models.BooleanField(verbose_name="caché", default=False) - def corresponds_to(self, timetable_id, mention, subgroup, td, tp): + def corresponds_to(self, timetable_id, mention, subgroup): + subgroup_corresponds = True + if self.subgroup is not None and subgroup is not None: + subgroup_corresponds = subgroup.startswith(self.subgroup) or \ + self.subgroup.startswith(subgroup) + return self.timetable.id == timetable_id and \ self.mention.startswith(mention) and \ - (self.subgroup == subgroup or self.subgroup is None) and \ - (self.td == td or self.td is None or td is None) and \ - (self.tp == tp or self.tp is None or tp is None) + subgroup_corresponds @property def group_info(self): diff --git a/tests.py b/tests.py index a3475ff..051c733 100644 --- a/tests.py +++ b/tests.py @@ -128,10 +128,10 @@ class GroupTestCase(TestCase): tdb2 = Group.objects.get(celcat_name="L1 info s2 TDB2", timetable=self.timetable) tpb21 = Group.objects.get(celcat_name="L1 info s2 TPB21", timetable=self.timetable) - self.assertEqual(cma.group_info, (self.timetable.id, "L1 info s2", "A", None, None)) - self.assertEqual(tda2.group_info, (self.timetable.id, "L1 info s2", "A", 2, None)) - self.assertEqual(tpa21.group_info, (self.timetable.id, "L1 info s2", "A", 2, 1)) + self.assertEqual(cma.group_info, (self.timetable.id, "L1 info", "A")) + self.assertEqual(tda2.group_info, (self.timetable.id, "L1 info", "A2")) + self.assertEqual(tpa21.group_info, (self.timetable.id, "L1 info", "A21")) - self.assertEqual(cmb.group_info, (self.timetable.id, "L1 info s2", "B", None, None)) - self.assertEqual(tdb2.group_info, (self.timetable.id, "L1 info s2", "B", 2, None)) - self.assertEqual(tpb21.group_info, (self.timetable.id, "L1 info s2", "B", 2, 1)) + self.assertEqual(cmb.group_info, (self.timetable.id, "L1 info", "B")) + self.assertEqual(tdb2.group_info, (self.timetable.id, "L1 info", "B2")) + self.assertEqual(tpb21.group_info, (self.timetable.id, "L1 info", "B21")) -- cgit v1.2.1 From 5489101669d57c834c65f5a889a6d40ce3bcfb1c Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 19 Oct 2017 22:14:28 +0200 Subject: Changement de la logique de récupération des cours pour un groupe adaptée à la nouvelle structure du modèle Group. --- models.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/models.py b/models.py index c69bec3..fe285ac 100644 --- a/models.py +++ b/models.py @@ -13,6 +13,8 @@ # You should have received a copy of the GNU Affero General Public License # along with celcatsanitizer. If not, see . +from functools import reduce + from django.db import models from django.db.models import Count, Manager, Q from django.db.models.functions import ExtractWeek, ExtractYear @@ -147,17 +149,13 @@ class Room(models.Model): class CourseManager(Manager): def get_courses_for_group(self, group, **criteria): - groups_criteria = [] - if group.subgroup is not None: - groups_criteria.append(Q(groups__subgroup__isnull=True) | \ - Q(groups__subgroup=group.subgroup)) - if group.td is not None: - groups_criteria.append(Q(groups__td__isnull=True) | Q(groups__td=group.td)) - if group.tp is not None: - groups_criteria.append(Q(groups__tp__isnull=True) | Q(groups__tp=group.tp)) + groups_criteria = reduce(lambda x, y: x | y, + [Q(groups__subgroup=group.subgroup[:i]) + for i in range(1, len(group.subgroup))]) | \ + Q(groups__subgroup__isnull=True) return self.get_queryset() \ - .filter(*groups_criteria, + .filter(groups_criteria, groups__mention=group.mention, timetable=group.timetable, **criteria) \ .order_by("begin") -- cgit v1.2.1 From a7f533b2ddedf69a79d7ec68200ece5bedd59b2d Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 19 Oct 2017 22:41:47 +0200 Subject: Suppression de l’étape de consolidation --- management/commands/_private.py | 40 +--------------------------------------- 1 file changed, 1 insertion(+), 39 deletions(-) diff --git a/management/commands/_private.py b/management/commands/_private.py index a9d283d..b663454 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -30,42 +30,6 @@ def add_time(date, time): delta = datetime.timedelta(hours=ptime.hour, minutes=ptime.minute) return date + delta -def consolidate_group(group): - group_content_key = ("mention", "subgroup", "td", "tp") - group_content_list = group.group_info[1:] - - if group.subgroup is not None: - group_content = dict(zip(group_content_key, group_content_list)) - - for i in range(len(group_content_list))[::-1]: - del group_content[group_content_key[i]] - group_content[group_content_key[i] + "__isnull"] = True - - if group_content_list[i] is not None: - break - - group.parent = Group.objects.filter(timetable=group.timetable, - **group_content).first() - group.save() - - if group.tp is None: - group_content = dict(zip(group_content_key, group_content_list)) - last_is_none = False - - for i, key in enumerate(group_content_key): - if group_content_list[i] is None or last_is_none: - del group_content[key] - group_content[key + "__isnull"] = last_is_none - last_is_none = True - - Group.objects.filter(timetable=group.timetable, parent__isnull=True, - **group_content).update(parent=group) - -def consolidate_groups(groups): - for group in groups: - if group.parent is None: - consolidate_group(group) - def delete_courses_in_week(timetable, year, week, today): start, end = get_week(year, week) Course.objects.filter(begin__gte=max(start, today), begin__lt=end, @@ -96,12 +60,10 @@ def get_event(timetable, event, event_week, today): # Création de l’objet cours course = Course.objects.create(timetable=timetable, begin=begin, end=end) - # On récupère les groupes concernés par les cours, on les - # « consolide », puis on les insère dans l’objet cours. + # On récupère les groupes concernés par les cours groups = [get_from_db_or_create(Group, timetable=timetable, celcat_name=item.text) for item in event.resources.group.find_all("item")] - consolidate_groups(groups) course.groups.add(*groups) # On récupère le champ « remarque » -- cgit v1.2.1 From 86efcdcd2df04a59eb5f27212d8d41f60f861f6c Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 19 Oct 2017 22:48:16 +0200 Subject: Adaptation des vues, correction du critère de sélection des groupes --- models.py | 2 +- views.py | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/models.py b/models.py index fe285ac..db9e262 100644 --- a/models.py +++ b/models.py @@ -151,7 +151,7 @@ class CourseManager(Manager): def get_courses_for_group(self, group, **criteria): groups_criteria = reduce(lambda x, y: x | y, [Q(groups__subgroup=group.subgroup[:i]) - for i in range(1, len(group.subgroup))]) | \ + for i in range(1, len(group.subgroup) + 1)]) | \ Q(groups__subgroup__isnull=True) return self.get_queryset() \ diff --git a/views.py b/views.py index 2100972..e5c89a2 100644 --- a/views.py +++ b/views.py @@ -39,13 +39,12 @@ def group_list_common(request, timetable, groups): groups_weeks = Course.objects.get_weeks(begin__gte=start, begin__lt=end, timetable=timetable) \ .values("groups__mention", "groups__subgroup", - "groups__td", "groups__tp", "year", "week") + "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"], group_week["groups__td"], - group_week["groups__tp"]): + group_week["groups__subgroup"]): if not hasattr(group, "weeks"): group.weeks = [] @@ -60,7 +59,7 @@ def group_list_common(request, timetable, 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=timetable).order_by("name") + groups = Group.objects.filter(timetable=timetable).order_by("name") return group_list_common(request, timetable, groups) def timetable(request, year_slug, timetable_slug, group_slug, year=None, week=None): @@ -78,8 +77,8 @@ def timetable(request, year_slug, timetable_slug, group_slug, year=None, week=No 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.children.count(): - return group_list_common(request, timetable, Group.objects.get_relevant_children(group)) + # if group.children.count(): + # return group_list_common(request, timetable, Group.objects.get_relevant_children(group)) courses = Course.objects.get_courses_for_group(group, begin__gte=start, begin__lt=end) if courses.count() == 0 and provided_week: -- cgit v1.2.1 From b7773b892ee68209feb33870496985f78243681a Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 20 Oct 2017 13:29:07 +0200 Subject: Modification de la requête qui sélectionne les groupes pertinents. --- models.py | 21 +++++++++------------ views.py | 9 ++++++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/models.py b/models.py index db9e262..74fab9e 100644 --- a/models.py +++ b/models.py @@ -16,7 +16,8 @@ from functools import reduce from django.db import models -from django.db.models import Count, Manager, Q +from django.db.models import Count, Manager, Q, Subquery +from django.db.models.expressions import OuterRef from django.db.models.functions import ExtractWeek, ExtractYear from django.utils import timezone from django.utils.text import slugify @@ -69,17 +70,13 @@ class Timetable(SlugModel): class GroupManager(Manager): - def get_relevant_children(self, group): - parent_in = self.get_queryset().filter(parent=group) - return self.get_queryset().filter(Q(parent=group) | Q(parent__in=parent_in)) \ - .annotate(children_count=Count("children")) \ - .filter(children_count=0, hidden=False) \ - .order_by("name") - - def get_relevant_groups(self, *args, **criteria): - return self.get_queryset().filter(*args, **criteria) \ - .annotate(children_count=Count("children")) \ - .filter(children_count=0, hidden=False) + def get_relevant_groups(self, timetable, *args, **criteria): + sub = Group.objects.filter(timetable=timetable,mention=OuterRef("mention"), + subgroup__startswith=OuterRef("subgroup")) \ + .order_by().values("mention").annotate(c=Count("*")).values("c") + return Group.objects.filter(*args, timetable=timetable, hidden=False, **criteria) \ + .annotate(nbsub=Subquery(sub, output_field=models.IntegerField())) \ + .filter(nbsub=1).order_by("name") class Group(models.Model): diff --git a/views.py b/views.py index e5c89a2..9c38524 100644 --- a/views.py +++ b/views.py @@ -59,7 +59,7 @@ def group_list_common(request, timetable, 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.filter(timetable=timetable).order_by("name") + 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): @@ -77,8 +77,11 @@ def timetable(request, year_slug, timetable_slug, group_slug, year=None, week=No 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.children.count(): - # return group_list_common(request, timetable, Group.objects.get_relevant_children(group)) + 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: -- cgit v1.2.1 From 12184b16e97d9f5c6c99d6bfe79b1e5c53464fb3 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 20 Oct 2017 17:46:37 +0200 Subject: Ajout d’un calendrier ICS spécifique pour un groupe qui ne prend pas en compte les parents --- feeds.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/feeds.py b/feeds.py index c2c5b14..66be12e 100644 --- a/feeds.py +++ b/feeds.py @@ -87,6 +87,11 @@ class IcalFeed(Feed): "location": format_rooms(item.rooms.all())} +class IcalOnlyOneFeed(IcalFeed): + def items(self, obj): + return Course.objects.filter(groups=obj).order_by("begin") + + class RSSFeed(Feed): def get_object(self, request, year_slug, timetable_slug, group_slug): year, week = get_current_or_next_week() -- cgit v1.2.1 From 827641acd0b2c64feb704bae989b139458a3d0ca Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 27 Oct 2017 09:37:25 +0200 Subject: Fonction pour récupérer les parents d’un groupe --- models.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/models.py b/models.py index 74fab9e..c546737 100644 --- a/models.py +++ b/models.py @@ -70,11 +70,21 @@ class Timetable(SlugModel): class GroupManager(Manager): + def get_parents(self, group): + groups_criteria = Q(subgroup__isnull=True) | \ + reduce(lambda x, y: x | y, + [Q(subgroup=group.subgroup[:i]) + for i in range(1, len(group.subgroup) + 1)]) + + return self.get_queryset().filter(groups_criteria, mention=group.mention, + timetable=group.timetable) + def get_relevant_groups(self, timetable, *args, **criteria): sub = Group.objects.filter(timetable=timetable,mention=OuterRef("mention"), subgroup__startswith=OuterRef("subgroup")) \ .order_by().values("mention").annotate(c=Count("*")).values("c") - return Group.objects.filter(*args, timetable=timetable, hidden=False, **criteria) \ + + return self.get_queryset().filter(*args, timetable=timetable, hidden=False, **criteria) \ .annotate(nbsub=Subquery(sub, output_field=models.IntegerField())) \ .filter(nbsub=1).order_by("name") @@ -146,15 +156,8 @@ class Room(models.Model): class CourseManager(Manager): def get_courses_for_group(self, group, **criteria): - groups_criteria = reduce(lambda x, y: x | y, - [Q(groups__subgroup=group.subgroup[:i]) - for i in range(1, len(group.subgroup) + 1)]) | \ - Q(groups__subgroup__isnull=True) - return self.get_queryset() \ - .filter(groups_criteria, - groups__mention=group.mention, - timetable=group.timetable, **criteria) \ + .filter(groups__in=Group.objects.get_parents(group), **criteria) \ .order_by("begin") def get_weeks(self, **criteria): -- cgit v1.2.1 From df3cb623a79d925e6af048bc88e607094c6b692e Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 27 Oct 2017 09:38:50 +0200 Subject: Ajout de l’url pour avoir un calendrier correspondant seulement à un groupe. --- urls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/urls.py b/urls.py index 58cf019..d269400 100644 --- a/urls.py +++ b/urls.py @@ -23,6 +23,7 @@ urlpatterns = [ url(r"^(?P[-\w]+)/(?P[-\w]+)/$", views.group_list, name="groups"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/$", views.timetable, name="timetable"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendar.ics$", feeds.IcalFeed(), name="ics"), + url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendar-group.ics$", feeds.IcalOnlyOneFeed(), name="ics-group"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/feed.atom$", feeds.AtomFeed(), name="atom"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/feed.rss$", feeds.RSSFeed(), name="rss"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/(?P[0-9]{4})/(?P[0-4]?[0-9]|5[0-3])/$", views.timetable, name="timetable"), -- cgit v1.2.1 From 7ef57a0226fa25b8ea5e9a6ff5526889dc300649 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 27 Oct 2017 21:51:12 +0200 Subject: Ajout d’une page pour lister les calendriers disponibles --- templates/index.html | 6 +++--- urls.py | 1 + views.py | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/templates/index.html b/templates/index.html index 005fd5b..c47a0be 100644 --- a/templates/index.html +++ b/templates/index.html @@ -4,7 +4,7 @@ {% block head %}{% endblock %} - {% block title %}{% if year %}{{ year }} – {% endif %}{% endblock %}celcatsanitizer + {% block title %}{% if year %}{{ year }}{% elif group %}{{ group }}{% endif %}{% if year or group %} – {% endif %}{% endblock %}celcatsanitizer @@ -13,10 +13,10 @@
{% block body %} -

{% if year %}{{ year }} – Choisissez votre mention{% else %}Choisissez votre année{% endif %}

+

{% if year %}{{ year }} – Choisissez votre mention{% elif group %}Calendriers disponibles pour le groupe {{ group }}{% else %}Choisissez votre année{% endif %}

    {% for element in elements %} -
  • {{ element }}
  • +
  • {{ element }}
  • {% empty %}

    Aucun emploi du temps à afficher

    {% endfor %} diff --git a/urls.py b/urls.py index d269400..b30e8d9 100644 --- a/urls.py +++ b/urls.py @@ -22,6 +22,7 @@ urlpatterns = [ url(r"^(?P[-\w]+)/$", views.mention_list, name="mentions"), url(r"^(?P[-\w]+)/(?P[-\w]+)/$", views.group_list, name="groups"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/$", views.timetable, name="timetable"), + url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendars$", views.calendar_list, name="calendar-list"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendar.ics$", feeds.IcalFeed(), name="ics"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendar-group.ics$", feeds.IcalOnlyOneFeed(), name="ics-group"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/feed.atom$", feeds.AtomFeed(), name="atom"), diff --git a/views.py b/views.py index 9c38524..76b7127 100644 --- a/views.py +++ b/views.py @@ -17,6 +17,7 @@ import datetime from django.conf import settings 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 @@ -95,5 +96,19 @@ def timetable(request, year_slug, timetable_slug, group_slug, year=None, week=No "year": year, "week": int(week), "is_old_timetable": is_old_timetable}) +def calendar_list(request, year_slug, timetable_slug, group_slug): + """Affiche une liste des ICS disponibles pour un groupe.""" + # On commence par récupérer l’emploi du temps associé, puis le groupe + # Si la récupération de l’un d’entre eux échoue, on affiche une erreur 404. + timetable = get_object_or_404(Timetable, year__slug=year_slug, slug=timetable_slug) + group = get_object_or_404(Group, slug=group_slug, timetable=timetable) + + # On récupère les groupes « parents » au groupe spécifié. + groups = Group.objects.get_parents(group).annotate(length=Length("subgroup")) \ + .order_by("length") + + # On réutilise encore la template principale + return render(request, "index.html", {"group": group, "elements": groups}) + def contact(request): return render(request, "contact.html", {"email": settings.ADMINS[0][1]}) -- cgit v1.2.1 From 7b66e90a4ff559323bd0664b88e0cdefa0f38322 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 27 Oct 2017 21:56:04 +0200 Subject: Ajout d’un lien pour aller sur la liste des ICS séparés --- templates/timetable.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/timetable.html b/templates/timetable.html index e4dffe7..b009174 100644 --- a/templates/timetable.html +++ b/templates/timetable.html @@ -18,4 +18,4 @@ {% if last_update %}Dernière mise à jour le {{ last_update|date:"l j F o" }} à {{ last_update|date:"H:i" }}{% endif %}

    {% include "timetable_common.html" %} - {% endblock %} + {% endblock %} -- cgit v1.2.1 From f0790a2420684a39e2b48922beec1245f4446912 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 29 Oct 2017 15:17:03 +0100 Subject: Revert "Ajout d’une page pour lister les calendriers disponibles" This reverts commit 7ef57a0226fa25b8ea5e9a6ff5526889dc300649. --- templates/index.html | 6 +++--- urls.py | 1 - views.py | 15 --------------- 3 files changed, 3 insertions(+), 19 deletions(-) diff --git a/templates/index.html b/templates/index.html index c47a0be..005fd5b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -4,7 +4,7 @@ {% block head %}{% endblock %} - {% block title %}{% if year %}{{ year }}{% elif group %}{{ group }}{% endif %}{% if year or group %} – {% endif %}{% endblock %}celcatsanitizer + {% block title %}{% if year %}{{ year }} – {% endif %}{% endblock %}celcatsanitizer @@ -13,10 +13,10 @@
    {% block body %} -

    {% if year %}{{ year }} – Choisissez votre mention{% elif group %}Calendriers disponibles pour le groupe {{ group }}{% else %}Choisissez votre année{% endif %}

    +

    {% if year %}{{ year }} – Choisissez votre mention{% else %}Choisissez votre année{% endif %}

      {% for element in elements %} -
    • {{ element }}
    • +
    • {{ element }}
    • {% empty %}

      Aucun emploi du temps à afficher

      {% endfor %} diff --git a/urls.py b/urls.py index b30e8d9..d269400 100644 --- a/urls.py +++ b/urls.py @@ -22,7 +22,6 @@ urlpatterns = [ url(r"^(?P[-\w]+)/$", views.mention_list, name="mentions"), url(r"^(?P[-\w]+)/(?P[-\w]+)/$", views.group_list, name="groups"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/$", views.timetable, name="timetable"), - url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendars$", views.calendar_list, name="calendar-list"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendar.ics$", feeds.IcalFeed(), name="ics"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendar-group.ics$", feeds.IcalOnlyOneFeed(), name="ics-group"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/feed.atom$", feeds.AtomFeed(), name="atom"), diff --git a/views.py b/views.py index 76b7127..9c38524 100644 --- a/views.py +++ b/views.py @@ -17,7 +17,6 @@ import datetime from django.conf import settings 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 @@ -96,19 +95,5 @@ def timetable(request, year_slug, timetable_slug, group_slug, year=None, week=No "year": year, "week": int(week), "is_old_timetable": is_old_timetable}) -def calendar_list(request, year_slug, timetable_slug, group_slug): - """Affiche une liste des ICS disponibles pour un groupe.""" - # On commence par récupérer l’emploi du temps associé, puis le groupe - # Si la récupération de l’un d’entre eux échoue, on affiche une erreur 404. - timetable = get_object_or_404(Timetable, year__slug=year_slug, slug=timetable_slug) - group = get_object_or_404(Group, slug=group_slug, timetable=timetable) - - # On récupère les groupes « parents » au groupe spécifié. - groups = Group.objects.get_parents(group).annotate(length=Length("subgroup")) \ - .order_by("length") - - # On réutilise encore la template principale - return render(request, "index.html", {"group": group, "elements": groups}) - def contact(request): return render(request, "contact.html", {"email": settings.ADMINS[0][1]}) -- cgit v1.2.1 From c80a41ffafe3065f35f07b71063b5596d33d0ff2 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 29 Oct 2017 15:37:43 +0100 Subject: Déplacement de tous les liens vers les ICS dans une page spéciale --- templates/calendars.html | 13 +++++++++++++ templates/timetable.html | 2 +- urls.py | 1 + views.py | 9 +++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 templates/calendars.html diff --git a/templates/calendars.html b/templates/calendars.html new file mode 100644 index 0000000..70f3dac --- /dev/null +++ b/templates/calendars.html @@ -0,0 +1,13 @@ +{% extends "index.html" %} + +{% block title %}Calendriers disponibles pour le groupe {{ group }} – {% endblock %} + +{% block body %} +

      Calendriers disponibles pour le groupe {{ group }}

      + +{% endblock %} diff --git a/templates/timetable.html b/templates/timetable.html index b009174..fc2065f 100644 --- a/templates/timetable.html +++ b/templates/timetable.html @@ -18,4 +18,4 @@ {% if last_update %}Dernière mise à jour le {{ last_update|date:"l j F o" }} à {{ last_update|date:"H:i" }}{% endif %}

      {% include "timetable_common.html" %} - {% endblock %} + {% endblock %} diff --git a/urls.py b/urls.py index d269400..c84ac75 100644 --- a/urls.py +++ b/urls.py @@ -22,6 +22,7 @@ urlpatterns = [ url(r"^(?P[-\w]+)/$", views.mention_list, name="mentions"), url(r"^(?P[-\w]+)/(?P[-\w]+)/$", views.group_list, name="groups"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/$", views.timetable, name="timetable"), + url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendars", views.calendars, name="calendars"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendar.ics$", feeds.IcalFeed(), name="ics"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/calendar-group.ics$", feeds.IcalOnlyOneFeed(), name="ics-group"), url(r"^(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/feed.atom$", feeds.AtomFeed(), name="atom"), diff --git a/views.py b/views.py index 9c38524..7c19840 100644 --- a/views.py +++ b/views.py @@ -17,6 +17,7 @@ import datetime from django.conf import settings 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 @@ -95,5 +96,13 @@ def timetable(request, year_slug, timetable_slug, group_slug, year=None, week=No "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 contact(request): return render(request, "contact.html", {"email": settings.ADMINS[0][1]}) -- cgit v1.2.1 From 5082e2aa0083a1c78cd39e86cb141786c2ab6efe Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 29 Oct 2017 15:41:40 +0100 Subject: Changement des texte de la page des calendriers --- templates/calendars.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/calendars.html b/templates/calendars.html index 70f3dac..d97ea78 100644 --- a/templates/calendars.html +++ b/templates/calendars.html @@ -1,13 +1,13 @@ {% extends "index.html" %} -{% block title %}Calendriers disponibles pour le groupe {{ group }} – {% endblock %} +{% block title %}ICS disponibles pour le groupe {{ group }} – {% endblock %} {% block body %} -

      Calendriers disponibles pour le groupe {{ group }}

      +

      ICS disponibles pour le groupe {{ group }}

      {% endblock %} -- cgit v1.2.1