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&nbsp;:</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&nbsp;:<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