diff options
| -rw-r--r-- | Documentation/conf.py | 2 | ||||
| -rw-r--r-- | Documentation/usage/versions.rst | 17 | ||||
| -rw-r--r-- | __init__.py | 2 | ||||
| -rw-r--r-- | forms.py | 2 | ||||
| -rw-r--r-- | management/parsers/ups2018.py | 26 | ||||
| -rw-r--r-- | templates/timetable.html | 4 | ||||
| -rw-r--r-- | views.py | 5 | 
7 files changed, 44 insertions, 14 deletions
diff --git a/Documentation/conf.py b/Documentation/conf.py index 198e67a..ad8660d 100644 --- a/Documentation/conf.py +++ b/Documentation/conf.py @@ -15,7 +15,7 @@ copyright = u'%d, Alban Gruin' % year  author = u'Alban Gruin'  version = u'0.14' -release = u'0.14.1' +release = u'0.14.2'  language = 'fr' diff --git a/Documentation/usage/versions.rst b/Documentation/usage/versions.rst index 8812b17..b0a1fb4 100644 --- a/Documentation/usage/versions.rst +++ b/Documentation/usage/versions.rst @@ -88,3 +88,20 @@ Version 0.14.1     l’heure de début est après l’heure de fin.   - Correction d’un bogue lorsqu’un cours ne possède ni nom ni type     dans le parseur UPS2018, résultant en un échec de mise à jour. + +Version 0.14.2 +-------------- + - Renvoi d’un code d’erreur 400 lorsque le formulaire de QSJPS est +   invalide. + - Correction du texte d’erreur du formulaire de QSJPS. + - Changement des textes « semaine N » par « semaine +   précédente/suivante » dans les calendriers. + - Correction d’un bogue qui faisait croire au parseur que l’heure de +   début et de fin d’un cours était son type. + - Correction d’un bogue qui faisait que le parseur créait un cours +   vide quand il traitait un événement global, alors qu’il ne devrait +   pas en créer du tout. + - Lorsqu’un cours a plusieurs noms, la technique de déduplication +   utilisée jusqu’alors faisait que l’ordre des noms n’était pas +   forcément identique d’une mise à jour à une autre. Cette technique +   a été changée par une autre permettant de conserver cet ordre. diff --git a/__init__.py b/__init__.py index d95a5fd..a67d67f 100644 --- a/__init__.py +++ b/__init__.py @@ -13,7 +13,7 @@  #    You should have received a copy of the GNU Affero General Public License  #    along with celcatsanitizer.  If not, see <http://www.gnu.org/licenses/>. -VERSION = "0.14.1" +VERSION = "0.14.2"  __version__ = VERSION  default_app_config = "edt.apps.EdtConfig" @@ -64,6 +64,6 @@ class QSJPSForm(forms.Form):             form_data["begin"] >= form_data["end"]:              # Si l’heure de fin est plus petite ou égale, on affiche              # une erreur. -            self.add_error("end", "L’heure de début doit être" +            self.add_error("end", "L’heure de début doit être "                             "supérieure à celle de fin.")          return form_data diff --git a/management/parsers/ups2018.py b/management/parsers/ups2018.py index 15c629a..522a26a 100644 --- a/management/parsers/ups2018.py +++ b/management/parsers/ups2018.py @@ -14,10 +14,12 @@  #    along with celcatsanitizer.  If not, see <http://www.gnu.org/licenses/>.  from datetime import datetime, timedelta +from collections import OrderedDict  import asyncio  import calendar  import json +import re  from django.utils import timezone @@ -85,16 +87,20 @@ 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("<br>")          rooms = None          if data[0] == "Global Event":              return -        i = 0 +        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 + +        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 ", @@ -103,11 +109,15 @@ class Parser(AbstractParser):              i += 1          groups = data[i] -        if i - 1 >= 0: -            course.name = ", ".join(set(data[i - 1].split(';'))) +        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. +            names = OrderedDict.fromkeys(data[i - 1].split(';')) +            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] diff --git a/templates/timetable.html b/templates/timetable.html index a6dc1ab..79c5471 100644 --- a/templates/timetable.html +++ b/templates/timetable.html @@ -29,13 +29,13 @@          {% endif %} –          {% if last_week is not None %}            <a href="{% if group_mode %}{% url "timetable" timetable.year.slug timetable.slug group.slug last_week.year last_week|dt_week %}{% else %}{% url "room-timetable" group.slug last_week.year last_week|dt_week %}{% endif %}"> -            Semaine {{ last_week|dt_week }} +            Semaine précédente            </a>            –          {% endif %}          {% if next_week is not None %}            <a href="{% if group_mode %}{% url "timetable" timetable.year.slug timetable.slug group.slug next_week.year next_week|dt_week %}{% else %}{% url "room-timetable" group.slug next_week.year next_week|dt_week %}{% endif %}"> -            Semaine {{ next_week|dt_week }} +            Semaine suivante            </a>            –          {% endif %} @@ -259,6 +259,8 @@ def room_timetable(request, room_slug, year=None, week=None):  @csrf_exempt  def qsjps(request): +    status = 200 +      if request.method == "POST":          # Si on traite un formulaire, on le valide          form = QSJPSForm(request.POST) @@ -278,12 +280,13 @@ def qsjps(request):          # Si le formulaire est invalide, on ré-affiche le formulaire          # avec les erreurs +        status = 400      else:          # Si le formulaire n’a pas été soumis, on en instancie un          # nouveau          form = QSJPSForm() -    return render(request, "qsjps_form.html", {"form": form}) +    return render(request, "qsjps_form.html", {"form": form}, status=status)  def ctx_processor(request):  | 
