ajout de pages aux vues generales
This commit is contained in:
parent
9ec22919f1
commit
650678b1f3
@ -35,15 +35,20 @@ from .views import (
|
|||||||
update_duplicate_event,
|
update_duplicate_event,
|
||||||
# General pages
|
# General pages
|
||||||
about,
|
about,
|
||||||
|
activite,
|
||||||
|
delete_cm_spam,
|
||||||
|
home,
|
||||||
import_requirements,
|
import_requirements,
|
||||||
mentions_legales,
|
mentions_legales,
|
||||||
moderation_rules,
|
moderation_rules,
|
||||||
|
statistics,
|
||||||
thank_you,
|
thank_you,
|
||||||
# Import batch
|
# Import batch
|
||||||
imports,
|
imports,
|
||||||
add_import,
|
add_import,
|
||||||
cancel_import,
|
cancel_import,
|
||||||
update_orphan_events,
|
update_orphan_events,
|
||||||
|
view_messages,
|
||||||
# Import récurrent
|
# Import récurrent
|
||||||
RecurrentImportCreateView,
|
RecurrentImportCreateView,
|
||||||
RecurrentImportDeleteView,
|
RecurrentImportDeleteView,
|
||||||
@ -86,7 +91,6 @@ from .views import (
|
|||||||
UnknownPlacesListView,
|
UnknownPlacesListView,
|
||||||
fix_unknown_places,
|
fix_unknown_places,
|
||||||
# TODO pas encore trié
|
# TODO pas encore trié
|
||||||
home,
|
|
||||||
week_view,
|
week_view,
|
||||||
month_view,
|
month_view,
|
||||||
day_view,
|
day_view,
|
||||||
@ -94,7 +98,6 @@ from .views import (
|
|||||||
export_ical,
|
export_ical,
|
||||||
recent,
|
recent,
|
||||||
administration,
|
administration,
|
||||||
activite,
|
|
||||||
clear_cache,
|
clear_cache,
|
||||||
export_event_ical,
|
export_event_ical,
|
||||||
MessageDeleteView,
|
MessageDeleteView,
|
||||||
@ -106,16 +109,13 @@ from .views import (
|
|||||||
EventCreateView,
|
EventCreateView,
|
||||||
event_search,
|
event_search,
|
||||||
event_search_full,
|
event_search_full,
|
||||||
delete_cm_spam,
|
|
||||||
update_from_source,
|
update_from_source,
|
||||||
change_status_event,
|
change_status_event,
|
||||||
EventDeleteView,
|
EventDeleteView,
|
||||||
import_event_proxy,
|
import_event_proxy,
|
||||||
import_from_url,
|
import_from_url,
|
||||||
import_from_urls,
|
import_from_urls,
|
||||||
view_messages,
|
|
||||||
MessageUpdateView,
|
MessageUpdateView,
|
||||||
statistics,
|
|
||||||
UserProfileUpdateView,
|
UserProfileUpdateView,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -189,10 +189,15 @@ urlpatterns = [
|
|||||||
path("duplicates/<int:pk>/fix", fix_duplicate, name="fix_duplicate"),
|
path("duplicates/<int:pk>/fix", fix_duplicate, name="fix_duplicate"),
|
||||||
# General pages
|
# General pages
|
||||||
path("a-propos", about, name="about"),
|
path("a-propos", about, name="about"),
|
||||||
|
path("activite/", activite, name="activite"),
|
||||||
|
path("messages/spams/delete", delete_cm_spam, name="delete_cm_spam"),
|
||||||
|
path("", home, name="home"),
|
||||||
path("besoin-pour-import", import_requirements, name="import_requirements"),
|
path("besoin-pour-import", import_requirements, name="import_requirements"),
|
||||||
path("mentions-legales", mentions_legales, name="mentions_legales"),
|
path("mentions-legales", mentions_legales, name="mentions_legales"),
|
||||||
path("regles-de-moderation", moderation_rules, name="moderation_rules"),
|
path("regles-de-moderation", moderation_rules, name="moderation_rules"),
|
||||||
|
path("statistiques", statistics, name="statistics"),
|
||||||
path("merci", thank_you, name="thank_you"),
|
path("merci", thank_you, name="thank_you"),
|
||||||
|
path("messages", view_messages, name="messages"),
|
||||||
# Import batch
|
# Import batch
|
||||||
path("imports/", imports, name="imports"),
|
path("imports/", imports, name="imports"),
|
||||||
path("imports/add", add_import, name="add_import"),
|
path("imports/add", add_import, name="add_import"),
|
||||||
@ -350,7 +355,6 @@ urlpatterns = [
|
|||||||
name="fix_unknown_places",
|
name="fix_unknown_places",
|
||||||
),
|
),
|
||||||
# TODO pas encore trié
|
# TODO pas encore trié
|
||||||
path("", home, name="home"),
|
|
||||||
path("cat:<cat>/", home, name="home_category"),
|
path("cat:<cat>/", home, name="home_category"),
|
||||||
path(
|
path(
|
||||||
"cat:<cat>/semaine/<int:year>/<int:week>/",
|
"cat:<cat>/semaine/<int:year>/<int:week>/",
|
||||||
@ -407,7 +411,6 @@ urlpatterns = [
|
|||||||
path("tags/add", TagCreateView.as_view(), name="add_tag"),
|
path("tags/add", TagCreateView.as_view(), name="add_tag"),
|
||||||
path("recent/", recent, name="recent"),
|
path("recent/", recent, name="recent"),
|
||||||
path("administration/", administration, name="administration"),
|
path("administration/", administration, name="administration"),
|
||||||
path("activite/", activite, name="activite"),
|
|
||||||
path(
|
path(
|
||||||
"event/<int:year>/<int:month>/<int:day>/<int:pk>-<extra>",
|
"event/<int:year>/<int:month>/<int:day>/<int:pk>-<extra>",
|
||||||
EventDetailView.as_view(),
|
EventDetailView.as_view(),
|
||||||
@ -464,9 +467,6 @@ urlpatterns = [
|
|||||||
path("rechercher", event_search, name="event_search"),
|
path("rechercher", event_search, name="event_search"),
|
||||||
path("rechercher/complet/", event_search_full, name="event_search_full"),
|
path("rechercher/complet/", event_search_full, name="event_search_full"),
|
||||||
path("contact", MessageCreateView.as_view(), name="contact"),
|
path("contact", MessageCreateView.as_view(), name="contact"),
|
||||||
path("messages", view_messages, name="messages"),
|
|
||||||
path("statistiques", statistics, name="statistics"),
|
|
||||||
path("messages/spams/delete", delete_cm_spam, name="delete_cm_spam"),
|
|
||||||
path(
|
path(
|
||||||
"message/<int:pk>",
|
"message/<int:pk>",
|
||||||
MessageUpdateView.as_view(),
|
MessageUpdateView.as_view(),
|
||||||
|
@ -1,11 +1,26 @@
|
|||||||
from django.db.models import Q
|
import calendar as _calendar
|
||||||
|
from datetime import date, timedelta, datetime
|
||||||
|
|
||||||
|
from django.contrib.auth.decorators import login_required, permission_required
|
||||||
|
from django.core.checks import messages
|
||||||
|
from django.core.paginator import PageNotAnInteger, EmptyPage
|
||||||
|
from django.db.models import Count, F
|
||||||
|
from django.db.models import Q, Min, Max, Avg, StdDev
|
||||||
|
from django.db.models.functions import TruncMonth, ExtractDay
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
|
|
||||||
from ..models import RecurrentImport
|
|
||||||
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
from . import Median, week_view, PaginatorFilter
|
||||||
|
from ..filters import MessagesFilterAdmin
|
||||||
|
from ..models import RecurrentImport, Event, Message
|
||||||
|
|
||||||
|
|
||||||
|
def home(request, cat=None):
|
||||||
|
return week_view(request, home=True, cat=cat)
|
||||||
|
|
||||||
|
|
||||||
def thank_you(request):
|
def thank_you(request):
|
||||||
return render(request, "agenda_culturel/thank_you.html")
|
return render(request, "agenda_culturel/thank_you.html")
|
||||||
|
|
||||||
@ -49,4 +64,190 @@ def import_requirements(request):
|
|||||||
"static_content": "import_requirements",
|
"static_content": "import_requirements",
|
||||||
"url_path": reverse_lazy("import_requirements"),
|
"url_path": reverse_lazy("import_requirements"),
|
||||||
}
|
}
|
||||||
return render(request, "agenda_culturel/page-single.html", context)
|
return render(request, "agenda_culturel/page-single.html", context)
|
||||||
|
|
||||||
|
|
||||||
|
def statistics(request, pk=None):
|
||||||
|
if pk is not None:
|
||||||
|
rimport = RecurrentImport.objects.filter(pk=pk)
|
||||||
|
source = rimport.values("source").first()["source"]
|
||||||
|
qs = Event.objects.filter(import_sources__contains=[source])
|
||||||
|
else:
|
||||||
|
rimport = None
|
||||||
|
qs = Event.objects
|
||||||
|
|
||||||
|
stats = {}
|
||||||
|
stats_months = {}
|
||||||
|
first = {}
|
||||||
|
last = {}
|
||||||
|
|
||||||
|
ev_published = qs.filter(
|
||||||
|
Q(status=Event.STATUS.PUBLISHED)
|
||||||
|
& (
|
||||||
|
Q(other_versions__isnull=True)
|
||||||
|
| Q(other_versions__representative=F("pk"))
|
||||||
|
| Q(other_versions__representative__isnull=True)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
for v in ["start_day", "created_date__date"]:
|
||||||
|
after = 24
|
||||||
|
last[v] = (
|
||||||
|
date.today()
|
||||||
|
if v == "created_date__date"
|
||||||
|
else date.today() + timedelta(weeks=after)
|
||||||
|
)
|
||||||
|
last[v] = last[v].replace(
|
||||||
|
day=_calendar.monthrange(last[v].year, last[v].month)[1]
|
||||||
|
)
|
||||||
|
|
||||||
|
r = 8 * 30
|
||||||
|
if v == "start_day":
|
||||||
|
r += after * 7
|
||||||
|
first[v] = (last[v] - timedelta(days=r)).replace(day=1)
|
||||||
|
|
||||||
|
ev_days = ev_published.annotate(day=F(v)).filter(
|
||||||
|
Q(day__lte=last[v]) & Q(day__gte=first[v])
|
||||||
|
)
|
||||||
|
|
||||||
|
stats[v] = ev_days.values("day").annotate(total=Count("day")).order_by("day")
|
||||||
|
|
||||||
|
stats_months[v] = (
|
||||||
|
ev_days.annotate(month=TruncMonth("day"))
|
||||||
|
.values("month")
|
||||||
|
.annotate(total=Count("month"))
|
||||||
|
.order_by("month")
|
||||||
|
)
|
||||||
|
|
||||||
|
nb_by_city = (
|
||||||
|
ev_published.annotate(city=F("exact_location__city"))
|
||||||
|
.filter(city__isnull=False)
|
||||||
|
.values("city")
|
||||||
|
.annotate(total=Count("city"))
|
||||||
|
.order_by("-total")
|
||||||
|
)
|
||||||
|
|
||||||
|
limit = datetime.now() + timedelta(days=-30)
|
||||||
|
|
||||||
|
stat_qs = qs.filter(start_day__gte=F("created_date")).annotate(
|
||||||
|
foresight=ExtractDay(F("start_day") - F("created_date"))
|
||||||
|
)
|
||||||
|
|
||||||
|
statsa = stat_qs.filter().aggregate(
|
||||||
|
minimum=Min("foresight"),
|
||||||
|
maximum=Max("foresight"),
|
||||||
|
mean=Avg("foresight"),
|
||||||
|
median=Median("foresight"),
|
||||||
|
stdev=StdDev("foresight"),
|
||||||
|
)
|
||||||
|
|
||||||
|
statsm = stat_qs.filter(created_date__gte=limit).aggregate(
|
||||||
|
minimum=Min("foresight"),
|
||||||
|
maximum=Max("foresight"),
|
||||||
|
mean=Avg("foresight"),
|
||||||
|
median=Median("foresight"),
|
||||||
|
stdev=StdDev("foresight"),
|
||||||
|
)
|
||||||
|
|
||||||
|
stats_foresight = [
|
||||||
|
[
|
||||||
|
_(x),
|
||||||
|
round(statsa[x], 2) if statsa[x] is not None else "-",
|
||||||
|
round(statsm[x], 2) if statsm[x] is not None else "-",
|
||||||
|
]
|
||||||
|
for x in statsa
|
||||||
|
]
|
||||||
|
|
||||||
|
context = {
|
||||||
|
"stats_by_startday": stats["start_day"],
|
||||||
|
"stats_by_creation": stats["created_date__date"],
|
||||||
|
"stats_months_by_startday": stats_months["start_day"],
|
||||||
|
"stats_months_by_creation": stats_months["created_date__date"],
|
||||||
|
"first_by_startday": first["start_day"],
|
||||||
|
"last_by_startday": last["start_day"],
|
||||||
|
"first_by_creation": first["created_date__date"],
|
||||||
|
"last_by_creation": last["created_date__date"],
|
||||||
|
"nb_by_city": nb_by_city,
|
||||||
|
"stats_foresight": stats_foresight,
|
||||||
|
"object": rimport.first() if rimport else None,
|
||||||
|
}
|
||||||
|
|
||||||
|
if pk is None:
|
||||||
|
return render(request, "agenda_culturel/statistics.html", context)
|
||||||
|
else:
|
||||||
|
return render(request, "agenda_culturel/rimport-statistics.html", context)
|
||||||
|
|
||||||
|
|
||||||
|
@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_message")
|
||||||
|
def view_messages(request):
|
||||||
|
filter = MessagesFilterAdmin(
|
||||||
|
request.GET, queryset=Message.objects.all().order_by("-date")
|
||||||
|
)
|
||||||
|
paginator = PaginatorFilter(filter, 10, request)
|
||||||
|
page = request.GET.get("page")
|
||||||
|
|
||||||
|
nb_spams = Message.objects.filter(spam=True).count()
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = paginator.page(page)
|
||||||
|
except PageNotAnInteger:
|
||||||
|
response = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
response = paginator.page(paginator.num_pages)
|
||||||
|
|
||||||
|
return render(
|
||||||
|
request,
|
||||||
|
"agenda_culturel/messages.html",
|
||||||
|
{"filter": filter, "nb_spams": nb_spams, "paginator_filter": response},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@login_required(login_url="/accounts/login/")
|
||||||
|
@permission_required("agenda_culturel.view_message")
|
||||||
|
def delete_cm_spam(request):
|
||||||
|
if request.method == "POST":
|
||||||
|
Message.objects.filter(spam=True).delete()
|
||||||
|
|
||||||
|
messages.success(request, _("Spam has been successfully deleted."))
|
||||||
|
return HttpResponseRedirect(reverse_lazy("messages"))
|
||||||
|
else:
|
||||||
|
nb_msgs = Message.objects.values("spam").annotate(total=Count("spam"))
|
||||||
|
nb_total = sum([nb["total"] for nb in nb_msgs])
|
||||||
|
nb_spams = sum([nb["total"] for nb in nb_msgs if nb["spam"]])
|
||||||
|
cancel_url = reverse_lazy("messages")
|
||||||
|
return render(
|
||||||
|
request,
|
||||||
|
"agenda_culturel/delete_spams_confirm.html",
|
||||||
|
{
|
||||||
|
"nb_total": nb_total,
|
||||||
|
"nb_spams": nb_spams,
|
||||||
|
"cancel_url": cancel_url,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import calendar as _calendar
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import logging
|
import logging
|
||||||
from datetime import date, timedelta
|
from datetime import date, timedelta
|
||||||
@ -15,11 +14,7 @@ from django.contrib.messages.views import SuccessMessageMixin
|
|||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
|
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
|
||||||
from django.db.models import Aggregate, FloatField
|
from django.db.models import Aggregate, FloatField
|
||||||
from django.db.models import Avg, Max, Min
|
from django.db.models import F, Func, OuterRef, Q, Subquery
|
||||||
from django.db.models import Count, F, Func, OuterRef, Q, Subquery
|
|
||||||
from django.db.models.aggregates import StdDev
|
|
||||||
from django.db.models.functions import ExtractDay
|
|
||||||
from django.db.models.functions import TruncMonth
|
|
||||||
from django.http import (
|
from django.http import (
|
||||||
HttpResponse,
|
HttpResponse,
|
||||||
HttpResponseForbidden,
|
HttpResponseForbidden,
|
||||||
@ -50,7 +45,6 @@ from ..celery import (
|
|||||||
from ..filters import (
|
from ..filters import (
|
||||||
EventFilter,
|
EventFilter,
|
||||||
EventFilterAdmin,
|
EventFilterAdmin,
|
||||||
MessagesFilterAdmin,
|
|
||||||
SearchEventFilter,
|
SearchEventFilter,
|
||||||
SimpleSearchEventFilter,
|
SimpleSearchEventFilter,
|
||||||
)
|
)
|
||||||
@ -148,10 +142,6 @@ to_be_translated = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def home(request, cat=None):
|
|
||||||
return week_view(request, home=True, cat=cat)
|
|
||||||
|
|
||||||
|
|
||||||
def month_view(request, year=None, month=None, cat=None):
|
def month_view(request, year=None, month=None, cat=None):
|
||||||
now = date.today()
|
now = date.today()
|
||||||
if year is None and month is None:
|
if year is None and month is None:
|
||||||
@ -1011,32 +1001,6 @@ class MessageUpdateView(
|
|||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
|
|
||||||
@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/")
|
@login_required(login_url="/accounts/login/")
|
||||||
@permission_required("agenda_culturel.view_event")
|
@permission_required("agenda_culturel.view_event")
|
||||||
def administration(request):
|
def administration(request):
|
||||||
@ -1145,55 +1109,6 @@ def recent(request):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@login_required(login_url="/accounts/login/")
|
|
||||||
@permission_required("agenda_culturel.view_message")
|
|
||||||
def view_messages(request):
|
|
||||||
filter = MessagesFilterAdmin(
|
|
||||||
request.GET, queryset=Message.objects.all().order_by("-date")
|
|
||||||
)
|
|
||||||
paginator = PaginatorFilter(filter, 10, request)
|
|
||||||
page = request.GET.get("page")
|
|
||||||
|
|
||||||
nb_spams = Message.objects.filter(spam=True).count()
|
|
||||||
|
|
||||||
try:
|
|
||||||
response = paginator.page(page)
|
|
||||||
except PageNotAnInteger:
|
|
||||||
response = paginator.page(1)
|
|
||||||
except EmptyPage:
|
|
||||||
response = paginator.page(paginator.num_pages)
|
|
||||||
|
|
||||||
return render(
|
|
||||||
request,
|
|
||||||
"agenda_culturel/messages.html",
|
|
||||||
{"filter": filter, "nb_spams": nb_spams, "paginator_filter": response},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@login_required(login_url="/accounts/login/")
|
|
||||||
@permission_required("agenda_culturel.view_message")
|
|
||||||
def delete_cm_spam(request):
|
|
||||||
if request.method == "POST":
|
|
||||||
Message.objects.filter(spam=True).delete()
|
|
||||||
|
|
||||||
messages.success(request, _("Spam has been successfully deleted."))
|
|
||||||
return HttpResponseRedirect(reverse_lazy("messages"))
|
|
||||||
else:
|
|
||||||
nb_msgs = Message.objects.values("spam").annotate(total=Count("spam"))
|
|
||||||
nb_total = sum([nb["total"] for nb in nb_msgs])
|
|
||||||
nb_spams = sum([nb["total"] for nb in nb_msgs if nb["spam"]])
|
|
||||||
cancel_url = reverse_lazy("messages")
|
|
||||||
return render(
|
|
||||||
request,
|
|
||||||
"agenda_culturel/delete_spams_confirm.html",
|
|
||||||
{
|
|
||||||
"nb_total": nb_total,
|
|
||||||
"nb_spams": nb_spams,
|
|
||||||
"cancel_url": cancel_url,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def event_search(request, full=False):
|
def event_search(request, full=False):
|
||||||
categories = None
|
categories = None
|
||||||
tags = None
|
tags = None
|
||||||
@ -1289,117 +1204,6 @@ def event_search_full(request):
|
|||||||
return event_search(request, True)
|
return event_search(request, True)
|
||||||
|
|
||||||
|
|
||||||
def statistics(request, pk=None):
|
|
||||||
if pk is not None:
|
|
||||||
rimport = RecurrentImport.objects.filter(pk=pk)
|
|
||||||
source = rimport.values("source").first()["source"]
|
|
||||||
qs = Event.objects.filter(import_sources__contains=[source])
|
|
||||||
else:
|
|
||||||
rimport = None
|
|
||||||
qs = Event.objects
|
|
||||||
|
|
||||||
stats = {}
|
|
||||||
stats_months = {}
|
|
||||||
first = {}
|
|
||||||
last = {}
|
|
||||||
|
|
||||||
ev_published = qs.filter(
|
|
||||||
Q(status=Event.STATUS.PUBLISHED)
|
|
||||||
& (
|
|
||||||
Q(other_versions__isnull=True)
|
|
||||||
| Q(other_versions__representative=F("pk"))
|
|
||||||
| Q(other_versions__representative__isnull=True)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
for v in ["start_day", "created_date__date"]:
|
|
||||||
after = 24
|
|
||||||
last[v] = (
|
|
||||||
date.today()
|
|
||||||
if v == "created_date__date"
|
|
||||||
else date.today() + timedelta(weeks=after)
|
|
||||||
)
|
|
||||||
last[v] = last[v].replace(
|
|
||||||
day=_calendar.monthrange(last[v].year, last[v].month)[1]
|
|
||||||
)
|
|
||||||
|
|
||||||
r = 8 * 30
|
|
||||||
if v == "start_day":
|
|
||||||
r += after * 7
|
|
||||||
first[v] = (last[v] - timedelta(days=r)).replace(day=1)
|
|
||||||
|
|
||||||
ev_days = ev_published.annotate(day=F(v)).filter(
|
|
||||||
Q(day__lte=last[v]) & Q(day__gte=first[v])
|
|
||||||
)
|
|
||||||
|
|
||||||
stats[v] = ev_days.values("day").annotate(total=Count("day")).order_by("day")
|
|
||||||
|
|
||||||
stats_months[v] = (
|
|
||||||
ev_days.annotate(month=TruncMonth("day"))
|
|
||||||
.values("month")
|
|
||||||
.annotate(total=Count("month"))
|
|
||||||
.order_by("month")
|
|
||||||
)
|
|
||||||
|
|
||||||
nb_by_city = (
|
|
||||||
ev_published.annotate(city=F("exact_location__city"))
|
|
||||||
.filter(city__isnull=False)
|
|
||||||
.values("city")
|
|
||||||
.annotate(total=Count("city"))
|
|
||||||
.order_by("-total")
|
|
||||||
)
|
|
||||||
|
|
||||||
limit = datetime.now() + timedelta(days=-30)
|
|
||||||
|
|
||||||
stat_qs = qs.filter(start_day__gte=F("created_date")).annotate(
|
|
||||||
foresight=ExtractDay(F("start_day") - F("created_date"))
|
|
||||||
)
|
|
||||||
|
|
||||||
statsa = stat_qs.filter().aggregate(
|
|
||||||
minimum=Min("foresight"),
|
|
||||||
maximum=Max("foresight"),
|
|
||||||
mean=Avg("foresight"),
|
|
||||||
median=Median("foresight"),
|
|
||||||
stdev=StdDev("foresight"),
|
|
||||||
)
|
|
||||||
|
|
||||||
statsm = stat_qs.filter(created_date__gte=limit).aggregate(
|
|
||||||
minimum=Min("foresight"),
|
|
||||||
maximum=Max("foresight"),
|
|
||||||
mean=Avg("foresight"),
|
|
||||||
median=Median("foresight"),
|
|
||||||
stdev=StdDev("foresight"),
|
|
||||||
)
|
|
||||||
|
|
||||||
stats_foresight = [
|
|
||||||
[
|
|
||||||
_(x),
|
|
||||||
round(statsa[x], 2) if statsa[x] is not None else "-",
|
|
||||||
round(statsm[x], 2) if statsm[x] is not None else "-",
|
|
||||||
]
|
|
||||||
for x in statsa
|
|
||||||
]
|
|
||||||
|
|
||||||
context = {
|
|
||||||
"stats_by_startday": stats["start_day"],
|
|
||||||
"stats_by_creation": stats["created_date__date"],
|
|
||||||
"stats_months_by_startday": stats_months["start_day"],
|
|
||||||
"stats_months_by_creation": stats_months["created_date__date"],
|
|
||||||
"first_by_startday": first["start_day"],
|
|
||||||
"last_by_startday": last["start_day"],
|
|
||||||
"first_by_creation": first["created_date__date"],
|
|
||||||
"last_by_creation": last["created_date__date"],
|
|
||||||
"nb_by_city": nb_by_city,
|
|
||||||
"stats_foresight": stats_foresight,
|
|
||||||
"object": rimport.first() if rimport else None,
|
|
||||||
}
|
|
||||||
|
|
||||||
if pk is None:
|
|
||||||
return render(request, "agenda_culturel/statistics.html", context)
|
|
||||||
else:
|
|
||||||
return render(request, "agenda_culturel/rimport-statistics.html", context)
|
|
||||||
|
|
||||||
|
|
||||||
def clear_cache(request):
|
def clear_cache(request):
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
cache.clear()
|
cache.clear()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user