diff options
| -rw-r--r-- | admin.py | 8 | ||||
| -rw-r--r-- | forms.py | 20 | ||||
| -rw-r--r-- | management/commands/sendmails.py | 67 | ||||
| -rw-r--r-- | models.py | 24 | ||||
| -rw-r--r-- | templates/mail/mail_confirm.txt | 9 | ||||
| -rw-r--r-- | templates/mail/mail_footer.txt | 2 | ||||
| -rw-r--r-- | templates/mail/mail_timetable.txt | 7 | ||||
| -rw-r--r-- | templates/mail/mail_unsubscribed.txt | 2 | ||||
| -rw-r--r-- | templates/subscribe.html | 15 | ||||
| -rw-r--r-- | templates/timetable.html | 5 | ||||
| -rw-r--r-- | urls.py | 3 | ||||
| -rw-r--r-- | views.py | 51 | 
12 files changed, 4 insertions, 209 deletions
| @@ -14,7 +14,7 @@  #    along with celcatsanitizer.  If not, see <http://www.gnu.org/licenses/>.  from django.contrib import admin -from .models import Timetable, LastUpdate, Group, Subscription, Room, Course, Year +from .models import Timetable, LastUpdate, Group, Room, Course, Year  @admin.register(Year) @@ -46,12 +46,6 @@ class GroupAdmin(admin.ModelAdmin):      readonly_fields = ("celcat_name", "mention", "subgroup", "td", "tp",) -@admin.register(Subscription) -class SubscriptionAdmin(admin.ModelAdmin): -    list_display = ("email", "group", "active",) -    readonly_fields = ("token",) - -  @admin.register(Room)  class RoomAdmin(admin.ModelAdmin):      pass diff --git a/forms.py b/forms.py deleted file mode 100644 index edf584b..0000000 --- a/forms.py +++ /dev/null @@ -1,20 +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 <http://www.gnu.org/licenses/>. - -from django import forms - - -class SubscribeForm(forms.Form): -    email = forms.EmailField(label="Adresse email") 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 <http://www.gnu.org/licenses/>. - -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.")) @@ -20,9 +20,6 @@ from django.utils.text import slugify  from .utils import parse_group -import hashlib -import os -  class Year(models.Model):      name = models.CharField(max_length=16, verbose_name="année") @@ -118,27 +115,6 @@ class Group(models.Model):          verbose_name_plural = "groupes" -class Subscription(models.Model): -    email = models.EmailField(verbose_name="adresse") -    group = models.ForeignKey(Group, on_delete=models.CASCADE, verbose_name="groupe") -    active = models.BooleanField(verbose_name="activé", default=False, db_index=True) -    token = models.CharField(max_length=64, unique=True, default="") - -    def __str__(self): -        return "{0} - {1}".format(self.email, self.group) - -    def save(self, *args, **kwargs): -        if self.token == "": -            self.token = hashlib.sha1(os.urandom(128)).hexdigest() -        super(Subscription, self).save(*args, **kwargs) - - -    class Meta: -        unique_together = ("email", "group",) -        verbose_name = "abonnement" -        verbose_name_plural = "abonnements" - -  class Room(models.Model):      name = models.CharField(max_length=255, unique=True, verbose_name="nom") diff --git a/templates/mail/mail_confirm.txt b/templates/mail/mail_confirm.txt deleted file mode 100644 index 14fe33c..0000000 --- a/templates/mail/mail_confirm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Vous avez été abonné à l’emploi du temps {{ group.timetable }} - {{ group }} - -Pour valider l’abonnement, suivez ce lien : {{ domain }}{% url "confirm" token %} - -Si vous pensez que vous avez été abonné par erreur, suivez ce lien : {{ domain }}{% url "cancel" token %} - -Vous ne recevrez aucun mail tant que vous n'avez pas validé votre abonnement. - -{% include "mail/mail_footer.txt" %} diff --git a/templates/mail/mail_footer.txt b/templates/mail/mail_footer.txt deleted file mode 100644 index b39f738..0000000 --- a/templates/mail/mail_footer.txt +++ /dev/null @@ -1,2 +0,0 @@ -Pour vous désinscrire de cet emploi du temps, suivez ce lien : {{ domain }}{% url "cancel" token %} -Pour contacter l’administrateur du service, envoyez un mail à cette adresse : {{ admins|first|last }} diff --git a/templates/mail/mail_timetable.txt b/templates/mail/mail_timetable.txt deleted file mode 100644 index 524611e..0000000 --- a/templates/mail/mail_timetable.txt +++ /dev/null @@ -1,7 +0,0 @@ -{% load rooms %}{% autoescape off %}{% for day in courses %}{% filter title %}{{ day.0.begin|date:"l j F o" }}{% endfilter %} - de {{ day.0.begin|date:"H:i" }} à {% with day|last as last %}{{ last.end|date:"H:i" }}{% endwith %} -{% for course in day %} * {{ course }} ({{ course.type }}), de {{ course.begin|date:"H:i" }} à {{ course.end|date:"H:i" }}{% if course.rooms.all|length > 0 %} -   {{ course.rooms.all|format_rooms }}{% endif %}{% if course.notes != "" and course.notes is not None %} -   Remarques : {{ course.notes }}{% endif %} - -{% endfor %}{% empty %}Aucun cours pour le groupe {{ group }} pendant la semaine {{ week }}. -{% endfor %}{% endautoescape %} diff --git a/templates/mail/mail_unsubscribed.txt b/templates/mail/mail_unsubscribed.txt deleted file mode 100644 index 8d75ccf..0000000 --- a/templates/mail/mail_unsubscribed.txt +++ /dev/null @@ -1,2 +0,0 @@ -Vous avez été désabonné de l’emploi du temps {{ group.timetable.name }} - {{ group.name }} -Notez que si vous vous êtes abonné à un autre emploi du temps, vous recevrez toujours les mails de ceux-ci. diff --git a/templates/subscribe.html b/templates/subscribe.html deleted file mode 100644 index 08b27a8..0000000 --- a/templates/subscribe.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "index.html" %} - -{% block title %}S’abonner à {{ group.timetable }} – {{ group }}{% endblock %} - -{% block body %} -      <h2>S'abonner à {{ group.timetable }} – {{ group }}</h2> -      <form action="{% url "subscribe" group.timetable.year.slug group.timetable.slug group.slug year week %}" method="post"> -        {% csrf_token %} -        {{ form }} -        <input type="submit" value="S'abonner" /> -      </form> -      <p>Après l’abonnement, vous allez recevoir un mail avec un lien de confirmation. Aucun autre mail ne vous sera envoyé si vous n'avez pas validé votre abonnement.<br /> -      Vous pouvez vous désabonner à tout moment à l’aide d'un lien contenu dans tout les mails que nous vous enverrons.<br /> -      Nous ne partageons votre adresse à qui que se soit. Lorsque vous vous désabonnez, votre adresse est effacée de nos serveurs.</p> -{% endblock %} diff --git a/templates/timetable.html b/templates/timetable.html index 5428942..f4b8719 100644 --- a/templates/timetable.html +++ b/templates/timetable.html @@ -6,7 +6,4 @@        <h2>{{ group.timetable }} – {{ group }} – Semaine {{ week }}</h2>        <p>Dernière mise à jour le {{ last_update|date:"l j F o" }} à {{ last_update|date:"H:i" }}</p>        {% include "timetable_common.html" %} -      <p class="subscribe"> -        <a href="{% url "ics" group.timetable.year.slug group.timetable.slug group.slug %}">ICS</a> – <a href="{% url "atom" group.timetable.year.slug group.timetable.slug group.slug %}">Atom</a><br /> -        <a href="{% url "subscribe" group.timetable.year.slug group.timetable.slug group.slug year week %}">S’abonner à cet emploi du temps</a> -      </p>{% endblock %} +      <p class="subscribe"><a href="{% url "ics" group.timetable.year.slug group.timetable.slug group.slug %}">ICS</a> – <a href="{% url "atom" group.timetable.year.slug group.timetable.slug group.slug %}">Atom</a><br /></p>{% endblock %} @@ -24,7 +24,4 @@ urlpatterns = [      url(r"^(?P<year_slug>[-\w]+)/(?P<timetable_slug>[-\w]+)/(?P<group_slug>[-\w]+)/calendar.ics$", feeds.IcalFeed(), name="ics"),      url(r"^(?P<year_slug>[-\w]+)/(?P<timetable_slug>[-\w]+)/(?P<group_slug>[-\w]+)/feed.atom$", feeds.AtomFeed(), name="atom"),      url(r"^(?P<year_slug>[-\w]+)/(?P<timetable_slug>[-\w]+)/(?P<group_slug>[-\w]+)/(?P<year>[0-9]{4})/(?P<week>[0-4]?[0-9]|5[0-3])/$", views.timetable, name="timetable"), -    url(r"^(?P<year_slug>[-\w]+)/(?P<timetable_slug>[-\w]+)/(?P<group_slug>[-\w]+)/(?P<year>[0-9]{4})/(?P<week>[0-4]?[0-9]|5[0-3])/subscribe$", views.subscribe, name="subscribe"), -    url(r"^subscriptions/confirm/(?P<token>[0-9a-f]{40})$", views.confirm_subscription, name="confirm"), -    url(r"^subscriptions/cancel/(?P<token>[0-9a-f]{40})$", views.cancel_subscription, name="cancel"),  ] @@ -13,13 +13,9 @@  #    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.shortcuts import get_object_or_404, redirect, render -from django.core.mail import send_mail -from django.conf import settings -from django.template import Context, loader +from django.shortcuts import get_object_or_404, render -from .forms import SubscribeForm -from .models import Timetable, LastUpdate, Group, Subscription, Course, Year +from .models import Timetable, LastUpdate, Group, Course, Year  from .utils import get_current_week, get_week, group_courses  def index(request): @@ -69,46 +65,3 @@ def timetable(request, year_slug, timetable_slug, group_slug, year=None, week=No      grouped_courses = group_courses(courses)      return render(request, "timetable.html", {"group": group, "courses": grouped_courses, "last_update": last_update.date, "year": year, "week": int(week)}) - -def subscribe(request, year_slug, timetable_slug, group_slug, year, week): -    group = get_object_or_404(Group, slug=group_slug, timetable__slug=timetable_slug, timetable__year__slug=year_slug) - -    if request.method == "POST": -        form = SubscribeForm(request.POST) -        if form.is_valid(): -            if not Subscription.objects.filter(email=request.POST["email"], group=group).exists(): -                subscription = Subscription(email=request.POST["email"], group=group) -                subscription.save() - -                template = loader.get_template("mail/mail_confirm.txt") -                context = Context({"group": group, "admins": settings.ADMINS, "token": subscription.token, "domain": settings.DEFAULT_DOMAIN}) -                send_mail("Confirmation de l’abonnemenent", template.render(context), settings.DEFAULT_FROM_EMAIL, [request.POST["email"]]) - -            return redirect("timetable", year_slug=year_slug, timetable_slug=timetable_slug, group_slug=group_slug, year=year, week=int(week)) -    else: -        form = SubscribeForm() - -    return render(request, "subscribe.html", {"year": year, "week": week, "group": group, "form": form}) - -def confirm_subscription(request, token): -    subscription = Subscription.objects.filter(token=token).first() -    year, week = get_current_week() - -    if subscription is not None and not subscription.active: -        subscription.active = True -        subscription.save() - -    return redirect("timetable", timetable_slug=subscription.group.timetable.slug, group_slug=subscription.group.slug, year=year, week=week) - -def cancel_subscription(request, token): -    subscription = Subscription.objects.filter(token=token).first() - -    if subscription is not None: -        group = subscription.group -        subscription.delete() - -        template = loader.get_template("mail/mail_unsubscribed.txt") -        context = Context({"group": group}) -        send_mail("Confirmation de la désinscription", template.render(context), settings.DEFAULT_FROM_EMAIL, [subscription.email]) - -    return redirect("index") | 
