Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
brmzkw committed Nov 16, 2024
1 parent 3e616b7 commit d907197
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 1 deletion.
64 changes: 63 additions & 1 deletion mesads/app/views/ads_manager_admin.py
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,37 @@

<h1>Demandes d'accès</h1>

<div class="fr-grid-row">
<div class="fr-table fr-table--md" id="table-ads-pref">
<div class="fr-table__wrapper">
<div class="fr-table__container">
<div class="fr-table__content">
<table id="table-ads-pref">
<thead>
<th>Dernière mise à jour</th>
<th>Gestionnaire ADS</th>
<th>ADS</th>
<th>Par…</th>
</thead>
<tbody>
{% for update in updates %}
<tr>
<td>{{ update.ads.last_update|date:"d/m/Y H:i:s" }}</td>
<td>{{ update.ads_manager.content_object.display_text|capfirst }}</td>
<td>{{ update.ads.number }}</td>
<td>
{% if update.history_entries|length %}
{{ update.history_entries.0.user_email }}
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>

{% endblock %}

0 comments on commit d907197

Please sign in to comment.