From b0154d43011825731b0e4ff7c4f44b7f5770b3c2 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 26 Mar 2017 14:23:44 +0200 Subject: Modification de la regex de validation de groupe pour gérer globalement les licences entières Modification de la méthode de correspondance des groupes --- models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 478b48f..32a5903 100644 --- a/models.py +++ b/models.py @@ -66,14 +66,14 @@ class Group(models.Model): timetable = models.ForeignKey(Timetable, on_delete=models.CASCADE, verbose_name="emploi du temps") mention = models.CharField(max_length=32) - subgroup = models.CharField(max_length=1, verbose_name="sous-groupe") + 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) slug = models.SlugField(max_length=64, default="") def corresponds_to(self, timetable_id, mention, subgroup, td, tp): - return self.timetable.id == timetable_id and self.mention == mention and self.subgroup == subgroup 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) + 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) @property def group_info(self): -- cgit v1.2.1 From b3a9ed0743f0db3ba65973769ea981bb50c64482 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 26 Mar 2017 18:17:33 +0200 Subject: Le sous-groupe peut être nul --- models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index 32a5903..b047b44 100644 --- a/models.py +++ b/models.py @@ -133,7 +133,7 @@ class Room(models.Model): class CourseManager(Manager): def get_courses_for_group(self, group, **filters): - return self.get_queryset().filter(Q(groups__td__isnull=True) | Q(groups__td=group.td), Q(groups__tp__isnull=True) | Q(groups__tp=group.tp), groups__mention=group.mention, groups__subgroup=group.subgroup, timetable=group.timetable, **filters).order_by("begin") + return self.get_queryset().filter(Q(groups__td__isnull=True) | Q(groups__td=group.td), Q(groups__tp__isnull=True) | Q(groups__tp=group.tp), Q(groups__subgroup__isnull=True) | Q(groups__subgroup=group.subgroup), groups__mention=group.mention, timetable=group.timetable, **filters).order_by("begin") def get_weeks(self, **criteria): qs = self.get_queryset().filter(**criteria).order_by("groups__name", "year", "week").annotate(_=Count(("groups", "year", "week", "begin")), year=ExtractYear("begin")) -- cgit v1.2.1 From f413b2382baca5c1cb3a219afa02867bd0348b03 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 26 Mar 2017 18:24:01 +0200 Subject: En enregistrant les modèles c'est mieux --- models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index b047b44..975631c 100644 --- a/models.py +++ b/models.py @@ -87,7 +87,7 @@ class Group(models.Model): if self.name == "": self.name = self.celcat_name self.slug = slugify(self.name) - super(Group, self).save() + super(Group, self).save() class Meta: -- cgit v1.2.1 From 7a470357a430a61fd61e5601fd2dde37f13bc646 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 26 Mar 2017 18:26:34 +0200 Subject: Les parties du groupe sont déduites du nom "réel" et non plus du nom dans celcat --- models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index 975631c..3e48622 100644 --- a/models.py +++ b/models.py @@ -83,10 +83,11 @@ class Group(models.Model): return self.name def save(self, *args, **kwargs): - self.mention, self.subgroup, self.td, self.tp = parse_group(self.celcat_name) if self.name == "": self.name = self.celcat_name self.slug = slugify(self.name) + + self.mention, self.subgroup, self.td, self.tp = parse_group(self.name) super(Group, self).save() -- cgit v1.2.1 From 21b0f53454e60c672f501389f225bb76d062e33c Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Wed, 5 Apr 2017 14:54:17 +0200 Subject: Django 1.11 est la version minimale requise. Suppression de la classe ExtractWeek maison en faveur de celle fournie par Django 1.11. Modification de la requête de récupération des semaines pour effacer le code spécifique à PostgreSQL et SQLite. Mise à jour du README pour refléter ces changements --- models.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 3e48622..876160b 100644 --- a/models.py +++ b/models.py @@ -17,7 +17,7 @@ from django.db import connection, models from django.db.models import Count, Manager, Q from django.db.models.expressions import RawSQL -from django.db.models.functions import Extract, ExtractYear +from django.db.models.functions import ExtractWeek, ExtractYear from django.utils.text import slugify from .utils import parse_group @@ -26,10 +26,6 @@ import hashlib import os -class ExtractWeek(Extract): - lookup_name = "week" - - class Timetable(models.Model): name = models.CharField(max_length=64, unique=True, verbose_name="nom") url = models.URLField(max_length=255, unique=True, verbose_name="URL") @@ -137,12 +133,7 @@ class CourseManager(Manager): return self.get_queryset().filter(Q(groups__td__isnull=True) | Q(groups__td=group.td), Q(groups__tp__isnull=True) | Q(groups__tp=group.tp), Q(groups__subgroup__isnull=True) | Q(groups__subgroup=group.subgroup), groups__mention=group.mention, timetable=group.timetable, **filters).order_by("begin") def get_weeks(self, **criteria): - qs = self.get_queryset().filter(**criteria).order_by("groups__name", "year", "week").annotate(_=Count(("groups", "year", "week", "begin")), year=ExtractYear("begin")) - - if connection.vendor == "postgresql": - return qs.annotate(week=ExtractWeek("begin")) - else: - return qs.annotate(week=RawSQL("""cast(strftime("%%W", "begin") as integer)""", [])) + return self.get_queryset().filter(**criteria).order_by("groups__name", "year", "week").annotate(_=Count(("groups", "year", "week", "begin")), year=ExtractYear("begin"), week=ExtractWeek("begin")) class Course(models.Model): -- cgit v1.2.1 From a6c5bfa4796081747e04ae4047007d5c8ad23164 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Mon, 4 Sep 2017 18:35:26 +0200 Subject: Ajout d’un champ « groupe parent » au modèle Group pour n’afficher que les groupes qui n’ont pas d’enfants. Par exemple, le groupe TPA21 aura comme parent le groupe TDA2, qui aura le groupe CMA comme parent. Pour l’instant, le parseur d’emploi du temps ne créée pas de telles relations. --- models.py | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'models.py') diff --git a/models.py b/models.py index 876160b..53bcef7 100644 --- a/models.py +++ b/models.py @@ -56,7 +56,14 @@ class LastUpdate(models.Model): verbose_name_plural = "dernières mises à jour" +class GroupManager(Manager): + def get_relevant_groups(self): + return self.get_queryset().annotate(children_count=Count("children")).filter(children_count=0) + + class Group(models.Model): + objects = GroupManager() + name = models.CharField(max_length=255, verbose_name="nom") celcat_name = models.CharField(max_length=255, verbose_name="nom dans Celcat") timetable = models.ForeignKey(Timetable, on_delete=models.CASCADE, verbose_name="emploi du temps") @@ -65,6 +72,7 @@ class Group(models.Model): 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_group = models.ForeignKey("self", verbose_name="groupe parent", null=True, default=None, related_name="children") slug = models.SlugField(max_length=64, default="") -- cgit v1.2.1 From 6302ee0f04702c21101f07377b5f2484a165cf16 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Mon, 4 Sep 2017 19:36:16 +0200 Subject: On retrouve le parent d’un groupe lorsqu’on l’enregistre --- models.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'models.py') diff --git a/models.py b/models.py index 53bcef7..1843a9f 100644 --- a/models.py +++ b/models.py @@ -92,6 +92,18 @@ class Group(models.Model): self.slug = slugify(self.name) self.mention, self.subgroup, self.td, self.tp = parse_group(self.name) + + group_content_list = [self.mention, self.subgroup, self.td, self.tp] + group_content_keys = ("mention", "subgroup", "td", "tp") + for i in range(len(group_content_list))[::-1]: + if group_content_list[i] is not None: + group_content_list[i] = None + break + + if group_content_list[1] is not None: + group_content = dict(zip(group_content_keys, group_content_list)) + self.parent_group_id = Group.objects.filter(**group_content).first().id + super(Group, self).save() -- cgit v1.2.1 From 8526c4588d88e98f59611771dbc0ca34c1b66d66 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Mon, 4 Sep 2017 21:43:40 +0200 Subject: Rennomage de parent_group en parent. --- models.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) (limited to 'models.py') diff --git a/models.py b/models.py index 1843a9f..3d4fdda 100644 --- a/models.py +++ b/models.py @@ -72,7 +72,7 @@ class Group(models.Model): 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_group = models.ForeignKey("self", verbose_name="groupe parent", null=True, default=None, related_name="children") + parent = models.ForeignKey("self", verbose_name="groupe parent", null=True, default=None, related_name="children") slug = models.SlugField(max_length=64, default="") @@ -92,18 +92,6 @@ class Group(models.Model): self.slug = slugify(self.name) self.mention, self.subgroup, self.td, self.tp = parse_group(self.name) - - group_content_list = [self.mention, self.subgroup, self.td, self.tp] - group_content_keys = ("mention", "subgroup", "td", "tp") - for i in range(len(group_content_list))[::-1]: - if group_content_list[i] is not None: - group_content_list[i] = None - break - - if group_content_list[1] is not None: - group_content = dict(zip(group_content_keys, group_content_list)) - self.parent_group_id = Group.objects.filter(**group_content).first().id - super(Group, self).save() -- cgit v1.2.1 From 828f19bde69dd525f08ad0c0f46e3929d89463b9 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Mon, 4 Sep 2017 21:45:14 +0200 Subject: Suppression de l’import de RawSQL dans models.py --- models.py | 1 - 1 file changed, 1 deletion(-) (limited to 'models.py') diff --git a/models.py b/models.py index 3d4fdda..21b08f5 100644 --- a/models.py +++ b/models.py @@ -16,7 +16,6 @@ from django.db import connection, models from django.db.models import Count, Manager, Q -from django.db.models.expressions import RawSQL from django.db.models.functions import ExtractWeek, ExtractYear from django.utils.text import slugify -- cgit v1.2.1