From dc272aad09f15273a930345f33943580b2a8a1f3 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 7 Sep 2017 19:54:03 +0200 Subject: Ajout d’un champ permettant de stocker la date de mise à jour du calendrier celcat dans le modèle LastUpdate, ainsi que de quoi la lire depuis le XML --- management/commands/_private.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'management/commands') diff --git a/management/commands/_private.py b/management/commands/_private.py index c31eb34..f7f8435 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -21,6 +21,8 @@ from edt.models import Group, Room, Course from edt.utils import get_week import datetime +import re + import requests @@ -122,6 +124,29 @@ def get_events(timetable, year, week, soup, weeks_in_soup): yield title, type_, groups, rooms, notes, begin, end +def get_update_date(soup): + # Explication de la regex + # + # (\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+) + # (\d+) au moins un nombre + # / un slash + # (\d+) au moins un nombre + # / un slash + # (\d+) au moins un nombre + # \s+ au moins un espace + # (\d+) au moins un nombre + # : un deux-points + # (\d+) au moins un nombre + # : un deux-points + # (\d+) au moins un nombre + datetime_regex = re.compile("(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+)") + search = datetime_regex.search(soup.footer.text) + if search is None: + return None + + day, month, year, hour, minute, second = [int(v) for v in search.groups()] + return datetime.datetime(year, month, day, hour, minute, second) + def get_weeks(soup): weeks = {} for span in soup.find_all("span"): -- cgit v1.2.1 From bd236d267bfa6857d062733899ca6db5231ddd1d Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 7 Sep 2017 20:04:10 +0200 Subject: On rend la date de MàJ retournée au courant de la tz --- management/commands/_private.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'management/commands') diff --git a/management/commands/_private.py b/management/commands/_private.py index f7f8435..d54d81b 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -145,7 +145,8 @@ def get_update_date(soup): return None day, month, year, hour, minute, second = [int(v) for v in search.groups()] - return datetime.datetime(year, month, day, hour, minute, second) + date = datetime.datetime(year, month, day, hour, minute, second) + return timezone.make_aware(date) def get_weeks(soup): weeks = {} -- cgit v1.2.1 From 1a605b7390fadd1ad65128590aca9d30743a0510 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 7 Sep 2017 20:22:55 +0200 Subject: On ne parse pas le contenu de l’emploi du temps si la date de mise à jour est égale ou inférieure à celle stockée en base de données. --- management/commands/timetables.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'management/commands') diff --git a/management/commands/timetables.py b/management/commands/timetables.py index d596233..7f33be1 100644 --- a/management/commands/timetables.py +++ b/management/commands/timetables.py @@ -17,16 +17,29 @@ from django.core.management.base import BaseCommand from django.db import transaction from django.utils import timezone -from edt.models import Timetable, LastUpdate, Course -from ._private import delete_courses_in_week, get_events, get_weeks, get_xml +from edt.models import Timetable, LastUpdate, Course +from ._private import delete_courses_in_week, get_events, get_update_date, get_weeks, get_xml import datetime @transaction.atomic def process_timetable_week(timetable, year, week, soup, weeks_in_soup): + last_update_date = None + new_update_date = get_update_date(soup) + try: + last_update = LastUpdate.objects.get(timetable=timetable, year=year, week=week) + last_update_date = last_update.updated_at + except: + last_update = LastUpdate.objects(timetable=timetable, year=year, week=week) + + if last_update_date is not None and new_update_date is not None and \ + last_update_date >= new_update_date: + 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): + 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_ @@ -38,14 +51,9 @@ def process_timetable_week(timetable, year, week, soup, weeks_in_soup): course.save() - date = timezone.make_aware(datetime.datetime.now()) - try: - last_update = LastUpdate.objects.get(timetable=timetable, year=year, week=week) - last_update.date = date - except: - last_update = LastUpdate(timetable=timetable, year=year, week=week, date=date) - finally: - last_update.save() + last_update.date = timezone.make_aware(datetime.datetime.now()) + last_update.updated_at = new_update_date + last_update.save() def process_timetable(timetable, year, weeks): soup = get_xml(timetable.url) -- cgit v1.2.1 From 702ed90e13396bd999079d22f03a40e4daf93a54 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 7 Sep 2017 20:28:48 +0200 Subject: Correction de la création de l’objet LastUpdate --- management/commands/timetables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'management/commands') diff --git a/management/commands/timetables.py b/management/commands/timetables.py index 7f33be1..64dd6f6 100644 --- a/management/commands/timetables.py +++ b/management/commands/timetables.py @@ -31,7 +31,7 @@ def process_timetable_week(timetable, year, week, soup, weeks_in_soup): last_update = LastUpdate.objects.get(timetable=timetable, year=year, week=week) last_update_date = last_update.updated_at except: - last_update = LastUpdate.objects(timetable=timetable, year=year, week=week) + last_update = LastUpdate(timetable=timetable, year=year, week=week) if last_update_date is not None and new_update_date is not None and \ last_update_date >= new_update_date: -- cgit v1.2.1 From 49e56d97e5a126f66d1d52b5de45befe603893b2 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 7 Sep 2017 23:31:54 +0200 Subject: Remplacement de la licence GPL 2 par la licence AGPL 3 --- management/commands/_private.py | 13 ++++++------- management/commands/cleancourses.py | 13 ++++++------- management/commands/listtimetables.py | 13 ++++++------- management/commands/sendmails.py | 13 ++++++------- management/commands/timetables.py | 13 ++++++------- 5 files changed, 30 insertions(+), 35 deletions(-) (limited to 'management/commands') diff --git a/management/commands/_private.py b/management/commands/_private.py index d54d81b..17896c4 100644 --- a/management/commands/_private.py +++ b/management/commands/_private.py @@ -1,18 +1,17 @@ # Copyright (C) 2017 Alban Gruin # -# celcatsanitizer is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# celcatsanitizer is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # celcatsanitizer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Affero General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with celcatsanitizer; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU Affero General Public License +# along with celcatsanitizer. If not, see . from bs4 import BeautifulSoup from django.utils import timezone diff --git a/management/commands/cleancourses.py b/management/commands/cleancourses.py index 5f71861..ca2ef94 100644 --- a/management/commands/cleancourses.py +++ b/management/commands/cleancourses.py @@ -1,18 +1,17 @@ # Copyright (C) 2017 Alban Gruin # -# celcatsanitizer is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# celcatsanitizer is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # celcatsanitizer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Affero General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with celcatsanitizer; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU Affero General Public License +# along with celcatsanitizer. If not, see . from django.core.management.base import BaseCommand from django.db import transaction diff --git a/management/commands/listtimetables.py b/management/commands/listtimetables.py index e4b782f..a82db23 100644 --- a/management/commands/listtimetables.py +++ b/management/commands/listtimetables.py @@ -1,18 +1,17 @@ # Copyright (C) 2017 Alban Gruin # -# celcatsanitizer is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# celcatsanitizer is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # celcatsanitizer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Affero General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with celcatsanitizer; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU Affero General Public License +# along with celcatsanitizer. If not, see . from django.core.management.base import BaseCommand from edt.models import Timetable diff --git a/management/commands/sendmails.py b/management/commands/sendmails.py index c7725b7..e81980b 100644 --- a/management/commands/sendmails.py +++ b/management/commands/sendmails.py @@ -1,18 +1,17 @@ # Copyright (C) 2017 Alban Gruin # -# celcatsanitizer is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# celcatsanitizer is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # celcatsanitizer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Affero General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with celcatsanitizer; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU Affero General Public License +# along with celcatsanitizer. If not, see . from django.core.management.base import BaseCommand from django.core.mail import send_mass_mail diff --git a/management/commands/timetables.py b/management/commands/timetables.py index 64dd6f6..c82b0e4 100644 --- a/management/commands/timetables.py +++ b/management/commands/timetables.py @@ -1,18 +1,17 @@ # Copyright (C) 2017 Alban Gruin # -# celcatsanitizer is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# celcatsanitizer is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # celcatsanitizer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Affero General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with celcatsanitizer; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU Affero General Public License +# along with celcatsanitizer. If not, see . from django.core.management.base import BaseCommand from django.db import transaction -- cgit v1.2.1 From 5e6049ca24670f41f9fa6335ea49c389c3133b86 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 8 Sep 2017 12:05:34 +0200 Subject: Le tri du nom des emplois du temps est fait en fonction de l’année puis de la mention --- management/commands/listtimetables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'management/commands') diff --git a/management/commands/listtimetables.py b/management/commands/listtimetables.py index a82db23..6df7ba5 100644 --- a/management/commands/listtimetables.py +++ b/management/commands/listtimetables.py @@ -28,7 +28,7 @@ class Command(BaseCommand): if options["order_by_id"]: timetables = timetables.order_by("id") else: - timetables = timetables.order_by("name") + timetables = timetables.order_by("year__name", "name") for timetable in timetables: self.stdout.write("{0} (id: {1})".format(timetable, timetable.id)) -- cgit v1.2.1 From 7eee2b573efd3eefb89545f6d6682216801c9126 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Fri, 8 Sep 2017 12:07:41 +0200 Subject: Suppression des .name dans sendmails --- management/commands/sendmails.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'management/commands') diff --git a/management/commands/sendmails.py b/management/commands/sendmails.py index e81980b..3c0fab0 100644 --- a/management/commands/sendmails.py +++ b/management/commands/sendmails.py @@ -58,7 +58,7 @@ class Command(BaseCommand): if not options["test"]: context = Context({"admins": settings.ADMINS, "token": subscription.token, "domain": settings.DEFAULT_DOMAIN}) mail_content = content[subscription.group.id] + footer.render(context) - mails.append(("{0} - {1} - Semaine {2}".format(subscription.group.timetable.name, subscription.group.name, week), mail_content, settings.DEFAULT_FROM_EMAIL, [subscription.email],)) + mails.append(("{0} - {1} - Semaine {2}".format(subscription.group.timetable, subscription.group, week), mail_content, settings.DEFAULT_FROM_EMAIL, [subscription.email],)) if not options["test"]: print("Sending mails...") -- cgit v1.2.1 From c7fce37ad4c8dee76f5d58eafefd0c73a03ea00c Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sat, 9 Sep 2017 14:56:17 +0200 Subject: Suppression de l’envoi des mails --- management/commands/sendmails.py | 67 ---------------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 management/commands/sendmails.py (limited to 'management/commands') diff --git a/management/commands/sendmails.py b/management/commands/sendmails.py deleted file mode 100644 index 3c0fab0..0000000 --- a/management/commands/sendmails.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (C) 2017 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 -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# celcatsanitizer is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with celcatsanitizer. If not, see . - -from django.core.management.base import BaseCommand -from django.core.mail import send_mass_mail -from django.utils import translation -from django.template import Context, loader -from django.conf import settings - -from edt.models import Course, Subscription -from edt.utils import get_current_or_next_week, get_week, group_courses - - -class Command(BaseCommand): - help = "Sends emails to subscribed users" - - def add_arguments(self, parser): - parser.add_argument("--test", help="Print the content of mails instead of sending them", action="store_true") - - def handle(self, *args, **options): - translation.activate(settings.LANGUAGE_CODE) - - year, week = get_current_or_next_week() - start, end = get_week(year, week) - - subscriptions = Subscription.objects.filter(active=True) - content = {} - mails = [] - - footer = loader.get_template("mail/mail_footer.txt") - timetable = loader.get_template("mail/mail_timetable.txt") - - print("Generating messages...") - for subscription in subscriptions: - if subscription.group.id not in content: - courses = Course.objects.get_courses_for_group(subscription.group, begin__gte=start, begin__lt=end) - - grouped_courses = group_courses(courses) - context = Context({"courses": grouped_courses, "group": subscription.group, "week": week}) - content[subscription.group.id] = timetable.render(context) - - if options["test"]: - print(subscription.group) - print(content[subscription.group.id]) - - if not options["test"]: - context = Context({"admins": settings.ADMINS, "token": subscription.token, "domain": settings.DEFAULT_DOMAIN}) - mail_content = content[subscription.group.id] + footer.render(context) - mails.append(("{0} - {1} - Semaine {2}".format(subscription.group.timetable, subscription.group, week), mail_content, settings.DEFAULT_FROM_EMAIL, [subscription.email],)) - - if not options["test"]: - print("Sending mails...") - send_mass_mail(mails) - - self.stdout.write(self.style.SUCCESS("Done.")) -- cgit v1.2.1