diff --git a/accounts/views.py b/accounts/views.py index 14047c091a8febd68a3b4deae8345b96b21ae5c9..aba8c83d29d66b58399757dc43d5b02bd7026a17 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -69,6 +69,10 @@ class ProfileView(LoginRequiredMixin, TemplateView): return context +# ============================== +# Create Account +# ============================== + class CreateAccountView(View): """Vue pour la creation de compte""" diff --git a/home/static/css/style.css b/home/static/css/style.css index 2e0764f10da59bb040eafb1b734160a301c2dfd7..b13a1b9c9f0d74a37dcc87174590e158c50cbc8a 100644 --- a/home/static/css/style.css +++ b/home/static/css/style.css @@ -146,6 +146,25 @@ main a:link { text-decoration: underline; color: rgb(62, 62, 255); } +.lines { + border-top: 2px solid #333; + border-bottom: 2px solid #333; + justify-content: left +} +.stat { + min-width: 120px; + text-align: center; + padding: 5px; +} +.stat .qty { + font-size: 1.2em; +} +.stat .nb_big { + font-size: 3em; +} +.stat .nb_small { + font-size: 2em; +} dl { list-style: none; @@ -173,6 +192,10 @@ span.helptext { .flex { display: flex; } +.wrap { + flex-flow: row wrap; + flex-wrap: wrap; +} .antispam { unicode-bidi: bidi-override; diff --git a/home/urls.py b/home/urls.py index 70f8389e161f583ca0e5eb152878fe4bbcd42959..ae41ff2ff60e9c3ed2c633040cc8a78262169578 100644 --- a/home/urls.py +++ b/home/urls.py @@ -13,6 +13,7 @@ urlpatterns = [ path('activites/', views.ActivityView.as_view(), {"template":"activites.html"}, name = 'activites'), path('faq/', views.FAQView.as_view(), {"template":"faq.html"}, name = 'FAQ'), path('favicon.ico', RedirectView.as_view(url='/static/imgs/favicon.ico')), + path('metrics/', views.MetricsView.as_view(), name="metrics"), path( 'sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap' diff --git a/home/views.py b/home/views.py index aece1365215def25df669601a96ada095663700b..caf6529a37674e5d8b60228e03a1de88bb602b14 100644 --- a/home/views.py +++ b/home/views.py @@ -6,9 +6,16 @@ from django.shortcuts import redirect, render from django.urls import reverse from django.views.generic import RedirectView, UpdateView, TemplateView, View -from home.models import ActivityList, InterludesActivity +from accounts.models import EmailUser +from home.models import ActivityList, InterludesActivity, InterludesParticipant from home.forms import ActivityForm, BaseActivityFormSet, InscriptionForm from site_settings.models import SiteSettings +from shared.views import SuperuserRequiredMixin + + +# ============================== +# Site static pages +# ============================== class HomeView(TemplateView): @@ -32,6 +39,11 @@ class FAQView(TemplateView): template_name = "faq.html" +# ============================== +# Registration +# ============================== + + class RegisterClosed(TemplateView): """Vue pour quand les inscriptions ne sont pas ouvertes""" template_name = "inscription/closed.html" @@ -109,6 +121,46 @@ class UnregisterView(LoginRequiredMixin, RedirectView): return reverse(self.pattern_name) +# ============================== +# Admin views +# ============================== + + +class MetricsView(SuperuserRequiredMixin, TemplateView): + template_name = "metrics.html" + + def get_metrics(self): + registered = InterludesParticipant.objects.filter(is_registered = True) + class metrics: + participants = registered.count() + ulm = registered.filter(school="U").count() + lyon = registered.filter(school="L").count() + rennes = registered.filter(school="R").count() + saclay = registered.filter(school="P").count() + non_registered = EmailUser.objects.filter(is_active=True).count() - participants + + meal1 = registered.filter(meal_friday_evening=True).count() + meal2 = registered.filter(meal_saturday_morning=True).count() + meal3 = registered.filter(meal_saturday_midday=True).count() + meal4 = registered.filter(meal_saturday_evening=True).count() + meal5 = registered.filter(meal_sunday_morning=True).count() + meal6 = registered.filter(meal_sunday_midday=True).count() + meals = meal1 + meal2 + meal3 + meal4 + meal5 + meal6 + + mugs = registered.filter(mug=True).count() + sleeps = registered.filter(sleeps=True).count() + return metrics + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + context["metrics"] = self.get_metrics() + return context + +# ============================== +# Sitemap +# ============================== + + class StaticViewSitemap(Sitemap): """Vue générant la sitemap.xml du site""" changefreq = 'monthly' diff --git a/shared/views.py b/shared/views.py index 91ea44a218fbd2f408430959283f0419c921093e..ae7460b915f7dd9883b846fc1ed2aabbabd538b6 100644 --- a/shared/views.py +++ b/shared/views.py @@ -1,3 +1,10 @@ -from django.shortcuts import render +from django.contrib.auth.mixins import UserPassesTestMixin -# Create your views here. +class SuperuserRequiredMixin(UserPassesTestMixin): + """Classe restreignant l'accès d'une vue aux superusers""" + raise_exception = True + permission_denied_message = "Seul les superutilisateurs ont accès à cette page" + + def test_func(self): + user = self.request.user + return user.is_authenticated and user.is_superuser