From 295f8cbd261cf588f1f5f8eb2b0d82b1ae9c1fe0 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 5 Oct 2017 09:35:14 +0200 Subject: On ne supprime pas les cours qui commencent avant le début du traitement --- management/commands/_private.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'management/commands/_private.py') diff --git a/management/commands/_private.py b/management/commands/_private.py index 8f195a1..d576daf 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -65,9 +65,9 @@ def consolidate_groups(groups): if group.parent is None: consolidate_group(group) -def delete_courses_in_week(timetable, year, week): +def delete_courses_in_week(timetable, year, week, today): start, end = get_week(year, week) - Course.objects.filter(begin__gte=start, begin__lt=end, + Course.objects.filter(begin__gte=max(start, today), begin__lt=end, timetable=timetable).delete() def get_from_db_or_create(cls, **kwargs): @@ -128,7 +128,7 @@ def get_event(timetable, event, event_week): return course -def get_events(timetable, soup, weeks_in_soup, year=None, week=None): +def get_events(timetable, soup, weeks_in_soup, today, year=None, week=None): """Récupère tous les cours disponibles dans l’emploi du temps Celcat. Le traîtement se limitera à la semaine indiquée si il y en a une.""" for event in soup.find_all("event"): @@ -142,7 +142,12 @@ def get_events(timetable, soup, weeks_in_soup, year=None, week=None): year is None or week is None) and \ event.resources.group is not None and \ event.starttime is not None and event.endtime is not None: - yield get_event(timetable, event, event_week) + course = get_event(timetable, event, event_week) + + # On ne sauvegarde le cours que si il ne + # commence après le moment du traitement + if course.begin >= today: + yield course def get_update_date(soup): # Explication de la regex -- cgit v1.2.1 From ab47155c3d7eb9b5bf421c5f9c9c903602ebb175 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sat, 7 Oct 2017 11:13:09 +0200 Subject: La fonction create() des modèles créée un objet en base, donc ne pas sauvegarder après coup, comme ce qui était fait jusque là créait des cours sans nom ni type, faisant crasher le générateur d’ICS. La comparaison du début d’un cours se fait maintenant directement dans get_event(), avant que l’objet Course ne soit créé. --- management/commands/_private.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'management/commands/_private.py') diff --git a/management/commands/_private.py b/management/commands/_private.py index d576daf..bad6e6f 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -80,7 +80,7 @@ def get_from_db_or_create(cls, **kwargs): return obj -def get_event(timetable, event, event_week): +def get_event(timetable, event, event_week, today): """Renvoie une classe Course à partir d’un événement récupéré par BS4""" # On récupère la date de l’évènement à partir de la semaine # et de la semaine référencée, puis l’heure de début et de fin @@ -88,6 +88,10 @@ def get_event(timetable, event, event_week): begin = add_time(date, event.starttime.text) end = add_time(date, event.endtime.text) + # On ne traite pas le cours si il commence après le moment du traitement + if begin < today: + return + # Création de l’objet cours course = Course.objects.create(timetable=timetable, begin=begin, end=end) @@ -142,11 +146,10 @@ def get_events(timetable, soup, weeks_in_soup, today, year=None, week=None): year is None or week is None) and \ event.resources.group is not None and \ event.starttime is not None and event.endtime is not None: - course = get_event(timetable, event, event_week) + course = get_event(timetable, event, event_week, today) - # On ne sauvegarde le cours que si il ne - # commence après le moment du traitement - if course.begin >= today: + # On renvoie le cours si il n’est pas nul + if course is not None: yield course def get_update_date(soup): -- cgit v1.2.1 From 72dcae5c9d58005af71b293d1ec09a4c50335c64 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Mon, 9 Oct 2017 23:11:16 +0200 Subject: Lorsque le nom d’un cours et son champ remarque est vide, le nom de l’objet cours final était égal à None et faisait crasher les flux RSS et Atom, ainsi que l’ICS et n’affichait aucun cours à la semaine du cours problématique. C’est maintenant corrigé. --- management/commands/_private.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'management/commands/_private.py') diff --git a/management/commands/_private.py b/management/commands/_private.py index bad6e6f..3b6a164 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -103,20 +103,19 @@ def get_event(timetable, event, event_week, today): consolidate_groups(groups) course.groups.add(*groups) - # On récupère le champ « remarque » - if event.notes is not None: - course.notes = event.notes.text - - # On récupère le nom du cours + # On récupère le nom du cours et le champ « remarque » if event.resources.module is not None: course.name = event.resources.module.item.text - else: + if course.notes is not None: + course.notes = event.notes.text + + elif event.resources.module is None and event.notes is not None: # Il est possible qu’un cours n’ait pas de nom. Oui oui. # Qui sont les concepteurs de ce système ? Quels sont leurs # réseaux ? - # Bref, dans ce cas, on déplace le champ « remarque » de - # l’objet dans le champ « nom ». - course.name, course.notes = course.notes, None + # Bref, dans ce cas, si le cours possède une remarque, elle + # devient le nom du cours. + course.name = event.notes.text # Récupération du type de cours if event.category is not None: -- cgit v1.2.1 From e80ab8a7232a73d8a0f09f8e41a88893d4c65d63 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Tue, 10 Oct 2017 21:26:39 +0200 Subject: Envoi d’un user-agent personnalisé --- management/commands/_private.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'management/commands/_private.py') diff --git a/management/commands/_private.py b/management/commands/_private.py index 3b6a164..943a3fb 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -23,6 +23,7 @@ from edt.models import Group, Room, Course from edt.utils import get_week import requests +import edt def add_time(date, time): ptime = datetime.datetime.strptime(time, "%H:%M") @@ -194,7 +195,8 @@ def get_weeks(soup): return weeks def get_xml(url): - req = requests.get(url) + user_agent = "celcatsanitizer/" + edt.VERSION + req = requests.get(url, headers={"User-Agent": user_agent}) req.encoding = "utf8" soup = BeautifulSoup(req.content, "html.parser") -- cgit v1.2.1 From 0e0e59e3530dcfbb8e92b5a3926edad4f58d72a1 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Tue, 10 Oct 2017 21:34:26 +0200 Subject: Il est plus pertinent de remplacer le nom du cours par son type lorsqu’il n’y en a pas que par sa remarque. --- management/commands/_private.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'management/commands/_private.py') diff --git a/management/commands/_private.py b/management/commands/_private.py index 943a3fb..e7f0a3c 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -104,19 +104,21 @@ def get_event(timetable, event, event_week, today): consolidate_groups(groups) course.groups.add(*groups) - # On récupère le nom du cours et le champ « remarque » + # On récupère le champ « remarque » + if course.notes is not None: + course.notes = event.notes.text + + # On récupère le champ « nom » if event.resources.module is not None: course.name = event.resources.module.item.text - if course.notes is not None: - course.notes = event.notes.text - - elif event.resources.module is None and event.notes is not None: + elif event.category is not None: # Il est possible qu’un cours n’ait pas de nom. Oui oui. # Qui sont les concepteurs de ce système ? Quels sont leurs # réseaux ? - # Bref, dans ce cas, si le cours possède une remarque, elle - # devient le nom du cours. - course.name = event.notes.text + # Bref, dans ce cas, si le cours a un type, il devient son nom. + course.type = event.category.text + # Si il n’a pas de type (mais je ne pense pas que ça soit possible…), + # il obtiendra une valeur par défaut définie à l’avance. # Récupération du type de cours if event.category is not None: -- cgit v1.2.1 From e7df75f46aec90652c2e501cfacdd31a7be5be4a Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 19 Oct 2017 22:41:47 +0200 Subject: Suppression de l’étape de consolidation --- management/commands/_private.py | 40 +--------------------------------------- 1 file changed, 1 insertion(+), 39 deletions(-) (limited to 'management/commands/_private.py') diff --git a/management/commands/_private.py b/management/commands/_private.py index e7f0a3c..f28512f 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -30,42 +30,6 @@ def add_time(date, time): delta = datetime.timedelta(hours=ptime.hour, minutes=ptime.minute) return date + delta -def consolidate_group(group): - group_content_key = ("mention", "subgroup", "td", "tp") - group_content_list = group.group_info[1:] - - if group.subgroup is not None: - group_content = dict(zip(group_content_key, group_content_list)) - - for i in range(len(group_content_list))[::-1]: - del group_content[group_content_key[i]] - group_content[group_content_key[i] + "__isnull"] = True - - if group_content_list[i] is not None: - break - - group.parent = Group.objects.filter(timetable=group.timetable, - **group_content).first() - group.save() - - if group.tp is None: - group_content = dict(zip(group_content_key, group_content_list)) - last_is_none = False - - for i, key in enumerate(group_content_key): - if group_content_list[i] is None or last_is_none: - del group_content[key] - group_content[key + "__isnull"] = last_is_none - last_is_none = True - - Group.objects.filter(timetable=group.timetable, parent__isnull=True, - **group_content).update(parent=group) - -def consolidate_groups(groups): - for group in groups: - if group.parent is None: - consolidate_group(group) - def delete_courses_in_week(timetable, year, week, today): start, end = get_week(year, week) Course.objects.filter(begin__gte=max(start, today), begin__lt=end, @@ -96,12 +60,10 @@ def get_event(timetable, event, event_week, today): # Création de l’objet cours course = Course.objects.create(timetable=timetable, begin=begin, end=end) - # On récupère les groupes concernés par les cours, on les - # « consolide », puis on les insère dans l’objet cours. + # On récupère les groupes concernés par les cours groups = [get_from_db_or_create(Group, timetable=timetable, celcat_name=item.text) for item in event.resources.group.find_all("item")] - consolidate_groups(groups) course.groups.add(*groups) # On récupère le champ « remarque » -- cgit v1.2.1 From 3830f9c786f1a790d67958b0a6d38bea75679159 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 22 Oct 2017 12:43:23 +0200 Subject: Le parseur de cours récupère à nouveau le champ « remarque ». Pour récupérer ce champ, le parseur est censé vérifier que la valeur existe dans un cours, sinon il ne faisait rien. Sauf que depuis un moment (commit 72dcae5c), la valeur qu’il vérifiait était celle de l’objet en cours de création, forcément nul, et non pas celle du XML. --- management/commands/_private.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'management/commands/_private.py') diff --git a/management/commands/_private.py b/management/commands/_private.py index e7f0a3c..a9d283d 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -105,7 +105,7 @@ def get_event(timetable, event, event_week, today): course.groups.add(*groups) # On récupère le champ « remarque » - if course.notes is not None: + if event.notes is not None: course.notes = event.notes.text # On récupère le champ « nom » -- cgit v1.2.1