diff options
Diffstat (limited to 'management/commands/_private.py')
| -rw-r--r-- | management/commands/_private.py | 45 | 
1 files changed, 21 insertions, 24 deletions
| diff --git a/management/commands/_private.py b/management/commands/_private.py index 17a99fe..94c1918 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -1,4 +1,4 @@ -#    Copyright (C) 2017  Alban Gruin +#    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 @@ -19,33 +19,26 @@ import re  from bs4 import BeautifulSoup  from django.utils import timezone -from edt.models import Group, Room, Course -from edt.utils import get_week +from ...models import Course, Group, Room +from ...utils import get_week  import requests  import edt +  def add_time(date, time):      ptime = datetime.datetime.strptime(time, "%H:%M")      delta = datetime.timedelta(hours=ptime.hour, minutes=ptime.minute)      return date + delta -def delete_courses_in_week(timetable, year, week, today): + +def delete_courses_in_week(source, year, week, today):      start, end = get_week(year, week)      Course.objects.filter(begin__gte=max(start, today), begin__lt=end, -                          timetable=timetable).delete() - -def get_from_db_or_create(cls, **kwargs): -    obj = cls.objects.all().filter(**kwargs) - -    obj = obj.first() -    if obj is None: -        obj = cls(**kwargs) -        obj.save() +                          source=source).delete() -    return obj -def get_event(timetable, event, event_week, today): +def get_event(source, 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 @@ -58,11 +51,11 @@ def get_event(timetable, event, event_week, today):          return      # Création de l’objet cours -    course = Course.objects.create(timetable=timetable, begin=begin, end=end) +    course = Course.objects.create(source=source, begin=begin, end=end)      # On récupère les groupes concernés par les cours -    groups = [get_from_db_or_create(Group, timetable=timetable, -                                    celcat_name=item.text) +    groups = [Group.objects.get_or_create(source=source, +                                          celcat_name=item.text)[0]                for item in event.resources.group.find_all("item")]      course.groups.add(*groups) @@ -90,32 +83,34 @@ def get_event(timetable, event, event_week, today):      # en ait pas… qui sont ils, leurs réseaux, tout ça…), on les insère      # dans la base de données, et on les ajoute dans l’objet cours      if event.resources.room is not None: -        rooms = [get_from_db_or_create(Room, name=item.text) +        rooms = [Room.objects.get_or_create(name=item.text)[0]                   for item in event.resources.room.find_all("item")]          course.rooms.add(*rooms)      return course -def get_events(timetable, soup, weeks_in_soup, today, year=None, week=None): + +def get_events(source, 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"):          event_week = weeks_in_soup[event.rawweeks.text] -        event_week_num = event_week.isocalendar()[1] # Numéro de semaine +        event_week_num = event_week.isocalendar()[1]  # Numéro de semaine          # On passe le traitement si la semaine de l’événement ne correspond pas          # à la semaine passée, ou qu’il ne contient pas de groupe ou n’a pas de          # date de début ou de fin. -        if (event_week_num == week and event_week.year == year or \ +        if (event_week_num == week and event_week.year == year or              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, today) +            course = get_event(source, event, event_week, today)              # On renvoie le cours si il n’est pas nul              if course is not None:                  yield course +  def get_update_date(soup):      # Explication de la regex      # @@ -140,6 +135,7 @@ def get_update_date(soup):      date = datetime.datetime(year, month, day, hour, minute, second)      return timezone.make_aware(date) +  def get_weeks(soup):      # Les semaines sont référencées de manière assez… exotique      # En gros, il y a une liste d’éléments span qui contiennent une sorte d’ID @@ -151,13 +147,14 @@ def get_weeks(soup):      # Un cours contient donc un ID de semaine, puis le nombre de jours après le      # début de cette semaine.      weeks = {} -    for span in soup.find_all("span"): # Liste de toutes les semaines définies +    for span in soup.find_all("span"):  # Liste de toutes les semaines définies          # On parse la date et on la fait correspondre à l’ID          weeks[span.alleventweeks.text] = timezone.make_aware(              datetime.datetime.strptime(span["date"], "%d/%m/%Y"))      return weeks +  def get_xml(url):      user_agent = "celcatsanitizer/" + edt.VERSION      req = requests.get(url, headers={"User-Agent": user_agent}) | 
