From 8e2138793d147a832d53a829815bdae7292fb088 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Tue, 7 Nov 2017 19:41:48 +0100 Subject: Un sous-groupe nul fait crasher la page des emplois du temps car la requête pour savoir si il y a des sous-groupes ne marche pas avec une chaîne de caractère commençant par None. Suppression de la possibilité d’avoir un sous-groupe nul, valeur par défaut à "". --- models.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 3af1c06..0804a38 100644 --- a/models.py +++ b/models.py @@ -71,7 +71,7 @@ class Timetable(SlugModel): class GroupManager(Manager): def get_parents(self, group): - groups_criteria = Q(subgroup__isnull=True) | Q(subgroup__startswith=group.subgroup) | \ + groups_criteria = Q(subgroup="") | Q(subgroup__startswith=group.subgroup) | \ reduce(lambda x, y: x | y, [Q(subgroup=group.subgroup[:i]) for i in range(1, len(group.subgroup) + 1)]) @@ -99,8 +99,7 @@ class Group(models.Model): verbose_name="emploi du temps") mention = models.CharField(max_length=128) - subgroup = models.CharField(max_length=16, verbose_name="sous-groupe", - null=True) + subgroup = models.CharField(max_length=16, verbose_name="sous-groupe", default="") slug = models.SlugField(max_length=64, default="") @@ -129,6 +128,9 @@ class Group(models.Model): self.slug = slugify(self.name) self.mention, self.subgroup = parse_group(self.name) + if self.subgroup is None: + self.subgroup = "" + super(Group, self).save() -- cgit v1.2.1 From 0c2937bab77280beaabe7d53a77c848848845950 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 16 Nov 2017 11:20:59 +0100 Subject: Par défaut, la date de dernière mise à jour des emplois du temps est la date actuelle --- models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index 0804a38..b9f1ba7 100644 --- a/models.py +++ b/models.py @@ -57,7 +57,8 @@ class Timetable(SlugModel): url = models.URLField(max_length=255, verbose_name="URL") slug = models.SlugField(max_length=64, default="") - last_update_date = models.DateTimeField(verbose_name="dernière mise à jour Celcat", null=True) + last_update_date = models.DateTimeField(verbose_name="dernière mise à jour Celcat", + null=True, default=timezone.now) def __str__(self): return self.year.name + " " + self.name -- cgit v1.2.1 From 4fdb7f6263d6463ac2099c383b1221789d28e42e Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 16 Nov 2017 13:34:30 +0100 Subject: Correction des erreurs lorsqu’un groupe n’a pas de sous-groupe --- models.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index b9f1ba7..a90e9da 100644 --- a/models.py +++ b/models.py @@ -72,10 +72,12 @@ class Timetable(SlugModel): class GroupManager(Manager): def get_parents(self, group): - groups_criteria = Q(subgroup="") | Q(subgroup__startswith=group.subgroup) | \ - reduce(lambda x, y: x | y, - [Q(subgroup=group.subgroup[:i]) - for i in range(1, len(group.subgroup) + 1)]) + groups_criteria = Q(subgroup="") | Q(subgroup__startswith=group.subgroup) + + if len(group.subgroup) != 0: + groups_criteria |= 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) -- cgit v1.2.1 From cc64acb64af30771c523a1e0794f0976df14769b Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 16 Nov 2017 14:14:06 +0100 Subject: Correction d’une erreur de parenthésage dans get_parents() Le + 1 doit venir _après_ len(), pas pendant… --- models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index a90e9da..4b86961 100644 --- a/models.py +++ b/models.py @@ -77,7 +77,7 @@ class GroupManager(Manager): if len(group.subgroup) != 0: groups_criteria |= reduce(lambda x, y: x | y, [Q(subgroup=group.subgroup[:i]) - for i in range(1, len(group.subgroup + 1))]) + for i in range(1, len(group.subgroup) + 1)]) return self.get_queryset().filter(groups_criteria, mention=group.mention, timetable=group.timetable) -- cgit v1.2.1 From 9262be98897f29e52f489e3353cb752d9b9d8129 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 16 Nov 2017 14:35:19 +0100 Subject: Revert "Par défaut, la date de dernière mise à jour des emplois du temps est" This reverts commit 0c2937bab77280beaabe7d53a77c848848845950. --- models.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 4b86961..db81d5b 100644 --- a/models.py +++ b/models.py @@ -57,8 +57,7 @@ class Timetable(SlugModel): url = models.URLField(max_length=255, verbose_name="URL") slug = models.SlugField(max_length=64, default="") - last_update_date = models.DateTimeField(verbose_name="dernière mise à jour Celcat", - null=True, default=timezone.now) + last_update_date = models.DateTimeField(verbose_name="dernière mise à jour Celcat", null=True) def __str__(self): return self.year.name + " " + self.name -- cgit v1.2.1 From 98d62baa698a69b031f28a27efc76a47b7456c8a Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 16 Nov 2017 14:38:24 +0100 Subject: Mettre une valeur de dernière mise à jour dans l’interface d’administration n’est plus obligatoire. --- models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index db81d5b..6d06793 100644 --- a/models.py +++ b/models.py @@ -57,7 +57,8 @@ class Timetable(SlugModel): url = models.URLField(max_length=255, verbose_name="URL") slug = models.SlugField(max_length=64, default="") - last_update_date = models.DateTimeField(verbose_name="dernière mise à jour Celcat", null=True) + last_update_date = models.DateTimeField(verbose_name="dernière mise à jour Celcat", + null=True, blank=True) def __str__(self): return self.year.name + " " + self.name -- cgit v1.2.1 From ffffa1cef4e0c2f1e617dc74a57c5045325e57aa Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 24 Nov 2017 19:28:35 +0100 Subject: Correction d’un bogue qui empêchait l’affichage des groupes si deux groupes ont le même nom mais pas le même semestre. --- models.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 6d06793..4c3f3c3 100644 --- a/models.py +++ b/models.py @@ -83,9 +83,10 @@ class GroupManager(Manager): timetable=group.timetable) def get_relevant_groups(self, timetable, *args, **criteria): - sub = self.get_queryset().filter(timetable=timetable, mention=OuterRef("mention"), - subgroup__startswith=OuterRef("subgroup")) \ - .order_by().values("mention").annotate(c=Count("*")).values("c") + sub = self.get_queryset().filter(timetable=timetable, + mention__startswith=OuterRef("mention"), + subgroup__startswith=OuterRef("subgroup")) \ + .order_by().values("mention").annotate(c=Count("*")).values("c") return self.get_queryset().filter(*args, timetable=timetable, hidden=False, **criteria) \ .annotate(nbsub=Subquery(sub, output_field=models.IntegerField())) \ -- cgit v1.2.1 From b28630da06a6c1286d5cd34d6437d8dd19d6f298 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 24 Nov 2017 20:02:21 +0100 Subject: Ajout de nouveaux tests pour ces nouveaux cas --- models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index 4c3f3c3..14270cf 100644 --- a/models.py +++ b/models.py @@ -116,7 +116,8 @@ class Group(models.Model): self.subgroup.startswith(subgroup) return self.timetable.id == timetable_id and \ - self.mention.startswith(mention) and \ + (self.mention.startswith(mention) or \ + mention.startswith(self.mention)) and \ subgroup_corresponds @property -- cgit v1.2.1 From adad24ace9ab47f12d43dca494b358544beefa00 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 24 Nov 2017 23:43:53 +0100 Subject: Correction d’un crash lorsqu’un groupe a des enfants ayant une mention différente. L’annotation Count() renvoie plusieurs valeurs différentes, alors que Subquery n’en accepte qu’une seule. Corrigé en rajoutant une valeur statique (0) par annotation et en regroupant en se basant sur cette valeur. --- models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 14270cf..40406e3 100644 --- a/models.py +++ b/models.py @@ -16,7 +16,7 @@ from functools import reduce from django.db import models -from django.db.models import Count, Manager, Q, Subquery +from django.db.models import Count, Manager, Q, Subquery, Value from django.db.models.expressions import OuterRef from django.db.models.functions import ExtractWeek, ExtractYear from django.utils import timezone @@ -86,7 +86,8 @@ class GroupManager(Manager): sub = self.get_queryset().filter(timetable=timetable, mention__startswith=OuterRef("mention"), subgroup__startswith=OuterRef("subgroup")) \ - .order_by().values("mention").annotate(c=Count("*")).values("c") + .annotate(v=Value(0)).values("v") \ + .annotate(c=Count("v")).values("c") # fuck Count() return self.get_queryset().filter(*args, timetable=timetable, hidden=False, **criteria) \ .annotate(nbsub=Subquery(sub, output_field=models.IntegerField())) \ -- cgit v1.2.1 From b99dbd566fba7f3c18d3832edeb8e019abcc8c87 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sat, 25 Nov 2017 13:25:51 +0100 Subject: Ne sélectionne plus les sous-groupes --- models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index 40406e3..40849c6 100644 --- a/models.py +++ b/models.py @@ -72,7 +72,7 @@ class Timetable(SlugModel): class GroupManager(Manager): def get_parents(self, group): - groups_criteria = Q(subgroup="") | Q(subgroup__startswith=group.subgroup) + groups_criteria = Q(subgroup="") if len(group.subgroup) != 0: groups_criteria |= reduce(lambda x, y: x | y, -- cgit v1.2.1 From 7f146b306760e1a70e8e1a79d58fc967d05fe194 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sat, 25 Nov 2017 13:30:42 +0100 Subject: Suppression de get_relevant_groups --- models.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 40849c6..9838377 100644 --- a/models.py +++ b/models.py @@ -16,8 +16,7 @@ from functools import reduce from django.db import models -from django.db.models import Count, Manager, Q, Subquery, Value -from django.db.models.expressions import OuterRef +from django.db.models import Count, Manager, Q from django.db.models.functions import ExtractWeek, ExtractYear from django.utils import timezone from django.utils.text import slugify @@ -82,17 +81,6 @@ class GroupManager(Manager): return self.get_queryset().filter(groups_criteria, mention=group.mention, timetable=group.timetable) - def get_relevant_groups(self, timetable, *args, **criteria): - sub = self.get_queryset().filter(timetable=timetable, - mention__startswith=OuterRef("mention"), - subgroup__startswith=OuterRef("subgroup")) \ - .annotate(v=Value(0)).values("v") \ - .annotate(c=Count("v")).values("c") # fuck Count() - - return self.get_queryset().filter(*args, timetable=timetable, hidden=False, **criteria) \ - .annotate(nbsub=Subquery(sub, output_field=models.IntegerField())) \ - .filter(Q(nbsub=1) | Q(nbsub__isnull=True)).order_by("name") - class Group(models.Model): objects = GroupManager() -- cgit v1.2.1 From d9e0cba8c24978150e66b9ccd7ea67aa50a5f22d Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sat, 25 Nov 2017 14:01:54 +0100 Subject: Un groupe parent ne correspond plus à un groupe enfant Modification des tests --- models.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 9838377..bde27a7 100644 --- a/models.py +++ b/models.py @@ -101,8 +101,7 @@ class Group(models.Model): 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) + subgroup_corresponds = self.subgroup.startswith(subgroup) return self.timetable.id == timetable_id and \ (self.mention.startswith(mention) or \ -- cgit v1.2.1 From 621f5d7f0d28f7252e1ff0c0f1286824fa55c33e Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sat, 25 Nov 2017 14:22:03 +0100 Subject: On ne compare plus les id des emplois du temps dans corresponds_to() car dans le seul appel « utile », les arguments passés font forcément partie du même edt. Changement effectué pour des questions de performance. Correction des tests. --- models.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index bde27a7..59301e0 100644 --- a/models.py +++ b/models.py @@ -98,19 +98,18 @@ class Group(models.Model): hidden = models.BooleanField(verbose_name="caché", default=False) - def corresponds_to(self, timetable_id, mention, subgroup): + def corresponds_to(self, mention, subgroup): subgroup_corresponds = True if self.subgroup is not None and subgroup is not None: subgroup_corresponds = self.subgroup.startswith(subgroup) - return self.timetable.id == timetable_id and \ - (self.mention.startswith(mention) or \ - mention.startswith(self.mention)) and \ - subgroup_corresponds + return (self.mention.startswith(mention) or \ + mention.startswith(self.mention)) and \ + subgroup_corresponds @property def group_info(self): - return self.timetable.id, self.mention, self.subgroup + return self.mention, self.subgroup def __str__(self): return self.name -- cgit v1.2.1 From f333d363a78821ebab78fb9bb900d7aefbf6079c Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sat, 25 Nov 2017 15:14:52 +0100 Subject: Dans get_weeks(), l’annotation Count() ne sert à rien. --- models.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 59301e0..cd19259 100644 --- a/models.py +++ b/models.py @@ -158,9 +158,10 @@ class CourseManager(Manager): return self.get_queryset() \ .filter(**criteria) \ .order_by("groups__name", "year", "week") \ - .annotate(_=Count(("groups", "year", "week", "begin")), - year=ExtractYear("begin"), - week=ExtractWeek("begin")) + .annotate(year=ExtractYear("begin"), + week=ExtractWeek("begin")) \ + .values("groups__mention", + "groups__subgroup", "year", "week") class Course(models.Model): -- cgit v1.2.1 From 34ba9c926cfd0725ebd2905e9c71823fd272dad2 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 26 Nov 2017 13:27:40 +0100 Subject: Optimisation de deux requêtes : – sélection des cours d’un groupe : préchargement des salles – sélection des emplois du temps d’une année : préchargement de l’année --- models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index cd19259..b260275 100644 --- a/models.py +++ b/models.py @@ -152,7 +152,7 @@ class CourseManager(Manager): def get_courses_for_group(self, group, **criteria): return self.get_queryset() \ .filter(groups__in=Group.objects.get_parents(group), **criteria) \ - .order_by("begin") + .order_by("begin").prefetch_related("rooms") def get_weeks(self, **criteria): return self.get_queryset() \ -- cgit v1.2.1 From f8c7775aac4a7eb2a4430d1aabb20b7f29939af7 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 26 Nov 2017 13:53:10 +0100 Subject: Ajout d’un nouveau champ de groupe : le semestre --- models.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index b260275..abb00bf 100644 --- a/models.py +++ b/models.py @@ -78,7 +78,9 @@ class GroupManager(Manager): [Q(subgroup=group.subgroup[:i]) for i in range(1, len(group.subgroup) + 1)]) - return self.get_queryset().filter(groups_criteria, mention=group.mention, + return self.get_queryset().filter(groups_criteria, + Q(semester=None) | Q(semester=group.semester), + mention=group.mention, timetable=group.timetable) @@ -92,6 +94,7 @@ class Group(models.Model): verbose_name="emploi du temps") mention = models.CharField(max_length=128) + semester = models.IntegerField(verbose_name="semestre", null=True) subgroup = models.CharField(max_length=16, verbose_name="sous-groupe", default="") slug = models.SlugField(max_length=64, default="") @@ -103,6 +106,7 @@ class Group(models.Model): if self.subgroup is not None and subgroup is not None: subgroup_corresponds = self.subgroup.startswith(subgroup) + # TODO adapter pour semester return (self.mention.startswith(mention) or \ mention.startswith(self.mention)) and \ subgroup_corresponds @@ -119,7 +123,7 @@ class Group(models.Model): self.name = self.celcat_name self.slug = slugify(self.name) - self.mention, self.subgroup = parse_group(self.name) + self.mention, self.semester, self.subgroup = parse_group(self.name) if self.subgroup is None: self.subgroup = "" @@ -127,7 +131,7 @@ class Group(models.Model): class Meta: - index_together = ("mention", "subgroup",) + index_together = ("mention", "semester", "subgroup",) unique_together = (("name", "timetable",), ("celcat_name", "timetable",), ("slug", "timetable",),) -- cgit v1.2.1 From 2aacb6e59e40c9d47d02719dc7b5541a36b3c9ed Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 26 Nov 2017 14:08:11 +0100 Subject: Correction d’un cas pouvant provoquer une erreur de parsage de groupe (si jamais il n’y a pas de semestre), renvoi du numéro de semestre dans group_info, adaptation de corresponds_to. --- models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index abb00bf..fb0e757 100644 --- a/models.py +++ b/models.py @@ -101,7 +101,7 @@ class Group(models.Model): hidden = models.BooleanField(verbose_name="caché", default=False) - def corresponds_to(self, mention, subgroup): + def corresponds_to(self, mention, semester, subgroup): subgroup_corresponds = True if self.subgroup is not None and subgroup is not None: subgroup_corresponds = self.subgroup.startswith(subgroup) @@ -109,11 +109,12 @@ class Group(models.Model): # TODO adapter pour semester return (self.mention.startswith(mention) or \ mention.startswith(self.mention)) and \ + (self.semester == semester or semester is None) and \ subgroup_corresponds @property def group_info(self): - return self.mention, self.subgroup + return self.mention, self.semester, self.subgroup def __str__(self): return self.name -- cgit v1.2.1 From 574bc0efb1061cd1c1fd747ba13f6f7ac14a3e51 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 26 Nov 2017 14:09:49 +0100 Subject: Suppression des commentaires inutiles --- models.py | 1 - 1 file changed, 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index fb0e757..0904b63 100644 --- a/models.py +++ b/models.py @@ -106,7 +106,6 @@ class Group(models.Model): if self.subgroup is not None and subgroup is not None: subgroup_corresponds = self.subgroup.startswith(subgroup) - # TODO adapter pour semester return (self.mention.startswith(mention) or \ mention.startswith(self.mention)) and \ (self.semester == semester or semester is None) and \ -- cgit v1.2.1 From ef6f5e8517436b804265880b71a2ee88f9f5c179 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 26 Nov 2017 14:22:13 +0100 Subject: Récupération du semestre pour générer la liste des groupes. --- models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index 0904b63..25ddd1b 100644 --- a/models.py +++ b/models.py @@ -164,7 +164,7 @@ class CourseManager(Manager): .order_by("groups__name", "year", "week") \ .annotate(year=ExtractYear("begin"), week=ExtractWeek("begin")) \ - .values("groups__mention", + .values("groups__mention", "groups__semester", "groups__subgroup", "year", "week") -- cgit v1.2.1