From 579a77c0044167078b9b11a397fe7a3cb725c6b8 Mon Sep 17 00:00:00 2001
From: Dorian Lesbre <dorian.lesbre@gmail.com>
Date: Thu, 4 Mar 2021 19:45:39 +0100
Subject: [PATCH] Added core site settings

---
 home/views.py                       | 13 ++++++++-
 interludes/settings.py              |  1 +
 site_settings/admin.py              | 17 ++++++++++-
 site_settings/apps.py               |  1 +
 site_settings/context_processors.py |  4 +++
 site_settings/models.py             | 45 ++++++++++++++++++++++++++++-
 6 files changed, 78 insertions(+), 3 deletions(-)
 create mode 100644 site_settings/context_processors.py

diff --git a/home/views.py b/home/views.py
index 3c96bd8..8f2b646 100644
--- a/home/views.py
+++ b/home/views.py
@@ -1,3 +1,4 @@
+from django.conf import settings
 from django.contrib.sitemaps import Sitemap
 from django.shortcuts import redirect, render
 from django.urls import reverse
@@ -9,19 +10,29 @@ def static_view(request, template):
 	activities = InterludesActivity.objects.filter(display=True).order_by("title")
 	return render(request, template, {'activities': activities})
 
+def sign_up(request):
+	"""Page d'inscription"""
+	if not settings.REGISTRATION_EVENT_INSCRIPTIONS_OPEN:
+		return static_view(request, "inscription.html")
+
+
+
 class StaticViewSitemap(Sitemap):
 	"""Vue générant la sitemap.xml du site"""
 	changefreq = 'monthly'
 
 	def items(self):
+		"""list of pages to appear in sitemap"""
 		return ["home", "inscription", "activites", "FAQ"]
 
 	def location(self, item):
+		"""real url of an item"""
 		return reverse(item)
 
 	def priority(self, obj):
+		"""priority to appear in sitemap"""
 		# Priorize home page over the rest in search results
 		if obj == "home" or obj == "":
 				return 0.8
 		else:
-			return None # defaults to 0.5 when unset
\ No newline at end of file
+			return None # defaults to 0.5 when unset
diff --git a/interludes/settings.py b/interludes/settings.py
index 22c6a01..03b41d8 100644
--- a/interludes/settings.py
+++ b/interludes/settings.py
@@ -66,6 +66,7 @@ TEMPLATES = [
 				'django.template.context_processors.request',
 				'django.contrib.auth.context_processors.auth',
 				'django.contrib.messages.context_processors.messages',
+				'site_settings.context_processors.settings'
 			],
 		},
 	},
diff --git a/site_settings/admin.py b/site_settings/admin.py
index 8c38f3f..8ec1a48 100644
--- a/site_settings/admin.py
+++ b/site_settings/admin.py
@@ -1,3 +1,18 @@
 from django.contrib import admin
 
-# Register your models here.
+from site_settings.models import SiteSettings
+
+class SingletonModelAdmin(admin.ModelAdmin):
+	"""Prevent deletion or adding rows"""
+	actions = None
+
+	def has_add_permission(self, request, obj=None):
+		return False
+
+	def has_delete_permission(self, request, obj=None):
+		return False
+
+@admin.register(SiteSettings)
+class SiteSettingsAdmin(SingletonModelAdmin):
+	list_display = ("contact_email", "date_start", "date_end", "registrations_open", "inscriptions_open",)
+	list_editable = ("registrations_open", "inscriptions_open",)
diff --git a/site_settings/apps.py b/site_settings/apps.py
index 7222c28..4913989 100644
--- a/site_settings/apps.py
+++ b/site_settings/apps.py
@@ -3,3 +3,4 @@ from django.apps import AppConfig
 
 class SiteSettingsConfig(AppConfig):
     name = 'site_settings'
+    verbose_name = "Paramètres du site"
diff --git a/site_settings/context_processors.py b/site_settings/context_processors.py
new file mode 100644
index 0000000..eb33102
--- /dev/null
+++ b/site_settings/context_processors.py
@@ -0,0 +1,4 @@
+from site_settings.models import SiteSettings
+
+def settings(request):
+	return {'settings': SiteSettings.load()}
diff --git a/site_settings/models.py b/site_settings/models.py
index 71a8362..6d7dfb8 100644
--- a/site_settings/models.py
+++ b/site_settings/models.py
@@ -1,3 +1,46 @@
 from django.db import models
+from django.core.cache import cache
 
-# Create your models here.
+class SingletonModel(models.Model):
+	"""Table de la BDD qui ne possède qu'un seul élément"""
+	class Meta:
+		abstract = True
+
+	def save(self, *args, **kwargs):
+		"""save the unique element"""
+		self.pk = 1 # set private key to one
+		super(SingletonModel, self).save(*args, **kwargs)
+		self.set_cache()
+
+	def delete(self, *args, **kwargs):
+		"""can't delete the unique element"""
+		pass
+
+	@classmethod
+	def load(cls):
+		"""load and return the unique element"""
+		if cache.get(cls.__name__) is None:
+			obj, created = cls.objects.get_or_create(pk=1)
+			if not created:
+				obj.set_cache()
+		return cache.get(cls.__name__)
+
+	def set_cache(self):
+		"""save in cache to limit db requests"""
+		cache.set(self.__class__.__name__, self)
+
+
+class SiteSettings(SingletonModel):
+	"""Réglages globaux du site"""
+	contact_email = models.EmailField("Email contact")
+	date_start = models.DateField("Date de début", null=True)
+	date_end = models.DateField("Date de fin", null=True)
+
+	registrations_open = models.BooleanField("Ouvrir la création de compte", default=False)
+	inscriptions_open = models.BooleanField("Ouvrir les inscriptions", default=False)
+
+	class Meta:
+		verbose_name = "paramètres"
+
+	def __str__(self) -> str:
+		return "Réglages"
-- 
GitLab