From d2edd11f33c0d3244ef2e8ae54ce7f2549406037 Mon Sep 17 00:00:00 2001 From: Dorian Lesbre <dorian.lesbre@gmail.com> Date: Sun, 21 Mar 2021 11:53:28 +0100 Subject: [PATCH] Added start/end info date and global messages --- accounts/templates/profile.html | 13 +++++++- home/templates/admin.html | 10 +++++-- home/templates/base.html | 9 ++++-- home/templates/home.html | 19 ++++++++++++ home/templates/inscription/closed.html | 19 +++++++++--- home/templates/inscription/form.html | 9 +++++- home/templates/inscription/signin.html | 3 ++ home/urls.py | 1 + home/views.py | 41 ++++++++++++++++++++++++++ interludes/settings.py | 5 +++- site_settings/models.py | 29 +++++++++++++++++- 11 files changed, 145 insertions(+), 13 deletions(-) diff --git a/accounts/templates/profile.html b/accounts/templates/profile.html index 985b8ef..9c22d9c 100644 --- a/accounts/templates/profile.html +++ b/accounts/templates/profile.html @@ -15,6 +15,9 @@ {% if user.profile.is_registered %} <strong>Mon inscription :</strong> + {% if settings.inscriptions_open and settings.inscriptions_end %} + modifiable jusqu'au {{ settings.inscriptions_end|date:"l d F Y à H:i" }} + {% endif %} <ul> <li>{% if user.profile.sleeps %}Inscrit pour dormir sur place{% else %}Ne dors pas sur place{% endif %}</li> <!--<li>{% if user.profile.mug %}Commande une tasse{% else %}Ne commande pas de tasse{% endif %}</li>--> @@ -50,7 +53,15 @@ <strong>Vous n'êtes pas incrit à l'événement.</strong> {% if not settings.inscriptions_open %} - <p>Les inscriptions ne sont pas encore ouvertes ou ont été fermées.</p> + {% if settings.inscriptions_not_open_yet %} + <p>Les inscriptions ne sont pas encores ouvertes. Elles ouvrirons le <strong>{{ settings.inscriptions_start|date:"l d F Y à H:i" }}</strong>.</p> + {% elif settings.inscriptions_have_closed %} + <p>Les inscriptions sont fermées.</p> + {% else %} + <p>Les inscriptions ne sont pas encores ouvertes ou ont été fermées.</p> + {% endif %} + {% elif settings.inscriptions_end %} + <p>les inscriptions sont ouvertes jusqu'au {{ settings.inscriptions_end|date:"l d F Y à H:i" }}).</p> {% endif %} <br><br> {% endif %} diff --git a/home/templates/admin.html b/home/templates/admin.html index c7337fd..dc55882 100644 --- a/home/templates/admin.html +++ b/home/templates/admin.html @@ -20,9 +20,15 @@ <ul> <li>La création de compte est {% if settings.registrations_open %}ouverte{% else %}fermée{% endif %}.</li> - <li>Les inscriptions sont {% if settings.inscriptions_open %}ouvertes{% else %}fermées{% endif %}.</li> + <li>Les inscriptions sont {% if settings.inscriptions_open %}ouvertes{% else %}fermées{% endif %}. Dates informatives: + <ul> + <li>Ouverture : {{ settings.inscriptions_start|default:"non fixée" }}</li> + <li>Fermeture : {{ settings.inscriptions_end|default:"non fixée" }}</li> + </ul> + </li> <li>Le planning {% if settings.display_planning %}est affiché{% else %}n'est pas affiché{% endif %}.</li> <li>La répartition des activités {% if settings.activities_allocated %}est effectuée et affichée{% else %}n'est pas faite/affichée{% endif %}.</li> + <li>{% if settings.global_message %}Un message global est affiché{% else %}Aucun message global{% endif %}.</li> </ul> <h2>Métriques</h2> @@ -128,7 +134,7 @@ if (confirm( `${errors}Cette action va envoyer {{ user_email_nb }} emails.\nÊtes-vous sur de vouloir continuer ?` )) - window.location = "{% url 'home' %}"; + window.location = "{% url 'email_users' %}"; } {% endif %} {% if not settings.orga_notified %} diff --git a/home/templates/base.html b/home/templates/base.html index f883b0c..752376f 100644 --- a/home/templates/base.html +++ b/home/templates/base.html @@ -84,11 +84,14 @@ </nav> <main> - {% if messages %} + {% if messages or settings.global_message %} <ul class="messagelist"> - {% for message in messages %} + {% for message in messages %} <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> - {% endfor %} + {% endfor %} + {% if settings.global_message %} + <li class="info">{{ settings.global_message }}</li> + {% endif %} </ul> {% endif %} diff --git a/home/templates/home.html b/home/templates/home.html index 398b90f..d370fe0 100644 --- a/home/templates/home.html +++ b/home/templates/home.html @@ -16,4 +16,23 @@ il a été retardé et est prévu le week-end du vendredi 9 au dimanche 11 avril 2021. </p> + <h2>Inscriptions</h2> + + <p> + Ce site vous permettra de vous inscrire à l'événement et + de voir les activités qui y seront proposées. Cette année l'événement est + <strong>gratuir</strong> car entièrement financé par le + <a class="external" href="https://cof.ens.fr/">COF</a> (cela n'inclut pas + les éventuels frais de transport). + </p> + {% if settings.inscriptions_start and settings.inscriptions_end %} + <p>Les inscriptions seront ouvertes + du <strong>{{ settings.inscriptions_start|date:"l d F Y à H:i" }}</strong> + au <strong>{{ settings.inscriptions_end|date:"l d F Y à H:i" }}</strong>. + </p> + {% elif settings.inscriptions_start %} + <p>Les inscriptions ouvrirons le <strong>{{ settings.inscriptions_start|date:"l d F Y à H:i" }}</strong>.</p> + {% elif settings.inscriptions_end %} + <p>Les inscriptions fermerons le <strong>{{ settings.inscriptions_end|date:"l d F Y à H:i" }}</strong>.</p> + {% endif %} {% endblock %} diff --git a/home/templates/inscription/closed.html b/home/templates/inscription/closed.html index d17d4c0..66e5dba 100644 --- a/home/templates/inscription/closed.html +++ b/home/templates/inscription/closed.html @@ -4,8 +4,19 @@ {% block "content" %} <h2>Inscriptions</h2> - <p> - Les inscriptions ne sont pas encores ouvertes. - Nous communiquerons pas mail via les BDE des différentes écoles pour leur ouverture. - </p> + {% if settings.inscriptions_not_open_yet %} + <p>Les inscriptions ne sont pas encores ouvertes.</p> + <p>Leur ouverture est prévue le <strong>{{ settings.inscriptions_start|date:"l d F Y à H:i" }}</strong>.</p> + <p>Nous communiquerons pas mail via les BDE des différentes écoles pour leur ouverture.</p> + {% elif settings.inscriptions_have_closed %} + <p>Les inscriptions sont fermées.</p> + {% if settings.contact_email %} + <p>Pour tout problème, contacter :<br><span class="antispam">{{ settings.contact_email_reversed }}</span></p> + {% endif %} + {% else %} + <p> + Les inscriptions ne sont pas encores ouvertes ou ont été fermées. + Nous communiquerons pas mail via les BDE des différentes écoles pour leur ouverture. + </p> + {% endif %} {% endblock %} diff --git a/home/templates/inscription/form.html b/home/templates/inscription/form.html index 5f248f0..701e084 100644 --- a/home/templates/inscription/form.html +++ b/home/templates/inscription/form.html @@ -38,7 +38,14 @@ <h3>Choix d'activités</h3> <p>Saissisez les activités auquelles vous voulez vous inscrire, par ordre de préférence.</p> - <p>Vous pouvez revenir modifier votre choix jusqu'à la fermeture des inscriptions.</p> + <p> + Vous pouvez revenir modifier votre choix jusqu'à la fermeture des + inscriptions{% if settings.inscriptions_end %} (le {{ settings.inscriptions_end|date:"l d F Y à H:i" }}){% endif %}. + </p> + <p>Si vous vous inscrivez à une activité qui nécessite préparation, nous communiquerons + votre email aux orgas pour qu'iels puissent vous contacter. + </p> + {% if formset.non_form_errors %} {{ formset.non_form_errors }} diff --git a/home/templates/inscription/signin.html b/home/templates/inscription/signin.html index 2bbfb5c..02f2e4a 100644 --- a/home/templates/inscription/signin.html +++ b/home/templates/inscription/signin.html @@ -7,4 +7,7 @@ <p>Vous devez être connecté pour pouvoir vous inscrire à l'événement.</p> <p>Aller à la page de <a href="{% url 'accounts:login' %}">connexion</a> pour vous connectez ou à celle de <a href="{% url 'accounts:create' %}">création de compte</a> si vous n'avez pas de compte.</p> + {% if settings.inscriptions_end %} + <p>Les inscriptions seront ouvertes jusqu'au {{ settings.inscriptions_end|date:"l d F Y à H:i" }})</p> + {% endif %} {% endblock %} diff --git a/home/urls.py b/home/urls.py index 727d821..40addbf 100644 --- a/home/urls.py +++ b/home/urls.py @@ -17,6 +17,7 @@ urlpatterns = [ path('export/activities/', views.ExportActivities.as_view(), name="activities.csv"), path('export/participants/', views.ExportParticipants.as_view(), name="participants.csv"), path('export/activity_choices/', views.ExportActivityChoices.as_view(), name="activity_choices.csv"), + path('email/send_user_emails_0564946523/', views.SendUserEmail.as_view(), name="email_users"), path( 'sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap' diff --git a/home/views.py b/home/views.py index da0c131..a3f604f 100644 --- a/home/views.py +++ b/home/views.py @@ -1,11 +1,14 @@ from datetime import timedelta +from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.sitemaps import Sitemap +from django.core.mail import mail_admins, send_mass_mail from django.db.models import Count from django.forms import formset_factory from django.shortcuts import redirect, render +from django.template.loader import render_to_string from django.urls import reverse from django.views.generic import RedirectView, UpdateView, TemplateView, View @@ -318,6 +321,44 @@ class ExportActivityChoices(SuperuserRequiredMixin, CSVWriteView): ]) return rows +class SendUserEmail(SuperuserRequiredMixin, RedirectView): + """Envoie aux utilisateurs leur repartition d'activité""" + pattern_name = "site_admin" + from_address = settings.DEFAULT_FROM_EMAIL + + def get_emails(self): + """genere les mails a envoyer""" + # on envoie qu'au participant qui se sont inscrit à des activites + participants = ActivityList.objects.filter( + participant__is_registered=True + ).values("participant").distinct() + emails = [] + for p in participants: + participant = InterludesParticipant.objects.get(id = p["participant"]) + messages = render_to + emails.append(( + "Vos activités interludes", # subject + message, + self.from_address, # From: + [participant.user.email] # To: + )) + return emails + + def send_emails(self): + settings = SiteSettings.load() + if settings.user_notified: + messages.error(self.request, "Les participants ont déjà reçu un mail annonçant la répartition. Modifiez les réglages pour en envoyer un autre") + return + settings.user_notified = True + settings.save() + messages.success(self.request, "Email aux utilisateurs envoyé") + send + + def get_redirect_url(self, *args, **kwargs): + self.send_emails() + return reverse(self.pattern_name) + + # ============================== # Sitemap # ============================== diff --git a/interludes/settings.py b/interludes/settings.py index 25e9b60..bc4426f 100644 --- a/interludes/settings.py +++ b/interludes/settings.py @@ -25,7 +25,7 @@ SECRET_KEY = 'tx$xi%n!8cghirp377zb)gd24g#=&w*ik(bx2h(i8ji0_&9_5l' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ADMINS = [("respos", "respointerludes2021@ens.psl.eu"),] +ADMINS = [("respos", "respointerludes21@ens.psl.eu"),] ALLOWED_HOSTS = [] @@ -143,3 +143,6 @@ LOGIN_REDIRECT_URL = "accounts:profile" # This will display emails in Console. # FIXME: remove in production EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + +# Prefix to mails to admins +EMAIL_SUBJECT_PREFIX = '[DJANGO WEBLUDES] ' diff --git a/site_settings/models.py b/site_settings/models.py index 9d19d60..e24f736 100644 --- a/site_settings/models.py +++ b/site_settings/models.py @@ -1,5 +1,6 @@ from django.db import models from django.core.cache import cache +from django.utils.timezone import now class SingletonModel(models.Model): """Table de la BDD qui ne possède qu'un seul élément""" @@ -39,6 +40,15 @@ class SiteSettings(SingletonModel): registrations_open = models.BooleanField("Ouvrir la création de compte", default=False) inscriptions_open = models.BooleanField("Ouvrir les inscriptions", default=False) + inscriptions_start = models.DateTimeField("Ouverture des inscriptions", + blank=True, null=True, + help_text="Cette date n'est qu'informative. Les inscription s'ouvrent via la checkbox uniquement" + ) + inscriptions_end = models.DateTimeField("Fermeture des inscriptions", + blank=True, null=True, + help_text="Cette date n'est qu'informative. Les inscription se ferment via la checkbox uniquement" + ) + display_planning = models.BooleanField("Afficher le planning", default=False) activities_allocated = models.BooleanField( @@ -57,12 +67,29 @@ class SiteSettings(SingletonModel): help_text="Ce champ existe pour éviter l'envoie de plusieurs mails successifs. Le decocher permet de renvoyer tous les mails" ) + global_message = models.TextField("Message global", blank=True, null=True, + help_text="Message affiché en haut de chaque page (si non vide)" + ) + @property - def contact_email_reversed(self): + def contact_email_reversed(self) -> str: return self.contact_email[::-1] + @property + def inscriptions_not_open_yet(self) -> bool: + if self.inscriptions_start: + return now() <= self.inscriptions_start + return False + + @property + def inscriptions_have_closed(self) -> bool: + if self.inscriptions_end: + return now() >= self.inscriptions_end + return False + class Meta: verbose_name = "paramètres" + verbose_name_plural = "paramètres" def __str__(self) -> str: return "Modifier les paramètres" -- GitLab