aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--admin.py2
-rw-r--r--models.py10
-rw-r--r--utils.py26
3 files changed, 21 insertions, 17 deletions
diff --git a/admin.py b/admin.py
index c93b6b3..0235fb9 100644
--- a/admin.py
+++ b/admin.py
@@ -44,7 +44,7 @@ class TimetableAdmin(admin.ModelAdmin):
class GroupAdmin(admin.ModelAdmin):
fieldsets = (
(None, {"fields": ("name", "celcat_name", "timetable", "hidden",)}),
- ("Groupes", {"fields": ("mention", "subgroup",)}),)
+ ("Groupes", {"fields": ("mention", "semester", "subgroup",)}),)
list_display = ("name", "timetable", "hidden",)
list_editable = ("hidden",)
list_filter = ("timetable",)
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",),)
diff --git a/utils.py b/utils.py
index 46244e1..103969e 100644
--- a/utils.py
+++ b/utils.py
@@ -48,24 +48,24 @@ def group_courses(courses):
def parse_group(name):
# Explication de la regex
#
- # ^(.+?)\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+\(.+\))?$")
+ # ^(.+?)\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
parts = search.groups()
- return parts[0], parts[4]
+ return parts[0], int(parts[2]), parts[5]
def tz_now():
"""Retourne la date et l’heure avec le bon fuseau horaire"""