aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlban Gruin2018-09-29 17:02:43 +0200
committerAlban Gruin2018-09-29 17:02:43 +0200
commitfc1fc472931cae0ba3d0a0103c328f85b7b52586 (patch)
treef6be7fb6463ff29f26de8db5386729a4fc9f975b
parenta4000b40682c93efacec31308dce4a32eeac7ef7 (diff)
parentc95740a4d97fc579f4f12a6abf01eac446fde1cc (diff)
Merge branch 'stable/0.14.z' into prod/pa1ch/0.14.zv0.14.2-pa1ch
Signed-off-by: Alban Gruin <alban at pa1ch dot fr>
-rw-r--r--Documentation/conf.py2
-rw-r--r--Documentation/usage/versions.rst17
-rw-r--r--__init__.py2
-rw-r--r--forms.py2
-rw-r--r--management/parsers/ups2018.py26
-rw-r--r--templates/timetable.html4
-rw-r--r--views.py5
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"
diff --git a/forms.py b/forms.py
index d4ee94d..b1a3052 100644
--- a/forms.py
+++ b/forms.py
@@ -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 %} &ndash;
{% 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>
&ndash;
{% 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>
&ndash;
{% endif %}
diff --git a/views.py b/views.py
index e45ece3..de38f35 100644
--- a/views.py
+++ b/views.py
@@ -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):