diff options
| author | Alban Gruin | 2018-01-27 17:56:45 +0100 | 
|---|---|---|
| committer | Alban Gruin | 2018-01-27 18:13:25 +0100 | 
| commit | c9388e29b2f9ee18a9e190683a8a33fb710684c5 (patch) | |
| tree | 1d9402e02719110d3a0f15b74500b57afe0d2fd4 /management/commands | |
| parent | 465c1c13f2e5a77f296de92d4b5b14cf319c68c5 (diff) | |
PEP8
Diffstat (limited to 'management/commands')
| -rw-r--r-- | management/commands/_private.py | 14 | ||||
| -rw-r--r-- | management/commands/cleancourses.py | 3 | ||||
| -rw-r--r-- | management/commands/listtimetables.py | 5 | ||||
| -rw-r--r-- | management/commands/timetables.py | 65 | 
4 files changed, 56 insertions, 31 deletions
| diff --git a/management/commands/_private.py b/management/commands/_private.py index e78c3c2..bac749b 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -25,16 +25,19 @@ from edt.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(source, year, week, today):      start, end = get_week(year, week)      Course.objects.filter(begin__gte=max(start, today), begin__lt=end,                            source=source).delete() +  def get_from_db_or_create(cls, **kwargs):      obj = cls.objects.all().filter(**kwargs) @@ -45,6 +48,7 @@ def get_from_db_or_create(cls, **kwargs):      return obj +  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 @@ -96,17 +100,18 @@ def get_event(source, event, event_week, today):      return course +  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: @@ -116,6 +121,7 @@ def get_events(source, soup, weeks_in_soup, today, year=None, week=None):              if course is not None:                  yield course +  def get_update_date(soup):      # Explication de la regex      # @@ -140,6 +146,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 +158,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}) diff --git a/management/commands/cleancourses.py b/management/commands/cleancourses.py index 310c843..88eec64 100644 --- a/management/commands/cleancourses.py +++ b/management/commands/cleancourses.py @@ -30,7 +30,8 @@ class Command(BaseCommand):                  Course.objects.all().delete()                  Group.objects.all().delete()              else: -                Course.objects.filter(source__id__in=options["source"]).delete() +                Course.objects.filter(source__id__in=options["source"]) \ +                              .delete()                  Group.objects.filter(source__id__in=options["source"]).delete()          self.stdout.write(self.style.SUCCESS("Done.")) diff --git a/management/commands/listtimetables.py b/management/commands/listtimetables.py index 25f641b..7892855 100644 --- a/management/commands/listtimetables.py +++ b/management/commands/listtimetables.py @@ -29,8 +29,9 @@ class Command(BaseCommand):              sources = sources.order_by("id")          for source in sources: -            self.stdout.write("{0}\t: {1} (id: {2})".format(source.formatted_timetables, -                                                            source, source.id)) +            self.stdout.write("{0}\t: {1} (id: {2})" +                              .format(source.formatted_timetables, +                                      source, source.id))          self.stdout.write("")          self.stdout.write(self.style.SUCCESS("Done.")) diff --git a/management/commands/timetables.py b/management/commands/timetables.py index 86f389e..cf48af6 100644 --- a/management/commands/timetables.py +++ b/management/commands/timetables.py @@ -22,10 +22,13 @@ from django.db.models import Min  from edt.models import Course, Source  from edt.utils import get_week, tz_now -from ._private import delete_courses_in_week, get_events, get_update_date, get_weeks, get_xml +from ._private import delete_courses_in_week, get_events, get_update_date, \ +    get_weeks, get_xml +  @transaction.atomic -def process_timetable_week(source, soup, weeks_in_soup, force, year=None, week=None): +def process_timetable_week(source, soup, weeks_in_soup, force, +                           year=None, week=None):      if year is not None and week is not None:          begin, end = get_week(year, week) @@ -40,32 +43,34 @@ def process_timetable_week(source, soup, weeks_in_soup, force, year=None, week=N      else:          today = tz_now() -    # On récupère la mise à jour la plus ancienne dans les cours de l’emploi du temps +    # On récupère la mise à jour la plus ancienne dans les cours de +    # l’emploi du temps      last_update_date = Course.objects.filter(source=source)      if today is not None: -        # Cette date concerne les éléments commençant à partir d’aujourd’hui si la valeur -        # n’est pas nulle. +        # Cette date concerne les éléments commençant à partir +        # d’aujourd’hui si la valeur n’est pas nulle.          last_update_date = last_update_date.filter(begin__gte=today)      if year is not None and week is not None: -        # Si jamais on traite une semaine spécifique, on limite les cours sélectionnés -        # à ceux qui commencent entre le début du traitement et la fin de la semaine +        # Si jamais on traite une semaine spécifique, on limite les +        # cours sélectionnés à ceux qui commencent entre le début du +        # traitement et la fin de la semaine          last_update_date = last_update_date.filter(begin__lt=end) -    last_update_date = last_update_date.aggregate(Min("last_update")) \ -                       ["last_update__min"] +    last_update_date = last_update_date \ +        .aggregate(Min("last_update"))["last_update__min"]      # Date de mise à jour de Celcat, utilisée à des fins de statistiques      new_update_date = get_update_date(soup) -    # On ne fait pas la mise à jour si jamais la dernière date de MàJ est plus récente -    # que celle indiquée par Celcat. -    # Attention, le champ last_update de la classe Course représente l’heure à laquelle -    # le cours a été inséré dans la base de données, et non pas la date indiquée par -    # Celcat. -    if not force and last_update_date is not None and new_update_date is not None and \ -       last_update_date >= new_update_date: +    # On ne fait pas la mise à jour si jamais la dernière date de MàJ +    # est plus récente que celle indiquée par Celcat.  Attention, le +    # champ last_update de la classe Course représente l’heure à +    # laquelle le cours a été inséré dans la base de données, et non +    # pas la date indiquée par Celcat. +    if not force and last_update_date is not None and \ +       new_update_date is not None and last_update_date >= new_update_date:          return      if year is not None and week is not None: @@ -78,7 +83,8 @@ def process_timetable_week(source, soup, weeks_in_soup, force, year=None, week=N          # présente dans Celcat et maintenant.          delete_from = min(weeks_in_soup.values())          if not force: -            # Si jamais on force la MàJ, on efface tout à partir de la première semaine +            # Si jamais on force la MàJ, on efface tout à partir de la +            # première semaine              delete_from = max(delete_from, today)          Course.objects.filter(source=source, begin__gte=delete_from).delete() @@ -91,13 +97,15 @@ def process_timetable_week(source, soup, weeks_in_soup, force, year=None, week=N      source.last_update_date = new_update_date      source.save() +  def process_timetable(source, force, year=None, weeks=None):      soup = get_xml(source.url)      weeks_in_soup = get_weeks(soup)      if year is not None and weeks is not None:          for week in weeks: -            process_timetable_week(source, soup, weeks_in_soup, force, year, week) +            process_timetable_week(source, soup, weeks_in_soup, force, +                                   year, week)      else:          process_timetable_week(source, soup, weeks_in_soup, force) @@ -106,9 +114,12 @@ class Command(BaseCommand):      help = "Fetches registered celcat timetables"      def add_arguments(self, parser): -        parser.add_argument("--all", const=True, default=False, action="store_const") -        parser.add_argument("--force", const=True, default=False, action="store_const") -        parser.add_argument("--week", type=int, choices=range(1, 54), nargs="+") +        parser.add_argument("--all", const=True, default=False, +                            action="store_const") +        parser.add_argument("--force", const=True, default=False, +                            action="store_const") +        parser.add_argument("--week", type=int, choices=range(1, 54), +                            nargs="+")          parser.add_argument("--year", type=int, nargs=1)      def handle(self, *args, **options): @@ -120,7 +131,8 @@ class Command(BaseCommand):          elif options["week"] is None:              _, week, day = tz_now().isocalendar()              if day >= 6: -                year, week, _ = (tz_now() + datetime.timedelta(weeks=1)).isocalendar() +                year, week, _ = (tz_now() + datetime.timedelta(weeks=1)) \ +                                                            .isocalendar()              weeks = [week]          else:              weeks = options["week"] @@ -132,7 +144,8 @@ class Command(BaseCommand):                  year = options["year"][0]          for source in Source.objects.all(): -            self.stdout.write("Processing {0}".format(source.formatted_timetables)) +            self.stdout.write("Processing {0}".format( +                source.formatted_timetables))              try:                  process_timetable(source, options["force"], year, weeks) @@ -140,7 +153,8 @@ class Command(BaseCommand):                  break              except Exception:                  self.stderr.write( -                    self.style.ERROR("Failed to process {0}:".format(source.formatted_timetables)) +                    self.style.ERROR("Failed to process {0}:".format( +                        source.formatted_timetables))                  )                  self.stderr.write(self.style.ERROR(traceback.format_exc()))                  errcount += 1 @@ -148,4 +162,5 @@ class Command(BaseCommand):          if errcount == 0:              self.stdout.write(self.style.SUCCESS("Done."))          else: -            self.stdout.write(self.style.ERROR("Done with {0} errors.".format(errcount))) +            self.stdout.write(self.style.ERROR("Done with {0} errors.".format( +                errcount))) | 
