aboutsummaryrefslogtreecommitdiff
path: root/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'models.py')
-rw-r--r--models.py65
1 files changed, 43 insertions, 22 deletions
diff --git a/models.py b/models.py
index b809a53..f7450dc 100644
--- a/models.py
+++ b/models.py
@@ -25,11 +25,11 @@ from .utils import parse_group
class SlugModel(models.Model):
- def save(self):
+ def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
- super(SlugModel, self).save()
+ super(SlugModel, self).save(*args, **kwargs)
class Meta:
@@ -43,7 +43,6 @@ class Year(SlugModel):
def __str__(self):
return self.name
-
class Meta:
verbose_name = "année"
verbose_name_plural = "années"
@@ -51,16 +50,17 @@ class Year(SlugModel):
class Source(models.Model):
url = models.URLField(max_length=255, verbose_name="URL", unique=True)
- last_update_date = models.DateTimeField(verbose_name="dernière mise à jour Celcat",
- null=True, blank=True)
+ last_update_date = models.DateTimeField(null=True, blank=True,
+ verbose_name="dernière mise à jour"
+ " Celcat")
def __str__(self):
return self.url
@property
def formatted_timetables(self):
- return ", ".join([str(timetable) for timetable in self.timetables.iterator()])
-
+ return ", ".join([str(timetable) for timetable in
+ self.timetables.all()])
class Meta:
verbose_name = "source d’emploi du temps"
@@ -80,12 +80,12 @@ class Timetable(SlugModel):
name = models.CharField(max_length=64, verbose_name="nom")
slug = models.SlugField(max_length=64, default="")
source = models.ForeignKey(Source, on_delete=models.CASCADE,
- verbose_name="source", related_name="timetables")
+ verbose_name="source",
+ related_name="timetables")
def __str__(self):
return self.year.name + " " + self.name
-
class Meta:
unique_together = (("year", "name"), ("year", "slug"),)
verbose_name = "emploi du temps"
@@ -96,11 +96,12 @@ class GroupManager(Manager):
def get_parents(self, group):
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)],
Q(subgroup=""))
return self.get_queryset().filter(groups_criteria,
- Q(semester=None) | Q(semester=group.semester),
+ Q(semester=None) |
+ Q(semester=group.semester),
mention=group.mention,
source=group.source)
@@ -123,7 +124,8 @@ class Group(SlugModel):
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="")
+ subgroup = models.CharField(max_length=16, verbose_name="sous-groupe",
+ default="")
slug = models.SlugField(max_length=64, default="")
@@ -134,10 +136,10 @@ class Group(SlugModel):
if self.subgroup is not None and subgroup is not None:
subgroup_corresponds = self.subgroup.startswith(subgroup)
- return (self.mention.startswith(mention) or \
+ return (self.mention.startswith(mention) or
mention.startswith(self.mention)) and \
- (self.semester == semester or semester is None) and \
- subgroup_corresponds
+ (self.semester == semester or semester is None) and \
+ subgroup_corresponds
@property
def group_info(self):
@@ -154,8 +156,7 @@ class Group(SlugModel):
if self.subgroup is None:
self.subgroup = ""
- super(Group, self).save()
-
+ super(Group, self).save(*args, **kwargs)
class Meta:
index_together = ("mention", "semester", "subgroup",)
@@ -167,7 +168,26 @@ class Group(SlugModel):
verbose_name_plural = "groupes"
+class RoomManager(Manager):
+ def qsjps(self, begin, end):
+ # On récupère la liste des cours qui commencent avant la fin
+ # de l’intervalle sélectionné et qui terminent après le début
+ # de l’intervalle, c’est-à-dire qu’au moins une partie du
+ # cours se déroule pendant l’intervalle. On récupère ensuite
+ # la liste des salles dans lesquelles se déroulent ces
+ # cours. On exclu les cours n’ayant aucune salle assignée.
+ courses = Course.objects.filter(begin__lt=end, end__gt=begin,
+ rooms__isnull=False) \
+ .values_list("rooms", flat=True)
+
+ # On sélectionne ensuite les salles qui ne sont pas dans la
+ # liste récupérée plus haut, et on les trie par leur nom.
+ return self.get_queryset().exclude(pk__in=courses).order_by("name")
+
+
class Room(SlugModel):
+ objects = RoomManager()
+
name = models.CharField(max_length=255, unique=True, verbose_name="nom")
slug = models.SlugField(max_length=64, default="", unique=True)
@@ -183,11 +203,12 @@ class CourseManager(Manager):
def get_courses(self, obj, **criteria):
qs = self.get_queryset()
if isinstance(obj, Group):
- qs = qs.filter(groups__in=Group.objects.get_parents(obj), **criteria) \
+ qs = qs.filter(
+ groups__in=Group.objects.get_parents(obj), **criteria) \
.prefetch_related("rooms")
elif isinstance(obj, Room):
- qs = qs.filter(rooms__in=(obj,), **criteria) \
- .prefetch_related("groups")
+ qs = qs.filter(rooms=obj, **criteria) \
+ .prefetch_related("rooms", "groups")
else:
raise(TypeError, "obj must be a Group or a Room")
@@ -207,7 +228,8 @@ class CourseManager(Manager):
class Course(models.Model):
objects = CourseManager()
- name = models.CharField(max_length=255, verbose_name="nom", default="Sans nom")
+ name = models.CharField(max_length=255, verbose_name="nom",
+ default="Sans nom")
type_ = models.CharField(name="type", max_length=255,
verbose_name="type de cours", null=True)
source = models.ForeignKey(Source, on_delete=models.CASCADE,
@@ -235,7 +257,6 @@ class Course(models.Model):
super(Course, self).save(*args, **kwargs)
-
class Meta:
verbose_name = "cours"
verbose_name_plural = "cours"