From d9071974d3008efc7ddd0556c8f1fe82bce0b784 Mon Sep 17 00:00:00 2001 From: Julien Castets Date: Sat, 16 Nov 2024 17:31:06 +0100 Subject: [PATCH] wip --- mesads/app/views/ads_manager_admin.py | 64 ++++++++++++++++++- .../ads_manager_admin_updates.html | 33 ++++++++++ 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/mesads/app/views/ads_manager_admin.py b/mesads/app/views/ads_manager_admin.py index 72f7375..f8b7f24 100644 --- a/mesads/app/views/ads_manager_admin.py +++ b/mesads/app/views/ads_manager_admin.py @@ -1,15 +1,17 @@ from django.conf import settings from django.core.exceptions import SuspiciousOperation from django.core.mail import send_mail +from django.db import connection from django.shortcuts import get_object_or_404, redirect from django.template.loader import render_to_string from django.urls import reverse from django.utils.text import slugify -from django.views.generic import ListView, RedirectView, View, TemplateView +from django.views.generic import RedirectView, View, TemplateView from reversion.views import RevisionMixin from ..models import ( + ADS, ADSManagerAdministrator, ADSManagerRequest, ADSManager, @@ -201,3 +203,63 @@ def add_sheets(self, workbook): class ADSManagerAdminUpdatesView(TemplateView): template_name = "pages/ads_register/ads_manager_admin_updates.html" + + def get_updates(self, cursor): + cursor.execute( + """ + SELECT + ads.id AS id, + adsmanager.id, + CASE + WHEN COUNT(revision.id) = 0 THEN NULL + ELSE COALESCE(JSON_AGG(JSON_BUILD_OBJECT( + 'user_id', revision.user_id, + 'user_email', "user".email, + 'modification_date', revision.date_created + ) ORDER BY revision.date_created DESC), '[]'::json) + END as updates + FROM app_ads AS ads + LEFT JOIN app_adsmanager AS adsmanager + ON adsmanager.id = ads.ads_manager_id + LEFT JOIN app_adsmanageradministrator AS adsmanageradministrator + ON adsmanager.administrator_id = adsmanageradministrator.id + LEFT JOIN reversion_version AS version + ON (version.serialized_data::json -> 0 ->> 'model') = 'app.ads' + AND (version.serialized_data::json -> 0 ->> 'pk')::bigint = ads.id + LEFT JOIN reversion_revision AS revision + ON version.revision_id = revision.id + LEFT JOIN users_user AS "user" + ON "user".id = revision.user_id + WHERE + adsmanageradministrator.id = %s + GROUP BY ads.id, adsmanager.id + ORDER BY ads.last_update DESC + """, + (self.kwargs["ads_manager_administrator"].prefecture.id,), + ) + updates = cursor.fetchall() + + ads_objects = ADS.objects.filter(id__in=[row[0] for row in updates]) + ads_dict = {obj.id: obj for obj in ads_objects} + + ads_managers = ADSManager.objects.filter(id__in=[row[1] for row in updates]) + ads_managers_dict = {obj.id: obj for obj in ads_managers} + return [ + { + "ads": ads_dict[update[0]], + "ads_manager": ads_managers_dict[update[1]], + "history_entries": update[2], + } + for update in updates + ] + + def get_context_data(self, *args, **kwargs): + ctx = super().get_context_data(**kwargs) + # You might be wondering why we didn't implement pagination. Long story + # short, it's because we are using a raw query and pagination needs to + # be handled manually. + # Alternatively we could use the django ORM instead of a raw query, but + # good luck with that. + with connection.cursor() as cursor: + ctx["updates"] = self.get_updates(cursor) + return ctx diff --git a/mesads/templates/webpack/pages/ads_register/ads_manager_admin_updates.html b/mesads/templates/webpack/pages/ads_register/ads_manager_admin_updates.html index c5289f3..3fabac5 100644 --- a/mesads/templates/webpack/pages/ads_register/ads_manager_admin_updates.html +++ b/mesads/templates/webpack/pages/ads_register/ads_manager_admin_updates.html @@ -17,4 +17,37 @@

Demandes d'accès

+
+
+
+
+
+ + + + + + + + + {% for update in updates %} + + + + + + + {% endfor %} + +
Dernière mise à jourGestionnaire ADSADSPar…
{{ update.ads.last_update|date:"d/m/Y H:i:s" }}{{ update.ads_manager.content_object.display_text|capfirst }}{{ update.ads.number }} + {% if update.history_entries|length %} + {{ update.history_entries.0.user_email }} + {% endif %} +
+
+
+
+
+
+ {% endblock %}