Ajout d'un monitoring des activités
This commit is contained in:
parent
67c65f14d1
commit
2196083894
@ -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:
|
||||
|
@ -18,7 +18,7 @@
|
||||
<tbody>
|
||||
{% for obj in paginator_filter %}
|
||||
<tr>
|
||||
<td>{{ obj.id }}</a></td>
|
||||
<td>{{ obj.id }}</td>
|
||||
<td>{{ obj.created_date }}</td>
|
||||
<td>{% if obj.recurrentImport %}<a href="{{ obj.recurrentImport.get_absolute_url }}">{{ obj.recurrentImport.name }}</a>{% else %}
|
||||
{% if obj.url_source %}
|
||||
|
@ -30,6 +30,18 @@
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
{% endif %}
|
||||
|
||||
{% if daily_modifications %}
|
||||
<article>
|
||||
<div class="slide-buttons">
|
||||
<a href="{% url 'activite' %}" role="button">Voir l'historique {% picto_from_name "chevron-right" %}</a>
|
||||
</div>
|
||||
<h2>Activité des derniers jours</h2>
|
||||
{% include "agenda_culturel/recent-activity-inc.html" with modifications=daily_modifications %}
|
||||
</article>
|
||||
{% endif %}
|
||||
|
||||
{% include 'agenda_culturel/paginator_filter.html' %}
|
||||
</header>
|
||||
|
||||
<div>
|
||||
|
@ -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 %}
|
||||
<li><a href="#contenu-principal" aria-label="Aller au contenu">{% picto_from_name "chevron-up" %}</a></li>
|
||||
<li><a href="#sidebar" aria-label="Aller au menu latéral">{% picto_from_name "chevron-down" %}</a></li>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<div class="grid two-columns">
|
||||
<article id="contenu-principal">
|
||||
<header>
|
||||
<h1>Activité récente</h1>
|
||||
</header>
|
||||
|
||||
<article>
|
||||
<h2>Activité des {{ daily_modifications|length }} derniers jours</h2>
|
||||
{% include "agenda_culturel/recent-activity-inc.html" with modifications=daily_modifications %}
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<h2>Activité des semaines précédentes</h2>
|
||||
{% include "agenda_culturel/recent-activity-inc.html" with modifications=weekly_modifications %}
|
||||
</article>
|
||||
|
||||
</article>
|
||||
|
||||
{% include "agenda_culturel/side-nav.html" with current="activite" %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
@ -0,0 +1,24 @@
|
||||
{% if modifications|length == 0 %}
|
||||
<em>Aucune activité dans la période choisie</em>
|
||||
{% else %}
|
||||
<table role="grid">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{% if modifications.0.when.0 == modifications.0.when.1 %}Date{% else %}Semaine{% endif %}</th>
|
||||
<th>Créations manuelles</th>
|
||||
<th>Imports manuels</th>
|
||||
<th>Imports automatiques</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for m in modifications %}
|
||||
<tr>
|
||||
<td>{{ m.when.0|date:'D j b' }}{% if modifications.0.when.0 != modifications.0.when.1 %} - {{ m.when.1|date:'D j b' }}{% endif %}</td>
|
||||
<td>{{ m.nb_manual_creation }}</td>
|
||||
<td>{{ m.nb_manual_import }}</td>
|
||||
<td>{{ m.nb_first_import }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
@ -15,6 +15,7 @@
|
||||
{% if perms.agenda_culturel.change_duplicatedevents %}
|
||||
<li><a {% if current == "duplicates" %}class="selected" {% endif %}href="{% url 'duplicates' %}">Gestion des doublons</a>{% show_badge_duplicated "left" %}</li>
|
||||
{% endif %}
|
||||
<li><a {% if current == "activite" %}class="selected" {% endif %}href="{% url 'activite' %}">Résumé des activités</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
{% if perms.agenda_culturel.change_place %}
|
||||
|
@ -24,6 +24,7 @@ urlpatterns = [
|
||||
path("tag/<int:pk>/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/<int:year>/<int:month>/<int:day>/<int:pk>-<extra>",
|
||||
EventDetailView.as_view(),
|
||||
|
@ -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},
|
||||
)
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user