From 2196083894ae89d2bf07cca3d405c52c7028646d Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Mon, 11 Nov 2024 14:05:47 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20d'un=20monitoring=20des=20activit=C3=A9?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/agenda_culturel/models.py | 20 +++++++++- .../agenda_culturel/batch-imports-inc.html | 2 +- .../templates/agenda_culturel/moderation.html | 12 ++++++ .../agenda_culturel/page-activity.html | 39 +++++++++++++++++++ .../agenda_culturel/recent-activity-inc.html | 24 ++++++++++++ .../templates/agenda_culturel/side-nav.html | 1 + src/agenda_culturel/urls.py | 1 + src/agenda_culturel/views.py | 31 ++++++++++++++- 8 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/agenda_culturel/templates/agenda_culturel/page-activity.html create mode 100644 src/agenda_culturel/templates/agenda_culturel/recent-activity-inc.html diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index a060a98..53a5f91 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -12,7 +12,7 @@ import os from django.core.files import File from django.utils import timezone from django.contrib.postgres.search import TrigramSimilarity -from django.db.models import Q, Count, F +from django.db.models import Q, Count, F, Subquery, OuterRef, Func import recurrence.fields import recurrence import copy @@ -1420,6 +1420,24 @@ class Event(models.Model): return cal + def get_count_modification(when): + start = datetime(when[0].year, when[0].month, when[0].day) + end = start + timedelta(days=when[1]) + + recurrentimport = RecurrentImport.objects.filter(source=OuterRef("import_sources__0")).order_by().annotate(count=Func(F('id'), function='Count')).values('count') + + + nb_manual_creation = Event.objects.filter(created_date__gte=start, created_date__lt=end, imported_date__isnull=True).count() + imported = Event.objects.filter(created_date__gte=start, created_date__lt=end, imported_date__isnull=False, import_sources__len__gt=0).annotate(nb_rimport=Subquery(recurrentimport)) + + nb_manual_import = imported.filter(nb_rimport=0).count() + nb_first_import = imported.filter(nb_rimport__gt=0).count() + + return {"when": (start, start + timedelta(days=when[1] - 1)), "nb_manual_creation": nb_manual_creation, "nb_manual_import": nb_manual_import, "nb_first_import": nb_first_import} + + def get_count_modifications(when_list): + return [Event.get_count_modification(w) for w in when_list] + class ContactMessage(models.Model): class Meta: diff --git a/src/agenda_culturel/templates/agenda_culturel/batch-imports-inc.html b/src/agenda_culturel/templates/agenda_culturel/batch-imports-inc.html index bbd911c..cb1d7ca 100644 --- a/src/agenda_culturel/templates/agenda_culturel/batch-imports-inc.html +++ b/src/agenda_culturel/templates/agenda_culturel/batch-imports-inc.html @@ -18,7 +18,7 @@ {% for obj in paginator_filter %} - {{ obj.id }} + {{ obj.id }} {{ obj.created_date }} {% if obj.recurrentImport %}{{ obj.recurrentImport.name }}{% else %} {% if obj.url_source %} diff --git a/src/agenda_culturel/templates/agenda_culturel/moderation.html b/src/agenda_culturel/templates/agenda_culturel/moderation.html index 2c3a23c..85ce84c 100644 --- a/src/agenda_culturel/templates/agenda_culturel/moderation.html +++ b/src/agenda_culturel/templates/agenda_culturel/moderation.html @@ -30,6 +30,18 @@
{% endif %} + + {% if daily_modifications %} +
+ +

Activité des derniers jours

