aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--management/commands/_private.py59
-rw-r--r--management/commands/timetables.py25
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):