From 912f3cca24da9d870aa191348fef901adcd55b7d Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Wed, 1 Nov 2017 15:17:35 +0100
Subject: get_parents() sélectionne aussi les groupes enfants dont le
 sous-groupe commence par la même chaîne que celui du groupe passé en
 paramètre. Correction cosmétique du code.
---
 models.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/models.py b/models.py
index c546737..c3118a3 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) | \
+        groups_criteria = Q(subgroup__isnull=True) | 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)])
@@ -80,7 +80,7 @@ class GroupManager(Manager):
                                           timetable=group.timetable)
 
     def get_relevant_groups(self, timetable, *args, **criteria):
-        sub = Group.objects.filter(timetable=timetable,mention=OuterRef("mention"),
+        sub = Group.objects.filter(timetable=timetable, mention=OuterRef("mention"),
                                    subgroup__startswith=OuterRef("subgroup")) \
                            .order_by().values("mention").annotate(c=Count("*")).values("c")
 
-- 
cgit v1.2.1
From 2d68777e50e261cb793186321947b677ed9de692 Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Wed, 1 Nov 2017 15:20:55 +0100
Subject: Correction des crashes provoqués lors de la génération des ICS
 lorsque le type d’un cours est nul.
---
 feeds.py                        | 7 ++++++-
 templates/timetable_common.html | 2 +-
 2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/feeds.py b/feeds.py
index 66be12e..aced5e6 100644
--- a/feeds.py
+++ b/feeds.py
@@ -75,6 +75,11 @@ class IcalFeed(Feed):
     def item_link(self, item):
         return ""
 
+    def item_summary(self, item):
+        if item.type is not None:
+            return item.name + " (" + item.type + ")"
+        return item.name
+
     def items(self, obj):
         return Course.objects.get_courses_for_group(obj)
 
@@ -83,7 +88,7 @@ class IcalFeed(Feed):
                 "dtstart": item.begin,
                 "dtend": item.end,
                 "dtstamp": item.last_update,
-                "summary": item.name + " (" + item.type + ")",
+                "summary": self.item_summary(item),
                 "location": format_rooms(item.rooms.all())}
 
 
diff --git a/templates/timetable_common.html b/templates/timetable_common.html
index 9a2c27e..62b1d71 100644
--- a/templates/timetable_common.html
+++ b/templates/timetable_common.html
@@ -4,7 +4,7 @@
         
{% filter title %}{{ day.0.begin|date:"l j F o" }}{% endfilter %} – de {{ day.0.begin|date:"H:i" }} à {% with day|last as last %}{{ last.end|date:"H:i" }}{% endwith %}
         {% for course in day %}
           - 
-            {{ course }} ({{ course.type }}), de {{ course.begin|date:"H:i" }} à {{ course.end|date:"H:i" }}{% if course.rooms.all|length > 0 %}
+            {{ course }}{% if course.type %} ({{ course.type }}){% endif %}, de {{ course.begin|date:"H:i" }} à {{ course.end|date:"H:i" }}{% if course.rooms.all|length > 0 %}
             {{ course.rooms.all|format_rooms }}{% endif %}{% if course.notes %}
             Remarques : {{ course.notes }}{% endif %}
            {% endfor %}
-- 
cgit v1.2.1
From 9d364f627dc90f3a361cc9acbc2e91f64ee9edcf Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Wed, 1 Nov 2017 16:08:38 +0100
Subject: Utilisation de self.get_queryset() plutôt que Group.objects
---
 models.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/models.py b/models.py
index c3118a3..cb975ab 100644
--- a/models.py
+++ b/models.py
@@ -80,7 +80,7 @@ class GroupManager(Manager):
                                           timetable=group.timetable)
 
     def get_relevant_groups(self, timetable, *args, **criteria):