+ {% include "agenda_culturel/recent-activity-inc.html" with modifications=daily_modifications %} +
+ {% endif %} + + {% include 'agenda_culturel/paginator_filter.html' %}
diff --git a/src/agenda_culturel/templates/agenda_culturel/page-activity.html b/src/agenda_culturel/templates/agenda_culturel/page-activity.html new file mode 100644 index 0000000..1ef5a23 --- /dev/null +++ b/src/agenda_culturel/templates/agenda_culturel/page-activity.html @@ -0,0 +1,39 @@ +{% extends "agenda_culturel/page-admin.html" %} + +{% load utils_extra %} +{% block title %}{% block og_title %}Activité récente{% endblock %}{% endblock %} + +{% load cat_extra %} +{% block entete_header %} + {% css_categories %} +{% endblock %} + +{% block sidemenu-bouton %} +
  • {% picto_from_name "chevron-up" %}
  • +
  • {% picto_from_name "chevron-down" %}
  • +{% endblock %} + + +{% block content %} +
    +
    +
    +

    Activité récente

    +
    + +
    +

    Activité des {{ daily_modifications|length }} derniers jours

    + {% include "agenda_culturel/recent-activity-inc.html" with modifications=daily_modifications %} +
    + +
    +

    Activité des semaines précédentes

    + {% include "agenda_culturel/recent-activity-inc.html" with modifications=weekly_modifications %} +
    + +
    + +{% include "agenda_culturel/side-nav.html" with current="activite" %} +
    + +{% endblock %} \ No newline at end of file diff --git a/src/agenda_culturel/templates/agenda_culturel/recent-activity-inc.html b/src/agenda_culturel/templates/agenda_culturel/recent-activity-inc.html new file mode 100644 index 0000000..41968e9 --- /dev/null +++ b/src/agenda_culturel/templates/agenda_culturel/recent-activity-inc.html @@ -0,0 +1,24 @@ +{% if modifications|length == 0 %} + Aucune activité dans la période choisie +{% else %} + + + + + + + + + + + {% for m in modifications %} + + + + + + + {% endfor %} + +
    {% if modifications.0.when.0 == modifications.0.when.1 %}Date{% else %}Semaine{% endif %}Créations manuellesImports manuelsImports automatiques
    {{ m.when.0|date:'D j b' }}{% if modifications.0.when.0 != modifications.0.when.1 %} - {{ m.when.1|date:'D j b' }}{% endif %}{{ m.nb_manual_creation }}{{ m.nb_manual_import }}{{ m.nb_first_import }}
    +{% endif %} \ No newline at end of file diff --git a/src/agenda_culturel/templates/agenda_culturel/side-nav.html b/src/agenda_culturel/templates/agenda_culturel/side-nav.html index 8e919dc..42e0dc1 100644 --- a/src/agenda_culturel/templates/agenda_culturel/side-nav.html +++ b/src/agenda_culturel/templates/agenda_culturel/side-nav.html @@ -15,6 +15,7 @@ {% if perms.agenda_culturel.change_duplicatedevents %}
  • Gestion des doublons{% show_badge_duplicated "left" %}
  • {% endif %} +
  • Résumé des activités
  • {% if perms.agenda_culturel.change_place %} diff --git a/src/agenda_culturel/urls.py b/src/agenda_culturel/urls.py index 758a773..9a4716d 100644 --- a/src/agenda_culturel/urls.py +++ b/src/agenda_culturel/urls.py @@ -24,6 +24,7 @@ urlpatterns = [ path("tag//delete", TagDeleteView.as_view(), name="delete_tag"), path("tags/add", TagCreateView.as_view(), name="add_tag"), path("moderation/", moderation, name="moderation"), + path("activite/", activite, name="activite"), path( "event////-", EventDetailView.as_view(), diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index 16136cd..6e8f1fa 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -991,6 +991,29 @@ class ContactMessagesFilterAdmin(django_filters.FilterSet): fields = ["closed", "spam"] +@login_required(login_url="/accounts/login/") +@permission_required("agenda_culturel.view_event") +def activite(request): + now = date.today() + + days = [now] + while len(days) < 7 or days[-1].weekday() != 0: + days.append(days[-1] + timedelta(days=-1)) + + weeks = [days[-1]] + for w in range(0, 8): + weeks.append(weeks[-1] + timedelta(days=-7)) + + daily_modifications = Event.get_count_modifications([(d, 1) for d in days]) + weekly_modifications = Event.get_count_modifications([(w, 7) for w in weeks]) + + return render( + request, + "agenda_culturel/page-activity.html", + {"daily_modifications": daily_modifications, "weekly_modifications": weekly_modifications }, + ) + + @login_required(login_url="/accounts/login/") @permission_required("agenda_culturel.view_event") def moderation(request): @@ -1000,6 +1023,12 @@ def moderation(request): paginator = PaginatorFilter(filter, 10, request) page = request.GET.get("page") + daily_modifications = [] + if not page or page == 1: + days = [date.today()] + for i in range(0, 2): + days.append(days[-1] + timedelta(days=-1)) + daily_modifications = Event.get_count_modifications([(d, 1) for d in days]) try: response = paginator.page(page) except PageNotAnInteger: @@ -1010,7 +1039,7 @@ def moderation(request): return render( request, "agenda_culturel/moderation.html", - {"filter": filter, "paginator_filter": response}, + {"filter": filter, "paginator_filter": response, "daily_modifications": daily_modifications}, )