From b0211666b3f3437a0496b9c9f03a3613698b9804 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 23 Sep 2018 19:34:27 +0200 Subject: ups2018: déduplication avec OrderedDict au lieu de set() set() ne conserve pas nécessairement l’ordre des données, ce qui a plusieurs conséquences. Premièrement, un cours avec plusieurs noms séparés par un point-virgule peut changer de nom dans celcatsanitizer d’une mise à jour à une autre. Deuxièmement, cette fonctionnalité devient intestable de manière certaine. Pour remédier à cela, on utilise la structure OrderedDict à la place. Signed-off-by: Alban Gruin --- management/parsers/ups2018.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'management/parsers') diff --git a/management/parsers/ups2018.py b/management/parsers/ups2018.py index 15c629a..4ae7ef7 100644 --- a/management/parsers/ups2018.py +++ b/management/parsers/ups2018.py @@ -14,6 +14,7 @@ # along with celcatsanitizer. If not, see . from datetime import datetime, timedelta +from collections import OrderedDict import asyncio import calendar @@ -104,7 +105,11 @@ class Parser(AbstractParser): groups = data[i] if i - 1 >= 0: - course.name = ", ".join(set(data[i - 1].split(';'))) + # TODO: le jour où la version minimale supportée sera + # Python 3.7, il sera possible de remplacer OrderedDict + # par un dictionnaire classique. + names = OrderedDict.fromkeys(data[i - 1].split(';')) + course.name = ", ".join(names.keys()) else: course.name = "Sans nom" if i - 2 >= 0: -- cgit v1.2.1 From f9da11d173229ac9dc197fa25163479686b5d0d6 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 23 Sep 2018 19:40:17 +0200 Subject: ups2018: détection du premier élément « utile » des données du cours La plupart des cours contiennent un élément correspondant à l’heure de début et de fin du cours. Lorsqu’un cours ne possède pas de nom, il se peut que cet élément soit utilisé comme type, ce qui n’a pas de sens. On va donc détecter la présence de cet élément à la première place à l’aide d’une regex, et, si jamais il est présent, on n’utilise pas le premier élément de la liste. À l’origine, cet élément ne devait pas être utilisé pour cette raison, mais ce comportement a été changé avec le commit ab6ca3c ("parsers: correction de l’index du premier élément à analyser"), après la détection de cours n’ayant pas cet élément. Signed-off-by: Alban Gruin --- management/parsers/ups2018.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'management/parsers') diff --git a/management/parsers/ups2018.py b/management/parsers/ups2018.py index 4ae7ef7..805c761 100644 --- a/management/parsers/ups2018.py +++ b/management/parsers/ups2018.py @@ -19,6 +19,7 @@ from collections import OrderedDict import asyncio import calendar import json +import re from django.utils import timezone @@ -95,7 +96,11 @@ class Parser(AbstractParser): if data[0] == "Global Event": return - i = 0 + min_i = 0 + if len(data) > 0 and re.match("^\(\d+:\d+-\d+:\d+\)$", data[0]): + min_i = 1 + + i = min_i while i < len(data) and not data[i].startswith( ("L1 ", "L2 ", "L3 ", "L3P ", "M1 ", "M2 ", "DEUST ", "MAG1 ", "1ERE ANNEE ", "2EME ANNEE ", "3EME ANNEE ", @@ -104,7 +109,7 @@ class Parser(AbstractParser): i += 1 groups = data[i] - if i - 1 >= 0: + if i - 1 >= min_i: # TODO: le jour où la version minimale supportée sera # Python 3.7, il sera possible de remplacer OrderedDict # par un dictionnaire classique. @@ -112,7 +117,7 @@ class Parser(AbstractParser): course.name = ", ".join(names.keys()) else: course.name = "Sans nom" - if i - 2 >= 0: + if i - 2 >= min_i: course.type = data[i - 2] if len(data) >= i + 2: rooms = data[i + 1] -- cgit v1.2.1 From 0533690d2423214c3cd1c013cab6242c10f9d094 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sat, 29 Sep 2018 16:45:53 +0200 Subject: ups2018: pas de création de cours si l’événement est global Pour l’instant, on ne souhaite pas enregistrer les événement globaux. On vérifie donc si l’événement est global, et, si c’est le cas, on ne traite pas l’événement. Or, on insérait un cours dans la base de données avant de faire ce test. Un cours avec aucun attribut était donc laissé dans la base de données. Ce commit déplace donc la création du cours après avoir vérifié si un événement est global. Signed-off-by: Alban Gruin --- management/parsers/ups2018.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'management/parsers') diff --git a/management/parsers/ups2018.py b/management/parsers/ups2018.py index 805c761..522a26a 100644 --- a/management/parsers/ups2018.py +++ b/management/parsers/ups2018.py @@ -87,15 +87,15 @@ class Parser(AbstractParser): if event_year != year or event_week != week: return - course = Course.objects.create( - source=self.source, begin=begin, end=end - ) - data = event["text"].split("
") rooms = None if data[0] == "Global Event": return + course = Course.objects.create( + source=self.source, begin=begin, end=end + ) + min_i = 0 if len(data) > 0 and re.match("^\(\d+:\d+-\d+:\d+\)$", data[0]): min_i = 1 -- cgit v1.2.1