aboutsummaryrefslogtreecommitdiff
path: root/management
diff options
context:
space:
mode:
authorAlban Gruin2017-09-09 16:39:30 +0200
committerAlban Gruin2017-09-09 16:39:30 +0200
commit5c96538dfe708c4429d13397caedeb0b84a65b5a (patch)
tree855a9f31cb40a35805129d4f9edd3eac274cc11f /management
parentab9df7a174e2debbf9c644c8ec3e2127eeeaa3cf (diff)
parent60ea5a0e2a5f61f7f764bcf01aafb362781c16da (diff)
Merge branch 'stable/0.9.z' into prod/pa1ch/0.y.z
Diffstat (limited to 'management')
-rw-r--r--management/commands/_private.py39
-rw-r--r--management/commands/cleancourses.py13
-rw-r--r--management/commands/listtimetables.py15
-rw-r--r--management/commands/sendmails.py68
-rw-r--r--management/commands/timetables.py43
5 files changed, 70 insertions, 108 deletions
diff --git a/management/commands/_private.py b/management/commands/_private.py
index c31eb34..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 <http://www.gnu.org/licenses/>.
from bs4 import BeautifulSoup
from django.utils import timezone
@@ -21,6 +20,8 @@ from edt.models import Group, Room, Course
from edt.utils import get_week
import datetime
+import re
+
import requests
@@ -122,6 +123,30 @@ 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()]
+ date = datetime.datetime(year, month, day, hour, minute, second)
+ return timezone.make_aware(date)
+
def get_weeks(soup):
weeks = {}
for span in soup.find_all("span"):
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 <http://www.gnu.org/licenses/>.
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..6df7ba5 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 <http://www.gnu.org/licenses/>.
from django.core.management.base import BaseCommand
from edt.models import Timetable
@@ -29,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))
diff --git a/management/commands/sendmails.py b/management/commands/sendmails.py
deleted file mode 100644
index c7725b7..0000000
--- a/management/commands/sendmails.py
+++ /dev/null
@@ -1,68 +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 General Public License as published by
-# the Free Software Foundation; either version 2 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.
-#
-# 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.
-
-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.name, subscription.group.name, 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."))
diff --git a/management/commands/timetables.py b/management/commands/timetables.py
index d596233..c82b0e4 100644
--- a/management/commands/timetables.py
+++ b/management/commands/timetables.py
@@ -1,32 +1,44 @@
# 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 <http://www.gnu.org/licenses/>.
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(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 +50,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)