From 7855fc164a16e0303f3d9aa7ee5c2ee9c719b4de Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Wed, 18 Jan 2017 22:22:22 +0100 Subject: Ajout de la commande pour charger et enregistrer les données --- management/commands/_private.py | 69 +++++++++++++++++++++++++++++++++++++++ management/commands/timetables.py | 38 +++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 management/commands/_private.py create mode 100644 management/commands/timetables.py diff --git a/management/commands/_private.py b/management/commands/_private.py new file mode 100644 index 0000000..4000f6b --- /dev/null +++ b/management/commands/_private.py @@ -0,0 +1,69 @@ +from bs4 import BeautifulSoup +from django.utils import timezone +from edt.models import Group, Room + +import datetime +import requests + + +class Week: + def __init__(self, number, start): + self.number = number + self.start = timezone.make_aware(datetime.datetime.strptime(start, "%d/%m/%Y")) + + def get_day(self, id): + return self.start + datetime.timedelta(id) + +def add_time(date, time): + delta = datetime.timedelta(hours=time.hour, minutes=time.minute) + return date + delta + +def get_from_db_or_create(cls, name): + obj = cls.objects.all().filter(name=name).first() + if obj == None: + obj = cls(name=name) + obj.save() + + return obj + +def get_events(soup, weeks, week): + for event in soup.find_all("event"): + title = None + type_ = None + groups = None + rooms = None + + if weeks[event.rawweeks.text].number != week: + continue + + if event.resources.module is not None: + title = event.resources.module.text + + if event.category is not None and title is not None: + type_ = event.category.text + + if event.resources.group is not None and type_ is not None: + groups = [get_from_db_or_create(Group, item.text) for item in event.resources.group.find_all("item")] + + if event.resources.room is not None and groups is not None: + rooms = [get_from_db_or_create(Room, item.text) for item in event.resources.room.find_all("item")] + + date = weeks[event.rawweeks.text].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")) + + yield (title, type_, groups, rooms, begin, end,) + +def get_weeks(soup): + weeks = {} + for span in soup.find_all("span"): + weeks[span.alleventweeks.text] = Week(int(span.title.text), span["date"]) + + return weeks + +def get_xml(url): + r = requests.get(url) + r.encoding = "utf8" + + soup = BeautifulSoup(r.text, "html.parser") + return soup diff --git a/management/commands/timetables.py b/management/commands/timetables.py new file mode 100644 index 0000000..58897a1 --- /dev/null +++ b/management/commands/timetables.py @@ -0,0 +1,38 @@ +from django.core.management.base import BaseCommand, CommandError +from django.utils import timezone +from edt.models import Group, Room, Course + +from bs4 import BeautifulSoup + +from ._private import get_events, get_weeks, get_xml, Week + +import datetime +import requests + +class Command(BaseCommand): + help = "Fetches the specified celcat timetable" + + def add_arguments(self, parser): + parser.add_argument("url", type=str) + + def handle(self, *args, **options): + url = options["url"] + + _, week, day = timezone.now().isocalendar() + if day >= 6: + _, week, _ = (timezone.now() + datetime.timedelta(weeks=1)).isocalendar() + + soup = get_xml(url) + weeks = get_weeks(soup) + + for name, type_, groups, rooms, begin, end in get_events(soup, weeks, week): + + course = Course.objects.create(begin=begin, end=end) + + course.name = name + course.type = type_ + course.groups.add(*groups) + course.rooms.add(*rooms) + course.save() + + self.stdout.write(self.style.SUCCESS("Done.")) -- cgit v1.2.1