aboutsummaryrefslogtreecommitdiff
path: root/models.py
diff options
context:
space:
mode:
authorAlban Gruin2017-11-26 18:20:52 +0100
committerAlban Gruin2017-11-26 18:20:52 +0100
commita05da3098077e89bdb1f120b92ab87e593e331f4 (patch)
tree3c7d6fad2fa63abd0d075efb0ee4bbec4f9b3204 /models.py
parentdf5ef1a932170d55623bf0469ef56c5af9e62fa3 (diff)
parent8cd40466e5b1ef9f00cf88c9375289d235abc009 (diff)
Merge branch 'dev/alban' into futur
Diffstat (limited to 'models.py')
-rw-r--r--models.py49
1 files changed, 20 insertions, 29 deletions
diff --git a/models.py b/models.py
index 40406e3..25ddd1b 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
@@ -72,27 +71,18 @@ 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,
[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)
- 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()
@@ -104,26 +94,26 @@ 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="")
hidden = models.BooleanField(verbose_name="caché", default=False)
- def corresponds_to(self, timetable_id, 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 = 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 \
- mention.startswith(self.mention)) and \
- subgroup_corresponds
+ 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.timetable.id, self.mention, self.subgroup
+ return self.mention, self.semester, self.subgroup
def __str__(self):
return self.name
@@ -133,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 = ""
@@ -141,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",),)
@@ -166,15 +156,16 @@ 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() \
.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__semester",
+ "groups__subgroup", "year", "week")
class Course(models.Model):