-        sub = Group.objects.filter(timetable=timetable, mention=OuterRef("mention"),
+        sub = self.get_queryset().filter(timetable=timetable, mention=OuterRef("mention"),
                                    subgroup__startswith=OuterRef("subgroup")) \
                            .order_by().values("mention").annotate(c=Count("*")).values("c")
 
-- 
cgit v1.2.1
From bb973abfbd566a0f019822453d06f8b0ef3f6dac Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Fri, 3 Nov 2017 17:40:11 +0100
Subject: Prise en compte des groupes qui n’ont pas de sous-groupe dans la
 liste des groupes pertinents
---
 models.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/models.py b/models.py
index cb975ab..3af1c06 100644
--- a/models.py
+++ b/models.py
@@ -86,7 +86,7 @@ class GroupManager(Manager):
 
         return self.get_queryset().filter(*args, timetable=timetable, hidden=False, **criteria) \
                             .annotate(nbsub=Subquery(sub, output_field=models.IntegerField())) \
-                            .filter(nbsub=1).order_by("name")
+                            .filter(Q(nbsub=1) | Q(nbsub__isnull=True)).order_by("name")
 
 
 class Group(models.Model):
-- 
cgit v1.2.1
From c476a83d3c92d705d0bdea8b37a9aa6f10cb50ac Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Sat, 4 Nov 2017 12:24:25 +0100
Subject: Correction d’un bug qui empêche la mise à jour complète de l’emploi
 du temps Lorsqu’on demande une mise à jour, la semaine et le mois à mettre à
 jour sont passés en paramètre de la fonction de mise à jour. Mais quand on
 demande la mise à jour de tout l’emploi du temps, ces deux paramètres sont à
 None, faisant planter la fonction qui calcul le début et la fin de la
 semaine.
---
 management/commands/timetables.py | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/management/commands/timetables.py b/management/commands/timetables.py
index 2d8a17e..d0bf0bd 100644
--- a/management/commands/timetables.py
+++ b/management/commands/timetables.py
@@ -25,17 +25,28 @@ from ._private import delete_courses_in_week, get_events, get_update_date, get_w
 
 @transaction.atomic
 def process_timetable_week(timetable, soup, weeks_in_soup, force, year=None, week=None):
-    begin, end = get_week(year, week)
+    if year is not None and week is not None:
+        begin, end = get_week(year, week)
+
     # Si on force la mise à jour, on définit de moment
     # de la mise à jour au début de la semaine
-    if force:
+    if force and year is not None and week is not None:
         today = begin
+    elif force:
+        # Si la mise à jour est faite sur tout l’emploi du temps,
+        # alors la date de début est indéfinie.
+        today = None
     else:
         today = tz_now()
 
     # On récupère la mise à jour la plus ancienne dans les cours de l’emploi du temps
-    # commençant à partir de maintenant
-    last_update_date = Course.objects.filter(timetable=timetable, begin__gte=today)
+    last_update_date = Course.objects.filter(timetable=timetable)
+
+    if today is not None:
+        # Cette date concerne les éléments commençant à partir d’aujourd’hui si la valeur
+        # n’est pas nulle.
+        last_update_date = last_update_date.filter(begin__gte=today)
+
     if year is not None and week is not None:
         # Si jamais on traite une semaine spécifique, on limite les cours sélectionnés
         # à ceux qui commencent entre le début du traitement et la fin de la semaine
-- 
cgit v1.2.1
From 37a95855076035470e7484804ed48b779ed22277 Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Sat, 4 Nov 2017 12:32:26 +0100
Subject: Affichage de la pile d’exécution lors d’une erreur de màj d’emploi du
 temps
---
 management/commands/timetables.py | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/management/commands/timetables.py b/management/commands/timetables.py
index d0bf0bd..b254788 100644
--- a/management/commands/timetables.py
+++ b/management/commands/timetables.py
@@ -14,6 +14,7 @@
 #    along with celcatsanitizer.  If not, see .
 
 import datetime
+import traceback
 
 from django.core.management.base import BaseCommand
 from django.db import transaction
@@ -135,9 +136,11 @@ class Command(BaseCommand):
 
             try:
                 process_timetable(timetable, options["force"], year, weeks)
-            except Exception as exc:
+            except Exception:
                 self.stderr.write(
-                    self.style.ERROR("Failed to process {0}: {1}".format(timetable, exc)))
+                    self.style.ERROR("Failed to process {0}:".format(timetable))
+                )
+                self.stderr.write(self.style.ERROR(traceback.format_exc()))
                 errcount += 1
 
         if errcount == 0:
-- 
cgit v1.2.1