diff options
Diffstat (limited to 'management')
| -rw-r--r-- | management/commands/_private.py | 59 | ||||
| -rw-r--r-- | management/commands/timetables.py | 25 | 
2 files changed, 46 insertions, 38 deletions
| diff --git a/management/commands/_private.py b/management/commands/_private.py index 2d01e67..e018e3a 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -93,50 +93,67 @@ def get_from_db_or_create(cls, **kwargs):      return obj -def get_events(timetable, year, week, soup, weeks_in_soup): +def get_events(timetable, soup, weeks_in_soup, 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"): -        title = None -        type_ = None -        groups = None -        rooms = None -        notes = None - -        if weeks_in_soup[event.rawweeks.text].number == week and \ -           weeks_in_soup[event.rawweeks.text].year == year and \ +        event_week = weeks_in_soup[event.rawweeks.text] + +        # 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.number == 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: -            date = weeks_in_soup[event.rawweeks.text].get_day(int( -                event.day.text)) - +            # On récupère la date de l’évènement à partir de la semaine +            # et de la semaine référencée, puis la date de début et de fin +            date = event_week.get_day(int(event.day.text))              begin = add_time(date, datetime.datetime.strptime(                  event.starttime.text, "%H:%M"))              end = add_time(date, datetime.datetime.strptime(                  event.endtime.text, "%H:%M")) +            # Création de l’objet cours +            course = Course.objects.create(timetable=timetable, begin=begin, +                                           end=end) + +            # On récupère les groupes concernés par les cours, on les +            # « consolide », puis on les insère dans l’objet cours.              groups = [get_from_db_or_create(Group, timetable=timetable,                                              celcat_name=item.text)                        for item in event.resources.group.find_all("item")]              consolidate_groups(groups) +            course.groups.add(*groups) +            # On récupère le champ « remarque »              if event.notes is not None: -                notes = event.notes.text +                course.notes = event.notes.text +            # On récupère le nom du cours              if event.resources.module is not None: -                title = event.resources.module.item.text -            elif notes is not None: -                title = notes -                notes = None +                course.name = event.resources.module.item.text              else: -                title = "Aucune information" - +                # Il est possible qu’un cours n’ait pas de nom. Oui oui. +                # Qui sont les concepteurs de ce système ? Quels sont leurs +                # réseaux ? +                # Bref, dans ce cas, on déplace le champ « remarque » de +                # l’objet dans le champ « nom ». +                course.name, course.notes = course.notes, None + +            # Récupération du type de cours              if event.category is not None: -                type_ = event.category.text +                course.type = event.category.text +            # Si un cours a une salle attribuée (oui, il est possible qu’il n’y +            # 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)                           for item in event.resources.room.find_all("item")] +                course.rooms.add(*rooms) -            yield title, type_, groups, rooms, notes, begin, end +            yield course  def get_update_date(soup):      # Explication de la regex diff --git a/management/commands/timetables.py b/management/commands/timetables.py index f01ac3c..7ee63af 100644 --- a/management/commands/timetables.py +++ b/management/commands/timetables.py @@ -25,7 +25,7 @@ from edt.utils import get_week  from ._private import delete_courses_in_week, get_events, get_update_date, get_weeks, get_xml  @transaction.atomic -def process_timetable_week(timetable, year, week, soup, weeks_in_soup): +def process_timetable_week(timetable, soup, weeks_in_soup, year=None, week=None):      begin, end = get_week(year, week)      last_update_date = Course.objects.filter(timetable=timetable, @@ -40,27 +40,18 @@ def process_timetable_week(timetable, year, week, soup, weeks_in_soup):          return      delete_courses_in_week(timetable, year, week) -    for name, type_, groups, rooms, notes, begin, end in \ -        get_events(timetable, year, week, soup, weeks_in_soup): -        course = Course.objects.create(timetable=timetable, -                                       begin=begin, -                                       end=end) -        course.name = name -        course.type = type_ -        course.notes = notes - -        course.groups.add(*groups) -        if rooms is not None: -            course.rooms.add(*rooms) - +    for course in get_events(timetable, soup, weeks_in_soup, year, week):          course.save() -def process_timetable(timetable, year, weeks): +def process_timetable(timetable, year=None, weeks=None):      soup = get_xml(timetable.url)      weeks_in_soup = get_weeks(soup) -    for week in weeks: -        process_timetable_week(timetable, year, week, soup, weeks_in_soup) +    if year is not None and weeks is not None: +        for week in weeks: +            process_timetable_week(timetable, soup, weeks_in_soup, year, week) +    else: +        process_timetable_week(timetable, soup, weeks_in_soup)  class Command(BaseCommand): | 
