Ajout d'une visualisation des modérations à venir

Fix #247
This commit is contained in:
Jean-Marie Favreau 2024-12-13 00:06:36 +01:00
parent e5c075656c
commit 2cca0322d1
3 changed files with 112 additions and 10 deletions

View File

@ -1604,3 +1604,48 @@ label.required::after {
margin-right: 1.2em; margin-right: 1.2em;
} }
} }
.moderation_heatmap {
border-spacing: 0.1em;
border-collapse: separate;
max-width: 600px;
margin: auto;
th {
font-size: 70%;
text-align: center;
}
td {
font-size: 60%;
text-align: center;
}
tbody th {
text-align: right;
}
.ratio {
border-radius: var(--border-radius);
padding: 0.2em;
color: black;
}
.score_0 {
background: rgb(0, 128, 0);
}
.score_1 {
background: rgb(255, 255, 0);
}
.score_2 {
background: rgb(255, 166, 0);
}
.score_3 {
background: rgb(255, 0, 0);
}
.score_4 {
background: rgb(128, 0, 128);
color: white;
}
@media only screen and (max-width: 300px) {
.ratio, .month, .label {
font-size: 0;
}
}
}

View File

@ -17,13 +17,38 @@
{% block content %} {% block content %}
<div class="grid two-columns"> <div class="grid two-columns">
<div id="contenu-principal"> <div id="contenu-principal">
<div>
<article>
<header>
<div class="slide-buttons">
<a href="{% url 'moderate' %}" role="button">Modérer {% picto_from_name "check-square" %}</a>
</div>
<h2>Modération à venir</h2>
</header>
<article> {% for w in nb_not_moderated %}
<table class="moderation_heatmap">
<thead>
<th></th>
{% for m in w %}
<th>{{ m.start_day|date:"d" }}<span class="month"> {{ m.start_day|date:"M"|lower }}</span></th>
{% endfor %}
</thead>
<tbody>
<tr>
<th class="label">reste à modérer</h>
{% for m in w %}
<td class="ratio score_{{ m.note }}">{{ m.not_moderated }} / {{ m.nb_events }}</td>
{% endfor %}
</tr>
</tbody>
</table>
{% endfor %}
</article>
<article>
<header> <header>
<div class="slide-buttons">
<a href="{% url 'moderate' %}" role="button">Modérer {% picto_from_name "check-square" %}</a>
</div>
<h2>Activité des derniers jours</h2> <h2>Activité des derniers jours</h2>
</header> </header>
<h3>Résumé des activités</h3> <h3>Résumé des activités</h3>
@ -36,6 +61,7 @@
{% include "agenda_culturel/rimports-info-inc.html" with all=1 %}</p> {% include "agenda_culturel/rimports-info-inc.html" with all=1 %}</p>
</article> </article>
</div>
<article> <article>
<header> <header>

View File

@ -76,7 +76,7 @@ from django.utils import timezone
from django.utils.html import escape from django.utils.html import escape
from datetime import date, timedelta from datetime import date, timedelta
from django.utils.timezone import datetime from django.utils.timezone import datetime
from django.db.models import Q, Subquery, OuterRef, Count, F, Func from django.db.models import Q, Subquery, OuterRef, Count, F, Func, BooleanField, ExpressionWrapper
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -873,9 +873,13 @@ def activite(request):
@login_required(login_url="/accounts/login/") @login_required(login_url="/accounts/login/")
@permission_required("agenda_culturel.view_event") @permission_required("agenda_culturel.view_event")
def administration(request): def administration(request):
nb_mod_days = 21
nb_classes = 4
today = date.today()
start_time = datetime.now().time()
# get information about recent modifications # get information about recent modifications
days = [date.today()] days = [today]
for i in range(0, 2): for i in range(0, 2):
days.append(days[-1] + timedelta(days=-1)) days.append(days[-1] + timedelta(days=-1))
daily_modifications = Event.get_count_modifications([(d, 1) for d in days]) daily_modifications = Event.get_count_modifications([(d, 1) for d in days])
@ -905,13 +909,40 @@ def administration(request):
.count()) .count())
nb_all = imported_events.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")
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,
"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)]
return render( return render(
request, request,
"agenda_culturel/administration.html", "agenda_culturel/administration.html",
{"daily_modifications": daily_modifications, {"daily_modifications": daily_modifications,
"events": events, "batch_imports": batch_imports, "events": events, "batch_imports": batch_imports,
"nb_failed": nb_failed, "nb_canceled": nb_canceled, "nb_failed": nb_failed, "nb_canceled": nb_canceled,
"nb_running": nb_running, "nb_all": nb_all}, "nb_running": nb_running, "nb_all": nb_all,
"nb_not_moderated": nb_not_moderated},
) )