# Copyright (C) 2017-2018 Alban Gruin # # celcatsanitizer is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # celcatsanitizer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with celcatsanitizer. If not, see . import datetime import re from django.utils import timezone def get_current_week(): return tz_now().isocalendar()[:2] def get_current_or_next_week(): year, week, day = tz_now().isocalendar() if day >= 6: year, week, _ = (tz_now() + datetime.timedelta(weeks=1)).isocalendar() return year, week def get_week(year, week): start = timezone.make_aware(datetime.datetime.strptime( "{0}-W{1}-1".format(year, week), "%Y-W%W-%w")) if datetime.datetime(year, 1, 4).isoweekday() > 4: start -= datetime.timedelta(weeks=1) end = start + datetime.timedelta(weeks=1) return start, end def group_courses(courses): grouped_courses = [] for i, course in enumerate(courses): if i == 0 or courses[i - 1].begin.day != course.begin.day: grouped_courses.append([course]) else: grouped_courses[-1].append(course) return grouped_courses def parse_group(name): # Explication de la regex # # ^(.+?)\s*(s(\d)\s+(CM|TD|TP|G)(\d?\w\d{0,3}))?(\s+\([^\(\)]+\))?$ # # ^ début de la ligne # (.+?) correspond à au moins un caractère # \s* éventuellement un ou plusieurs espaces # (s(\d)\s+ un s suivi d’un nombre et d’un ou plusieurs espaces # (CM|TD|TP|G) « CM » ou « TD » ou « TP » ou « G » # (\d?\w\d{0,3}) un chiffre optionnel, un caractère, entre 0 et 3 chiffres # )? groupe optionnel # (\s+ un ou plusieurs espaces # \([^\(\)]+\))? un ou plusieurs caractères entre parenthèses # $ fin de la ligne group_regex = re.compile( r"^(.+?)\s*(s(\d)\s+(CM|TD|TP|G)(\d?\w\d{0,3}))?(\s+\([^\(\)]+\))?$") search = group_regex.search(name) if search is None: return name, None, None parts = search.groups() # On retourne la section (parts[0]), le semestre (parts[2]) et le # groupe (parts[4]) if parts[2] is not None: return parts[0], int(parts[2]), parts[4] else: # Si jamais le semestre n’est pas présent dans la chaine parsée, # parts[2] sera à None et sa conversion vers un int va provoquer # une erreur. parts[4] devrait être une chaîne vide ici. return parts[0], None, parts[4] def tz_now(): """Retourne la date et l’heure avec le bon fuseau horaire""" return timezone.make_aware(datetime.datetime.now())