From 1b2510c7dfa2e5a97ae2e290233f9b4f94e3c818 Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Sat, 11 Jan 2025 13:59:18 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20d'un=20badge=20mod=C3=A9ration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/agenda_culturel/models.py | 26 ++++++++++++++++++ .../templates/agenda_culturel/page.html | 1 + .../templatetags/event_extra.py | 22 +++++++++++++++ src/agenda_culturel/views.py | 27 ++----------------- 4 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index db7e156..211fc96 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -930,6 +930,32 @@ class Event(models.Model): else: return None + def get_nb_not_moderated(first_day, nb_mod_days=21, nb_classes=4): + window_end = first_day + timedelta(days=nb_mod_days) + nb_not_moderated = Event.objects.filter(~Q(status=Event.STATUS.TRASH)). \ + filter(Q(start_day__gte=first_day)&Q(start_day__lte=window_end)). \ + filter( + Q(other_versions__isnull=True) | + Q(other_versions__representative=F('pk')) | + Q(other_versions__representative__isnull=True)).values("start_day").\ + annotate(not_moderated=Count("start_day", filter=Q(moderated_date__isnull=True))). \ + annotate(nb_events=Count("start_day")). \ + order_by("start_day").values("not_moderated", "nb_events", "start_day") + + max_not_moderated = max([x["not_moderated"] for x in nb_not_moderated]) + if max_not_moderated == 0: + max_not_moderated = 1 + nb_not_moderated_dict = dict([(x["start_day"], (x["not_moderated"], x["nb_events"])) for x in nb_not_moderated]) + # add missing dates + date_list = [first_day + timedelta(days=x) for x in range(0, nb_mod_days)] + nb_not_moderated = [{"start_day": d, + "is_today": d == first_day, + "nb_events": nb_not_moderated_dict[d][1] if d in nb_not_moderated_dict else 0, + "not_moderated": nb_not_moderated_dict[d][0] if d in nb_not_moderated_dict else 0} for d in date_list] + nb_not_moderated = [ x | { "note": 0 if x["not_moderated"] == 0 else int((nb_classes - 1) * x["not_moderated"] / max_not_moderated) + 1 } for x in nb_not_moderated] + return [nb_not_moderated[x:x + 7] for x in range(0, len(nb_not_moderated), 7)] + + def nb_draft_events(): return Event.objects.filter(status=Event.STATUS.DRAFT).count() diff --git a/src/agenda_culturel/templates/agenda_culturel/page.html b/src/agenda_culturel/templates/agenda_culturel/page.html index fb36823..29e75b3 100644 --- a/src/agenda_culturel/templates/agenda_culturel/page.html +++ b/src/agenda_culturel/templates/agenda_culturel/page.html @@ -92,6 +92,7 @@ {% if perms.agenda_culturel.view_message %} {% show_badge_messages "bottom" %} {% endif %} + {% show_badge_moderate %} Administrer {% picto_from_name "settings" %} {% endif %} diff --git a/src/agenda_culturel/templatetags/event_extra.py b/src/agenda_culturel/templatetags/event_extra.py index 4dd5be9..6d645d9 100644 --- a/src/agenda_culturel/templatetags/event_extra.py +++ b/src/agenda_culturel/templatetags/event_extra.py @@ -2,7 +2,9 @@ from django import template from django.utils.safestring import mark_safe from django.urls import reverse_lazy from django.template.defaultfilters import pluralize, linebreaks, urlize +from django.db.models import Q, F import re +from datetime import date, timedelta, datetime from agenda_culturel.models import Event from django.db.models import Q @@ -64,6 +66,26 @@ def picto_visibility(event, visible=True): return "" +@register.simple_tag +def show_badge_moderate(): + first_day = datetime.now() + last_day = first_day + timedelta(days=7) + nb = Event.objects.filter(~Q(status=Event.STATUS.TRASH)). \ + filter(Q(start_day__gte=first_day)&Q(start_day__lte=last_day)). \ + filter(moderated_date__isnull=True). \ + filter( + Q(other_versions__isnull=True) | + Q(other_versions__representative=F('pk')) | + Q(other_versions__representative__isnull=True)).values("start_day").\ + count() + + return mark_safe('' + + picto_from_name("target") + ' ' + str(nb) + '') + + @register.simple_tag def show_badges_events(placement="top"): nb_drafts = Event.nb_draft_events() diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index 18cc88c..e83e2f9 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -969,32 +969,9 @@ def administration(request): .count()) nb_all = imported_events.count() - window_end = today + timedelta(days=nb_mod_days) + # get all non moderated events - nb_not_moderated = Event.objects.filter(~Q(status=Event.STATUS.TRASH)). \ - filter(Q(start_day__gte=today)&Q(start_day__lte=window_end)). \ - filter( - Q(other_versions__isnull=True) | - Q(other_versions__representative=F('pk')) | - Q(other_versions__representative__isnull=True)).values("start_day").\ - annotate(not_moderated=Count("start_day", filter=Q(moderated_date__isnull=True))). \ - annotate(nb_events=Count("start_day")). \ - order_by("start_day").values("not_moderated", "nb_events", "start_day") - - max_not_moderated = max([x["not_moderated"] for x in nb_not_moderated]) - if max_not_moderated == 0: - max_not_moderated = 1 - nb_not_moderated_dict = dict([(x["start_day"], (x["not_moderated"], x["nb_events"])) for x in nb_not_moderated]) - # add missing dates - date_list = [today + timedelta(days=x) for x in range(0, nb_mod_days)] - nb_not_moderated = [{"start_day": d, - "is_today": d == today, - "nb_events": nb_not_moderated_dict[d][1] if d in nb_not_moderated_dict else 0, - "not_moderated": nb_not_moderated_dict[d][0] if d in nb_not_moderated_dict else 0} for d in date_list] - nb_not_moderated = [ x | { "note": 0 if x["not_moderated"] == 0 else int((nb_classes - 1) * x["not_moderated"] / max_not_moderated) + 1 } for x in nb_not_moderated] - nb_not_moderated = [nb_not_moderated[x:x + 7] for x in range(0, len(nb_not_moderated), 7)] - - + nb_not_moderated = Event.get_nb_not_moderated(today, nb_mod_days, nb_classes) return render( request,