diff --git a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po
index 5b596ca..8c64f16 100644
--- a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po
+++ b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: agenda_culturel\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-14 23:45+0100\n"
+"POT-Creation-Date: 2025-03-15 19:10+0100\n"
"PO-Revision-Date: 2023-10-29 14:16+0000\n"
"Last-Translator: Jean-Marie Favreau \n"
"Language-Team: Jean-Marie Favreau \n"
@@ -142,12 +142,12 @@ msgstr "dernier créé d'abord"
msgid "Imported from"
msgstr "Importé depuis"
-#: agenda_culturel/filters.py:470 agenda_culturel/models.py:771
-#: agenda_culturel/models.py:2784
+#: agenda_culturel/filters.py:470 agenda_culturel/models.py:794
+#: agenda_culturel/models.py:2824
msgid "Status"
msgstr "Status"
-#: agenda_culturel/filters.py:471 agenda_culturel/models.py:2537
+#: agenda_culturel/filters.py:471 agenda_culturel/models.py:2560
msgid "Closed"
msgstr "Fermé"
@@ -156,7 +156,7 @@ msgid "Open"
msgstr "Ouvert"
#: agenda_culturel/filters.py:475 agenda_culturel/filters.py:476
-#: agenda_culturel/models.py:2531
+#: agenda_culturel/models.py:2554
msgid "Spam"
msgstr "Spam"
@@ -164,7 +164,7 @@ msgstr "Spam"
msgid "Non spam"
msgstr "Non spam"
-#: agenda_culturel/filters.py:481 agenda_culturel/models.py:2552
+#: agenda_culturel/filters.py:481 agenda_culturel/models.py:2575
msgid "Type"
msgstr "Type"
@@ -195,11 +195,11 @@ msgstr ""
msgid "Your email"
msgstr "Votre adresse email"
-#: agenda_culturel/forms.py:166 agenda_culturel/models.py:2519
+#: agenda_culturel/forms.py:166 agenda_culturel/models.py:2542
msgid "Your email address"
msgstr "Votre adresse email"
-#: agenda_culturel/forms.py:172 agenda_culturel/models.py:2544
+#: agenda_culturel/forms.py:172 agenda_culturel/models.py:2567
msgid "Comments"
msgstr "Commentaires"
@@ -214,20 +214,20 @@ msgstr ""
msgid "Receive notification of publication or leave a message for moderation"
msgstr "Être notifié de la publication ou laisser un message à la modération"
-#: agenda_culturel/forms.py:206 agenda_culturel/models.py:212
-#: agenda_culturel/models.py:779 agenda_culturel/models.py:2695
-#: agenda_culturel/models.py:2819
+#: agenda_culturel/forms.py:206 agenda_culturel/models.py:235
+#: agenda_culturel/models.py:802 agenda_culturel/models.py:2718
+#: agenda_culturel/models.py:2859
msgid "Category"
msgstr "Catégorie"
#: agenda_culturel/forms.py:212 agenda_culturel/forms.py:245
#: agenda_culturel/forms.py:288 agenda_culturel/forms.py:468
-#: agenda_culturel/models.py:265 agenda_culturel/models.py:896
+#: agenda_culturel/models.py:288 agenda_culturel/models.py:919
msgid "Tags"
msgstr "Étiquettes"
#: agenda_culturel/forms.py:220 agenda_culturel/forms.py:631
-#: agenda_culturel/models.py:1025
+#: agenda_culturel/models.py:1048
msgid "Event"
msgstr "Événement"
@@ -266,12 +266,12 @@ msgstr "Cet événement est récurrent"
msgid "Details"
msgstr "Détails"
-#: agenda_culturel/forms.py:376 agenda_culturel/models.py:808
-#: agenda_culturel/models.py:2670
+#: agenda_culturel/forms.py:376 agenda_culturel/models.py:831
+#: agenda_culturel/models.py:2693
msgid "Location"
msgstr "Localisation"
-#: agenda_culturel/forms.py:381 agenda_culturel/models.py:852
+#: agenda_culturel/forms.py:381 agenda_culturel/models.py:875
msgid "Illustration"
msgstr "Illustration"
@@ -345,8 +345,8 @@ msgstr "Valeur de la version sélectionnée"
msgid "Apply category {} to the event {}"
msgstr "Appliquer la catégorie {} à l'événement {}"
-#: agenda_culturel/forms.py:857 agenda_culturel/models.py:596
-#: agenda_culturel/models.py:2871
+#: agenda_culturel/forms.py:857 agenda_culturel/models.py:619
+#: agenda_culturel/models.py:2911
msgid "Place"
msgstr "Lieu"
@@ -368,7 +368,7 @@ msgstr ""
msgid "Header"
msgstr "Entête"
-#: agenda_culturel/forms.py:914 agenda_culturel/models.py:558
+#: agenda_culturel/forms.py:914 agenda_culturel/models.py:581
msgid "Address"
msgstr "Adresse"
@@ -413,11 +413,31 @@ msgstr ""
"la page n'était pas encore peuplée des événements, le temps de chargement a "
"sans doute été trop court"
-#: agenda_culturel/models.py:63
+#: agenda_culturel/models.py:70
+msgid "mean"
+msgstr "moyenne"
+
+#: agenda_culturel/models.py:71
+msgid "median"
+msgstr "médiane"
+
+#: agenda_culturel/models.py:72
+msgid "maximum"
+msgstr "maximum"
+
+#: agenda_culturel/models.py:73
+msgid "minimum"
+msgstr "minimum"
+
+#: agenda_culturel/models.py:74
+msgid "stdev"
+msgstr "écart-type"
+
+#: agenda_culturel/models.py:86
msgid "Expert moderation user"
msgstr "Utilisateur expert en modération"
-#: agenda_culturel/models.py:65
+#: agenda_culturel/models.py:88
msgid ""
"This user is an expert in moderation, and the interface features additional "
"functionalities."
@@ -425,102 +445,102 @@ msgstr ""
"Cet utilisateur est un expert en modération, et l'interface comporte des "
"fonctionnalités additionnelles."
-#: agenda_culturel/models.py:71 agenda_culturel/models.py:75
+#: agenda_culturel/models.py:94 agenda_culturel/models.py:98
msgid "User profile"
msgstr ""
-#: agenda_culturel/models.py:72
+#: agenda_culturel/models.py:95
msgid "User profiles"
msgstr ""
-#: agenda_culturel/models.py:95 agenda_culturel/models.py:142
-#: agenda_culturel/models.py:221 agenda_culturel/models.py:515
-#: agenda_culturel/models.py:556 agenda_culturel/models.py:662
-#: agenda_culturel/models.py:2511 agenda_culturel/models.py:2620
+#: agenda_culturel/models.py:118 agenda_culturel/models.py:165
+#: agenda_culturel/models.py:244 agenda_culturel/models.py:538
+#: agenda_culturel/models.py:579 agenda_culturel/models.py:685
+#: agenda_culturel/models.py:2534 agenda_culturel/models.py:2643
msgid "Name"
msgstr "Nom"
-#: agenda_culturel/models.py:96 agenda_culturel/models.py:142
+#: agenda_culturel/models.py:119 agenda_culturel/models.py:165
msgid "Category name"
msgstr "Nom de la catégorie"
-#: agenda_culturel/models.py:101
+#: agenda_culturel/models.py:124
msgid "Content"
msgstr "Contenu"
-#: agenda_culturel/models.py:102
+#: agenda_culturel/models.py:125
msgid "Text as shown to the visitors"
msgstr "Texte tel que présenté aux visiteureuses"
-#: agenda_culturel/models.py:106
+#: agenda_culturel/models.py:129
msgid "URL path"
msgstr "Chemin URL"
-#: agenda_culturel/models.py:107
+#: agenda_culturel/models.py:130
msgid "URL path where the content is included."
msgstr "Chemin URL où le contenu est présent."
-#: agenda_culturel/models.py:111
+#: agenda_culturel/models.py:134
msgid "Static content"
msgstr "Contenu statique"
-#: agenda_culturel/models.py:112
+#: agenda_culturel/models.py:135
msgid "Static contents"
msgstr "Contenus statiques"
-#: agenda_culturel/models.py:148
+#: agenda_culturel/models.py:171
msgid "Color"
msgstr "Couleur"
-#: agenda_culturel/models.py:149
+#: agenda_culturel/models.py:172
msgid "Color used as background for the category"
msgstr "Couleur utilisée comme fond de la catégorie"
-#: agenda_culturel/models.py:155
+#: agenda_culturel/models.py:178
msgid "Pictogram"
msgstr "Pictogramme"
-#: agenda_culturel/models.py:156
+#: agenda_culturel/models.py:179
msgid "Pictogram of the category (svg format)"
msgstr "Pictogramme de la catégorie (format svg)"
-#: agenda_culturel/models.py:163
+#: agenda_culturel/models.py:186
msgid "Position for ordering categories"
msgstr "Position pour ordonner les catégories"
-#: agenda_culturel/models.py:213
+#: agenda_culturel/models.py:236
msgid "Categories"
msgstr "Catégories"
-#: agenda_culturel/models.py:222
+#: agenda_culturel/models.py:245
msgid "Tag name"
msgstr "Nom de l'étiquette"
-#: agenda_culturel/models.py:228 agenda_culturel/models.py:579
-#: agenda_culturel/models.py:678 agenda_culturel/models.py:835
+#: agenda_culturel/models.py:251 agenda_culturel/models.py:602
+#: agenda_culturel/models.py:701 agenda_culturel/models.py:858
msgid "Description"
msgstr "Description"
-#: agenda_culturel/models.py:229
+#: agenda_culturel/models.py:252
msgid "Description of the tag"
msgstr "Description de l'étiquette"
-#: agenda_culturel/models.py:235 agenda_culturel/models.py:2478
-#: agenda_culturel/models.py:2525
+#: agenda_culturel/models.py:258 agenda_culturel/models.py:2501
+#: agenda_culturel/models.py:2548
msgid "Message"
msgstr "Message"
-#: agenda_culturel/models.py:237
+#: agenda_culturel/models.py:260
msgid "Message displayed to the user on each event associated with this tag."
msgstr ""
"Message affiché à l'utilisateur sur chaque événement associé à cette "
"étiquette."
-#: agenda_culturel/models.py:244
+#: agenda_culturel/models.py:267
msgid "Principal"
msgstr "Principal"
-#: agenda_culturel/models.py:246
+#: agenda_culturel/models.py:269
msgid ""
"This tag is highlighted as a main tag for visitors, particularly in the "
"filter."
@@ -528,91 +548,91 @@ msgstr ""
"Cette étiquette est mise en avant comme étiquette principale pour les "
"visiteurs, en particulier dans le filtre."
-#: agenda_culturel/models.py:252
+#: agenda_culturel/models.py:275
msgid "In excluded suggestions"
msgstr "Dans les suggestions d'exclusion"
-#: agenda_culturel/models.py:253
+#: agenda_culturel/models.py:276
msgid "This tag will be part of the excluded suggestions."
msgstr "Cette étiquette fera partie des suggestions d'exclusion."
-#: agenda_culturel/models.py:258
+#: agenda_culturel/models.py:281
msgid "In included suggestions"
msgstr "Dans les suggestions d'inclusion."
-#: agenda_culturel/models.py:259
+#: agenda_culturel/models.py:282
msgid "This tag will be part of the included suggestions."
msgstr "Cette étiquette fera partie des suggestions d'inclusion."
-#: agenda_culturel/models.py:264
+#: agenda_culturel/models.py:287
msgid "Tag"
msgstr "Étiquette"
-#: agenda_culturel/models.py:353
+#: agenda_culturel/models.py:376
msgid "Suggestions"
msgstr "Suggestions"
-#: agenda_culturel/models.py:354
+#: agenda_culturel/models.py:377
msgid "Others"
msgstr "Autres"
-#: agenda_culturel/models.py:367
+#: agenda_culturel/models.py:390
msgid "Representative event"
msgstr "Événement représentatif"
-#: agenda_culturel/models.py:369
+#: agenda_culturel/models.py:392
msgid "This event is the representative event of the duplicated events group"
msgstr ""
"Cet événement est l'événement représentatif du groupe d'événements dupliqués."
-#: agenda_culturel/models.py:377 agenda_culturel/models.py:378
+#: agenda_culturel/models.py:400 agenda_culturel/models.py:401
msgid "Duplicated events"
msgstr "Événements dupliqués"
-#: agenda_culturel/models.py:516
+#: agenda_culturel/models.py:539
msgid "Name of the location"
msgstr "Nom de la position"
-#: agenda_culturel/models.py:527
+#: agenda_culturel/models.py:550
msgid "Main"
msgstr "Principale"
-#: agenda_culturel/models.py:529
+#: agenda_culturel/models.py:552
msgid "This location is one of the main locations (shown first higher values)."
msgstr ""
"Cette position est une position principale (affichage en premier des plus "
"grandes valeurs)."
-#: agenda_culturel/models.py:534
+#: agenda_culturel/models.py:557
msgid "Suggested distance (km)"
msgstr ""
-#: agenda_culturel/models.py:536
+#: agenda_culturel/models.py:559
msgid ""
"If this distance is given, this location is part of the suggested filters."
msgstr ""
-#: agenda_culturel/models.py:545
+#: agenda_culturel/models.py:568
msgid "Reference location"
msgstr "Position de référence"
-#: agenda_culturel/models.py:546
+#: agenda_culturel/models.py:569
msgid "Reference locations"
msgstr "Positions de référence"
-#: agenda_culturel/models.py:556
+#: agenda_culturel/models.py:579
msgid "Name of the place"
msgstr "Nom du lieu"
-#: agenda_culturel/models.py:559
+#: agenda_culturel/models.py:582
msgid "Address of this place (without city name)"
msgstr "Adresse de ce lieu (sans le nom de la ville)"
-#: agenda_culturel/models.py:564
+#: agenda_culturel/models.py:587
msgid "Postcode"
msgstr "Code postal"
-#: agenda_culturel/models.py:566
+#: agenda_culturel/models.py:589
msgid ""
"The post code is not displayed, but makes it easier to find an address when "
"you enter it."
@@ -620,23 +640,23 @@ msgstr ""
"Le code postal ne sera pas affiché, mais facilite la recherche d'adresse au "
"moment de la saisie."
-#: agenda_culturel/models.py:571
+#: agenda_culturel/models.py:594
msgid "City"
msgstr "Ville"
-#: agenda_culturel/models.py:571
+#: agenda_culturel/models.py:594
msgid "City name"
msgstr "Nom de la ville"
-#: agenda_culturel/models.py:580
+#: agenda_culturel/models.py:603
msgid "Description of the place, including accessibility."
msgstr "Description du lieu, inclus l'accessibilité."
-#: agenda_culturel/models.py:587
+#: agenda_culturel/models.py:610
msgid "Alternative names"
msgstr "Noms alternatifs"
-#: agenda_culturel/models.py:589
+#: agenda_culturel/models.py:612
msgid ""
"Alternative names or addresses used to match a place with the free-form "
"location of an event."
@@ -644,31 +664,31 @@ msgstr ""
"Noms et adresses alternatives qui seront utilisées pour associer une adresse "
"avec la localisation en forme libre d'un événement"
-#: agenda_culturel/models.py:597
+#: agenda_culturel/models.py:620
msgid "Places"
msgstr "Lieux"
-#: agenda_culturel/models.py:663
+#: agenda_culturel/models.py:686
msgid "Organisation name"
msgstr "Nom de l'organisme"
-#: agenda_culturel/models.py:670
+#: agenda_culturel/models.py:693
msgid "Website"
msgstr "Site internet"
-#: agenda_culturel/models.py:671
+#: agenda_culturel/models.py:694
msgid "Website of the organisation"
msgstr "Site internet de l'organisme"
-#: agenda_culturel/models.py:679
+#: agenda_culturel/models.py:702
msgid "Description of the organisation."
msgstr "Description de l'organisme"
-#: agenda_culturel/models.py:686
+#: agenda_culturel/models.py:709
msgid "Principal place"
msgstr "Lieu principal"
-#: agenda_culturel/models.py:688
+#: agenda_culturel/models.py:711
msgid ""
"Place mainly associated with this organizer. Mainly used if there is a "
"similarity in the name, to avoid redundant displays."
@@ -676,75 +696,75 @@ msgstr ""
"Lieu principalement associé à cet organisateur. Principalement utilisé s'il "
"y a une similarité de nom, pour éviter les affichages redondants."
-#: agenda_culturel/models.py:696
+#: agenda_culturel/models.py:719
msgid "Organisation"
msgstr "Organisme"
-#: agenda_culturel/models.py:697
+#: agenda_culturel/models.py:720
msgid "Organisations"
msgstr "Organismes"
-#: agenda_culturel/models.py:708 agenda_culturel/models.py:2665
+#: agenda_culturel/models.py:731 agenda_culturel/models.py:2688
msgid "Published"
msgstr "Publié"
-#: agenda_culturel/models.py:709
+#: agenda_culturel/models.py:732
msgid "Draft"
msgstr "Brouillon"
-#: agenda_culturel/models.py:710
+#: agenda_culturel/models.py:733
msgid "Trash"
msgstr "Corbeille"
-#: agenda_culturel/models.py:720
+#: agenda_culturel/models.py:743
msgid "Author currently editing/moderating the event"
msgstr ""
-#: agenda_culturel/models.py:730
+#: agenda_culturel/models.py:753
msgid "Author of the event creation"
msgstr "Auteur de la création de l'événement"
-#: agenda_culturel/models.py:739
+#: agenda_culturel/models.py:762
msgid "Author of the last importation"
msgstr "Auteur de la dernière importation"
-#: agenda_culturel/models.py:748
+#: agenda_culturel/models.py:771
msgid "Author of the last modification"
msgstr "Auteur de la dernière modification"
-#: agenda_culturel/models.py:757
+#: agenda_culturel/models.py:780
msgid "Author of the last moderation"
msgstr "Auteur de la dernière modération"
-#: agenda_culturel/models.py:768
+#: agenda_culturel/models.py:791
msgid "Title"
msgstr "Titre"
-#: agenda_culturel/models.py:785
+#: agenda_culturel/models.py:808
msgid "Start day"
msgstr "Date de début"
-#: agenda_culturel/models.py:787
+#: agenda_culturel/models.py:810
msgid "Start time"
msgstr "Heure de début"
-#: agenda_culturel/models.py:793
+#: agenda_culturel/models.py:816
msgid "End day"
msgstr "Date de fin"
-#: agenda_culturel/models.py:797
+#: agenda_culturel/models.py:820
msgid "End time"
msgstr "Heure de fin"
-#: agenda_culturel/models.py:800
+#: agenda_culturel/models.py:823
msgid "Recurrence"
msgstr "Récurrence"
-#: agenda_culturel/models.py:814
+#: agenda_culturel/models.py:837
msgid "Location (free form)"
msgstr "Localisation (forme libre)"
-#: agenda_culturel/models.py:816
+#: agenda_culturel/models.py:839
msgid ""
"Address of the event in case its not available in the already known places "
"(free form)"
@@ -752,11 +772,11 @@ msgstr ""
"Adresse d'un événement si elle n'est pas déjà présente dans la liste des "
"lieux disponibles (forme libre)"
-#: agenda_culturel/models.py:825
+#: agenda_culturel/models.py:848
msgid "Local event"
msgstr "Événement de portée locale"
-#: agenda_culturel/models.py:827
+#: agenda_culturel/models.py:850
msgid ""
"If the event is a local event, it will not be proposed by default in daily, "
"weekly or monthly views, unless the user has explicitly indicated that he "
@@ -766,11 +786,11 @@ msgstr ""
"les vues quotidiennes, hebdomadaires ou mensuelles, sauf si l'utilisateur a "
"explicitement indiqué qu'il souhaite voir ces événements."
-#: agenda_culturel/models.py:843
+#: agenda_culturel/models.py:866
msgid "Organisers"
msgstr "Organisateurs"
-#: agenda_culturel/models.py:845
+#: agenda_culturel/models.py:868
msgid ""
"list of event organisers. Organizers will only be displayed if one of them "
"does not normally use the venue."
@@ -778,112 +798,112 @@ msgstr ""
"Liste des organisateurs de l'événements. Les organisateurs seront affichés "
"uniquement si au moins un d'entre eux n'utilise pas habituellement le lieu."
-#: agenda_culturel/models.py:859
+#: agenda_culturel/models.py:882
msgid "Illustration (URL)"
msgstr "Illustration (URL)"
-#: agenda_culturel/models.py:860
+#: agenda_culturel/models.py:883
msgid "External URL of the illustration image"
msgstr "URL externe de l'image illustrative"
-#: agenda_culturel/models.py:866
+#: agenda_culturel/models.py:889
msgid "Illustration description"
msgstr "Description de l'illustration"
-#: agenda_culturel/models.py:867
+#: agenda_culturel/models.py:890
msgid "Alternative text used by screen readers for the image"
msgstr "Texte alternatif utiliser par les lecteurs d'écrans pour l'image"
-#: agenda_culturel/models.py:875
+#: agenda_culturel/models.py:898
msgid "Importation source"
msgstr "Source d'importation"
-#: agenda_culturel/models.py:876
+#: agenda_culturel/models.py:899
msgid "Importation source used to detect removed entries."
msgstr "Source d'importation utilisée pour détecter les éléments supprimés/"
-#: agenda_culturel/models.py:882
+#: agenda_culturel/models.py:905
msgid "UUIDs"
msgstr "UUIDs"
-#: agenda_culturel/models.py:883
+#: agenda_culturel/models.py:906
msgid "UUIDs from import to detect duplicated entries."
msgstr "UUIDs utilisés pendant l'import pour détecter les entrées dupliquées"
-#: agenda_culturel/models.py:889
+#: agenda_culturel/models.py:912
msgid "Online sources or ticketing"
msgstr "Sources en ligne ou billetterie"
-#: agenda_culturel/models.py:903
+#: agenda_culturel/models.py:926
msgid "Other versions"
msgstr ""
-#: agenda_culturel/models.py:1026
+#: agenda_culturel/models.py:1049
msgid "Events"
msgstr "Événements"
-#: agenda_culturel/models.py:1082
+#: agenda_culturel/models.py:1105
msgid "recurrent import"
msgstr "import récurrent"
-#: agenda_culturel/models.py:1084
+#: agenda_culturel/models.py:1107
msgid "a non authenticated user"
msgstr "un utilisateur non connecté"
-#: agenda_culturel/models.py:1566
+#: agenda_culturel/models.py:1589
msgid "Your event has been published"
msgstr "Ton événement a été publié"
-#: agenda_culturel/models.py:1571
+#: agenda_culturel/models.py:1594
msgid "Your message has not been retained"
msgstr "Ton événement n'a pas été retenu"
-#: agenda_culturel/models.py:1659 agenda_culturel/models.py:2475
+#: agenda_culturel/models.py:1682 agenda_culturel/models.py:2498
msgid "Warning"
msgstr "Warning"
-#: agenda_culturel/models.py:1661 agenda_culturel/models.py:1767
+#: agenda_culturel/models.py:1684 agenda_culturel/models.py:1790
msgid "the date has not been imported correctly."
msgstr "la date n'a pas été importée correctement."
-#: agenda_culturel/models.py:1749
+#: agenda_culturel/models.py:1772
msgid "during import process"
msgstr "pendant le processus d'import"
-#: agenda_culturel/models.py:1765 agenda_culturel/models.py:1775
-#: agenda_culturel/models.py:1786
+#: agenda_culturel/models.py:1788 agenda_culturel/models.py:1798
+#: agenda_culturel/models.py:1809
msgid "warning"
msgstr "attention"
-#: agenda_culturel/models.py:1777
+#: agenda_culturel/models.py:1800
msgid "the title has not been imported correctly."
msgstr "le titre n'a pas été importé correctement."
-#: agenda_culturel/models.py:1789
+#: agenda_culturel/models.py:1812
msgid "The import was unable to find an event in the page."
msgstr "L'import a été incapable de trouver un événement dans la page."
-#: agenda_culturel/models.py:2137
+#: agenda_culturel/models.py:2160
msgid "Updated field(s): "
msgstr "Champ(s) mis à jour: "
-#: agenda_culturel/models.py:2141
+#: agenda_culturel/models.py:2164
msgid "Update"
msgstr "Mise à jour"
-#: agenda_culturel/models.py:2142
+#: agenda_culturel/models.py:2165
msgid "update process"
msgstr "processus de mise à jour"
-#: agenda_culturel/models.py:2211
+#: agenda_culturel/models.py:2234
msgid "Import"
msgstr "Import"
-#: agenda_culturel/models.py:2212
+#: agenda_culturel/models.py:2235
msgid "import process"
msgstr "processus d'import"
-#: agenda_culturel/models.py:2214
+#: agenda_culturel/models.py:2237
msgid ""
"The duration of the event is a little too long for direct publication. "
"Moderators can choose to publish it or not."
@@ -891,187 +911,187 @@ msgstr ""
"La durée de l'événement est un peu trop longue pour qu'il soit publié "
"directement. Les modérateurs peuvent choisir de le publier ou non."
-#: agenda_culturel/models.py:2466
+#: agenda_culturel/models.py:2489
msgid "From contributor"
msgstr "D'un·e contributeurice"
-#: agenda_culturel/models.py:2467
+#: agenda_culturel/models.py:2490
msgid "Import process"
msgstr "Processus d'import"
-#: agenda_culturel/models.py:2468
+#: agenda_culturel/models.py:2491
msgid "Update process"
msgstr "Processus de mise à jour"
-#: agenda_culturel/models.py:2469
+#: agenda_culturel/models.py:2492
msgid "Contact form"
msgstr "Formulaire de contact"
-#: agenda_culturel/models.py:2470
+#: agenda_culturel/models.py:2493
msgid "Event report"
msgstr "Signalemet d'événement"
-#: agenda_culturel/models.py:2473
+#: agenda_culturel/models.py:2496
msgid "From contributor (without message)"
msgstr "D'un·e contributeurice (sans message)"
-#: agenda_culturel/models.py:2479
+#: agenda_culturel/models.py:2502
msgid "Messages"
msgstr "Messages"
-#: agenda_culturel/models.py:2488
+#: agenda_culturel/models.py:2511
msgid "Subject"
msgstr "Sujet"
-#: agenda_culturel/models.py:2489
+#: agenda_culturel/models.py:2512
msgid "The subject of your message"
msgstr "Sujet de votre message"
-#: agenda_culturel/models.py:2495
+#: agenda_culturel/models.py:2518
msgid "Related event"
msgstr "Événement associé"
-#: agenda_culturel/models.py:2496
+#: agenda_culturel/models.py:2519
msgid "The message is associated with this event."
msgstr "Le message est associé à cet événement."
-#: agenda_culturel/models.py:2504
+#: agenda_culturel/models.py:2527
msgid "Author of the message"
msgstr "Auteur du message"
-#: agenda_culturel/models.py:2512
+#: agenda_culturel/models.py:2535
msgid "Your name"
msgstr "Votre nom"
-#: agenda_culturel/models.py:2518
+#: agenda_culturel/models.py:2541
msgid "Email address"
msgstr "Adresse email"
-#: agenda_culturel/models.py:2525
+#: agenda_culturel/models.py:2548
msgid "Your message"
msgstr "Votre message"
-#: agenda_culturel/models.py:2532
+#: agenda_culturel/models.py:2555
msgid "This message is a spam."
msgstr "Ce message est un spam."
-#: agenda_culturel/models.py:2539
+#: agenda_culturel/models.py:2562
msgid "this message has been processed and no longer needs to be handled"
msgstr "Ce message a été traité et ne nécessite plus d'être pris en charge"
-#: agenda_culturel/models.py:2545
+#: agenda_culturel/models.py:2568
msgid "Comments on the message from the moderation team"
msgstr "Commentaires sur ce message par l'équipe de modération"
-#: agenda_culturel/models.py:2578 agenda_culturel/models.py:2766
+#: agenda_culturel/models.py:2601 agenda_culturel/models.py:2806
msgid "Recurrent import"
msgstr "Import récurrent"
-#: agenda_culturel/models.py:2579
+#: agenda_culturel/models.py:2602
msgid "Recurrent imports"
msgstr "Imports récurrents"
-#: agenda_culturel/models.py:2583
+#: agenda_culturel/models.py:2606
msgid "ical"
msgstr "ical"
-#: agenda_culturel/models.py:2584
+#: agenda_culturel/models.py:2607
msgid "ical no busy"
msgstr "ical sans busy"
-#: agenda_culturel/models.py:2585
+#: agenda_culturel/models.py:2608
msgid "ical no VC"
msgstr "ical sans VC"
-#: agenda_culturel/models.py:2586
+#: agenda_culturel/models.py:2609
msgid "ical naive timezone"
msgstr "ical timezone naïve"
-#: agenda_culturel/models.py:2587
+#: agenda_culturel/models.py:2610
msgid "lacoope.org"
msgstr "lacoope.org"
-#: agenda_culturel/models.py:2588
+#: agenda_culturel/models.py:2611
msgid "la comédie"
msgstr "la comédie"
-#: agenda_culturel/models.py:2589
+#: agenda_culturel/models.py:2612
msgid "le fotomat"
msgstr "le fotomat"
-#: agenda_culturel/models.py:2590
+#: agenda_culturel/models.py:2613
msgid "la puce à l'oreille"
msgstr "la puce à loreille"
-#: agenda_culturel/models.py:2591
+#: agenda_culturel/models.py:2614
msgid "Plugin wordpress MEC"
msgstr "Plugin wordpress MEC"
-#: agenda_culturel/models.py:2592
+#: agenda_culturel/models.py:2615
msgid "Événements d'une page FB"
msgstr "Événements d'une page FB"
-#: agenda_culturel/models.py:2593
+#: agenda_culturel/models.py:2616
msgid "Billetterie Clermont-Ferrand"
msgstr ""
-#: agenda_culturel/models.py:2594
+#: agenda_culturel/models.py:2617
msgid "Arachnée concert"
msgstr "Arachnée concert"
-#: agenda_culturel/models.py:2595
+#: agenda_culturel/models.py:2618
msgid "Le Rio"
msgstr "Le Rio"
-#: agenda_culturel/models.py:2596
+#: agenda_culturel/models.py:2619
msgid "La Raymonde"
msgstr "La Raymone"
-#: agenda_culturel/models.py:2597
+#: agenda_culturel/models.py:2620
msgid "Agenda apidae tourisme"
msgstr "Agenda apidae tourisme"
-#: agenda_culturel/models.py:2598
+#: agenda_culturel/models.py:2621
msgid "Agenda iguana (médiathèques)"
msgstr "Agenda iguana (médiathèques)"
-#: agenda_culturel/models.py:2599
+#: agenda_culturel/models.py:2622
msgid "Mille formes"
msgstr "Mille Formes"
-#: agenda_culturel/models.py:2600
+#: agenda_culturel/models.py:2623
msgid "Les Amis du Temps des Cerises"
msgstr "Les Amis du Temps des Cerises"
-#: agenda_culturel/models.py:2601
+#: agenda_culturel/models.py:2624
msgid "Mobilizon"
msgstr "Mobilizon"
-#: agenda_culturel/models.py:2604
+#: agenda_culturel/models.py:2627
msgid "simple"
msgstr "simple"
-#: agenda_culturel/models.py:2605
+#: agenda_culturel/models.py:2628
msgid "Headless Chromium"
msgstr "chromium sans interface"
-#: agenda_culturel/models.py:2608
+#: agenda_culturel/models.py:2631
msgid "Headless Chromium (pause)"
msgstr "chromium sans interface (pause)"
-#: agenda_culturel/models.py:2614
+#: agenda_culturel/models.py:2637
msgid "daily"
msgstr "chaque jour"
-#: agenda_culturel/models.py:2616
+#: agenda_culturel/models.py:2639
msgid "weekly"
msgstr "chaque semaine"
-#: agenda_culturel/models.py:2617
+#: agenda_culturel/models.py:2640
msgid "never"
msgstr "jamais"
-#: agenda_culturel/models.py:2622
+#: agenda_culturel/models.py:2645
msgid ""
"Recurrent import name. Be careful to choose a name that is easy to "
"understand, as it will be public and displayed on the sites About page."
@@ -1079,171 +1099,151 @@ msgstr ""
"Nom de l'import récurrent. Attention à choisir un nom compréhensible, car il "
"sera public, et affiché sur la page à propos du site."
-#: agenda_culturel/models.py:2629
+#: agenda_culturel/models.py:2652
msgid "Processor"
msgstr "Processeur"
-#: agenda_culturel/models.py:2635
+#: agenda_culturel/models.py:2658
msgid "Downloader"
msgstr "Téléchargeur"
-#: agenda_culturel/models.py:2642
+#: agenda_culturel/models.py:2665
msgid "Import recurrence"
msgstr "Récurrence d'import"
-#: agenda_culturel/models.py:2649
+#: agenda_culturel/models.py:2672
msgid "Source"
msgstr "Source"
-#: agenda_culturel/models.py:2650
+#: agenda_culturel/models.py:2673
msgid "URL of the source document"
msgstr "URL du document source"
-#: agenda_culturel/models.py:2655
+#: agenda_culturel/models.py:2678
msgid "Browsable url"
msgstr "URL navigable"
-#: agenda_culturel/models.py:2657
+#: agenda_culturel/models.py:2680
msgid "URL of the corresponding document that will be shown to visitors."
msgstr "URL correspondant au document et qui sera montrée aux visiteurs"
-#: agenda_culturel/models.py:2666
+#: agenda_culturel/models.py:2689
msgid "Status of each imported event (published or draft)"
msgstr "Status de chaque événement importé (publié ou brouillon)"
-#: agenda_culturel/models.py:2671
+#: agenda_culturel/models.py:2694
msgid "Address for each imported event"
msgstr "Adresse de chaque événement importé"
-#: agenda_culturel/models.py:2678
+#: agenda_culturel/models.py:2701
msgid "Force location"
msgstr "Focer la localisation"
-#: agenda_culturel/models.py:2679
+#: agenda_culturel/models.py:2702
msgid "force location even if another is detected."
msgstr "Forcer la localisation même si une autre a été détectée."
-#: agenda_culturel/models.py:2685
+#: agenda_culturel/models.py:2708
msgid "Organiser"
msgstr "Organisateur"
-#: agenda_culturel/models.py:2686
+#: agenda_culturel/models.py:2709
msgid "Organiser of each imported event"
msgstr "Organisateur de chaque événement importé"
-#: agenda_culturel/models.py:2696
+#: agenda_culturel/models.py:2719
msgid "Category of each imported event"
msgstr "Catégorie de chaque événement importé"
-#: agenda_culturel/models.py:2704
+#: agenda_culturel/models.py:2727
msgid "Tags for each imported event"
msgstr "Étiquettes de chaque événement importé"
-#: agenda_culturel/models.py:2705
+#: agenda_culturel/models.py:2728
msgid "A list of tags that describe each imported event."
msgstr "Une liste d'étiquettes décrivant chaque événement importé"
-#: agenda_culturel/models.py:2737
-msgid "minimum"
-msgstr "minimum"
-
-#: agenda_culturel/models.py:2738
-msgid "maximum"
-msgstr "maximum"
-
-#: agenda_culturel/models.py:2739
-msgid "mean"
-msgstr "moyenne"
-
-#: agenda_culturel/models.py:2740
-msgid "standard deviation"
-msgstr "écart-type"
-
-#: agenda_culturel/models.py:2741
-msgid "median"
-msgstr "médiane"
-
-#: agenda_culturel/models.py:2747
+#: agenda_culturel/models.py:2787
msgid "Running"
msgstr "En cours"
-#: agenda_culturel/models.py:2748
+#: agenda_culturel/models.py:2788
msgid "Canceled"
msgstr "Annulé"
-#: agenda_culturel/models.py:2749
+#: agenda_culturel/models.py:2789
msgid "Success"
msgstr "Succès"
-#: agenda_culturel/models.py:2750
+#: agenda_culturel/models.py:2790
msgid "Failed"
msgstr "Erreur"
-#: agenda_culturel/models.py:2753
+#: agenda_culturel/models.py:2793
msgid "Batch importation"
msgstr "Importation par lot"
-#: agenda_culturel/models.py:2754
+#: agenda_culturel/models.py:2794
msgid "Batch importations"
msgstr "Importations par lot"
-#: agenda_culturel/models.py:2767
+#: agenda_culturel/models.py:2807
msgid "Reference to the recurrent import processing"
msgstr "Référence du processus d'import récurrent"
-#: agenda_culturel/models.py:2775
+#: agenda_culturel/models.py:2815
msgid "URL (if not recurrent import)"
msgstr "URL (si pas d'import récurrent)"
-#: agenda_culturel/models.py:2776
+#: agenda_culturel/models.py:2816
msgid "Source URL if no RecurrentImport is associated."
msgstr "URL source si aucun import récurrent n'est associé"
-#: agenda_culturel/models.py:2791
+#: agenda_culturel/models.py:2831
msgid "Error message"
msgstr "Votre message"
-#: agenda_culturel/models.py:2795
+#: agenda_culturel/models.py:2835
msgid "Number of collected events"
msgstr "Nombre d'événements collectés"
-#: agenda_culturel/models.py:2798
+#: agenda_culturel/models.py:2838
msgid "Number of imported events"
msgstr "Nombre d'événements importés"
-#: agenda_culturel/models.py:2801
+#: agenda_culturel/models.py:2841
msgid "Number of updated events"
msgstr "Nombre d'événements mis à jour"
-#: agenda_culturel/models.py:2804
+#: agenda_culturel/models.py:2844
msgid "Number of removed events"
msgstr "Nombre d'événements supprimés"
-#: agenda_culturel/models.py:2812
+#: agenda_culturel/models.py:2852
msgid "Weight"
msgstr "Poids"
-#: agenda_culturel/models.py:2813
+#: agenda_culturel/models.py:2853
msgid "The lower is the weight, the earlier the filter is applied"
msgstr "Plus le poids est léger, plus le filtre sera appliqué tôt"
-#: agenda_culturel/models.py:2820
+#: agenda_culturel/models.py:2860
msgid "Category applied to the event"
msgstr "Catégorie appliquée à l'événement"
-#: agenda_culturel/models.py:2825
+#: agenda_culturel/models.py:2865
msgid "Contained in the title"
msgstr "Contenu dans le titre"
-#: agenda_culturel/models.py:2826
+#: agenda_culturel/models.py:2866
msgid "Text contained in the event title"
msgstr "Texte contenu dans le titre de l'événement"
-#: agenda_culturel/models.py:2832
+#: agenda_culturel/models.py:2872
msgid "Exact title extract"
msgstr "Extrait exact du titre"
-#: agenda_culturel/models.py:2834
+#: agenda_culturel/models.py:2874
msgid ""
"If checked, the extract will be searched for in the title using the exact "
"form (capitals, accents)."
@@ -1251,19 +1251,19 @@ msgstr ""
"Si coché, l'extrait sera recherché dans le titre en utilisant la forme "
"exacte (majuscules, accents)"
-#: agenda_culturel/models.py:2840
+#: agenda_culturel/models.py:2880
msgid "Contained in the description"
msgstr "Contenu dans la description"
-#: agenda_culturel/models.py:2841
+#: agenda_culturel/models.py:2881
msgid "Text contained in the description"
msgstr "Texte contenu dans la description"
-#: agenda_culturel/models.py:2847
+#: agenda_culturel/models.py:2887
msgid "Exact description extract"
msgstr "Extrait exact de description"
-#: agenda_culturel/models.py:2849
+#: agenda_culturel/models.py:2889
msgid ""
"If checked, the extract will be searched for in the description using the "
"exact form (capitals, accents)."
@@ -1271,19 +1271,19 @@ msgstr ""
"Si coché, l'extrait sera recherché dans la description en utilisant la forme "
"exacte (majuscules, accents)"
-#: agenda_culturel/models.py:2855
+#: agenda_culturel/models.py:2895
msgid "Contained in the location"
msgstr "Contenu dans la localisation"
-#: agenda_culturel/models.py:2856
+#: agenda_culturel/models.py:2896
msgid "Text contained in the event location"
msgstr "Texte contenu dans la localisation de l'événement"
-#: agenda_culturel/models.py:2862
+#: agenda_culturel/models.py:2902
msgid "Exact location extract"
msgstr "Extrait exact de localisation"
-#: agenda_culturel/models.py:2864
+#: agenda_culturel/models.py:2904
msgid ""
"If checked, the extract will be searched for in the location using the exact "
"form (capitals, accents)."
@@ -1291,15 +1291,15 @@ msgstr ""
"Si coché, l'extrait sera recherché dans la localisation en utilisant la "
"forme exacte (majuscules, accents)"
-#: agenda_culturel/models.py:2872
+#: agenda_culturel/models.py:2912
msgid "Location from place"
msgstr "Localisation depuis le lieu"
-#: agenda_culturel/models.py:2881
+#: agenda_culturel/models.py:2921
msgid "Categorisation rule"
msgstr "Règle de catégorisation"
-#: agenda_culturel/models.py:2882
+#: agenda_culturel/models.py:2922
msgid "Categorisation rules"
msgstr "Règles de catégorisation"
@@ -1621,11 +1621,11 @@ msgstr "L'étiquette a été modifiée avec succès."
msgid "The tag has been successfully created."
msgstr "L'étiquette a été créée avec succès."
-#: agenda_culturel/views.py:2871
+#: agenda_culturel/views.py:2874
msgid "You have not modified the tag name."
msgstr "Vous n'avez pas modifié le nom de l'étiquette."
-#: agenda_culturel/views.py:2886
+#: agenda_culturel/views.py:2889
msgid ""
"This tag {} is already in use, and is described by different information "
"from the current tag. You can force renaming by checking the corresponding "
@@ -1638,7 +1638,7 @@ msgstr ""
"sera supprimée, et tous les événements associés à l'étiquette {} seront "
"associés à l'étiquette {}."
-#: agenda_culturel/views.py:2900
+#: agenda_culturel/views.py:2903
msgid ""
"This tag {} is already in use. You can force renaming by checking the "
"corresponding option."
@@ -1646,21 +1646,24 @@ msgstr ""
"Cette étiquette {} est déjà utilisée. Vous pouvez forcer le renommage en "
"cochant l'option correspondante."
-#: agenda_culturel/views.py:2933
+#: agenda_culturel/views.py:2936
msgid "The tag {} has been successfully renamed to {}."
msgstr "L'étiquette {} a été renommée avec succès en {}."
-#: agenda_culturel/views.py:2975
+#: agenda_culturel/views.py:2978
msgid "The tag {} has been successfully deleted."
msgstr "L'événement {} a été supprimé avec succès."
-#: agenda_culturel/views.py:3001
+#: agenda_culturel/views.py:3004
msgid "Cache successfully cleared."
msgstr "Le cache a été vidé avec succès."
-#: agenda_culturel/views.py:3016
+#: agenda_culturel/views.py:3019
msgid "Your user profile has been successfully modified."
msgstr "Votre profil utilisateur a été modifié avec succès."
+#~ msgid "standard deviation"
+#~ msgstr "écart-type"
+
#~ msgid "la cour des 3 coquins"
#~ msgstr "la cour des 3 coquins"
diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py
index 24aa296..fb2bbe5 100644
--- a/src/agenda_culturel/models.py
+++ b/src/agenda_culturel/models.py
@@ -42,6 +42,8 @@ from icalendar import Event as icalEvent
from location_field.models.spatial import LocationField
from django.dispatch import receiver
from django.db.models.signals import post_save
+from django.db.models.aggregates import StdDev
+from django.db.models import Avg, Max, Min
from .calendar import CalendarDay
from .import_tasks.extractor import Extractor
@@ -49,9 +51,24 @@ from .import_tasks.generic_extractors.fbevent import (
CExtractor as FacebookEventExtractor,
)
+from django.db.models import Aggregate, FloatField
+
logger = logging.getLogger(__name__)
+class Median(Aggregate):
+ function = "PERCENTILE_CONT"
+ name = "median"
+ output_field = FloatField()
+ template = "%(function)s(0.5) WITHIN GROUP (ORDER BY %(expressions)s)"
+
+
+#
+#
+# Useful for translation
+to_be_translated = [_("mean"), _("median"), _("maximum"), _("minimum"), _("stdev")]
+
+
class UserProfile(models.Model):
user = models.OneToOneField(
User,
@@ -2728,26 +2745,38 @@ class RecurrentImport(models.Model):
else:
return None
- def get_foresight_quality(self):
- from statistics import median, mean, stdev
+ def _get_foresight_quality_internal(qs):
+ limit = datetime.now() + timedelta(days=-30)
- values = [
- x["foresight"]
- for x in Event.objects.filter(import_sources__contains=[self.source])
- .annotate(foresight=ExtractDay(F("start_day") - F("created_date")))
- .values("foresight")
- ]
- if len(values) == 0:
- return []
- result = [
- [_("minimum"), min(values)],
- [_("maximum"), max(values)],
- [_("mean"), round(mean(values), 2)],
- [_("median"), median(values)],
- ]
- if len(values) > 2:
- result.append([_("standard deviation"), round(stdev(values), 2)])
- return result
+ qs = qs.filter(start_day__gte=F("created_date")).annotate(
+ foresight=ExtractDay(F("start_day") - F("created_date"))
+ )
+
+ stats = qs.filter().aggregate(
+ minimum=Min("foresight"),
+ maximum=Max("foresight"),
+ mean=Avg("foresight"),
+ median=Median("foresight"),
+ stdev=StdDev("foresight"),
+ )
+
+ statsm = qs.filter(created_date__gte=limit).aggregate(
+ minimum=Min("foresight"),
+ maximum=Max("foresight"),
+ mean=Avg("foresight"),
+ median=Median("foresight"),
+ stdev=StdDev("foresight"),
+ )
+
+ return [[_(x), round(stats[x], 2), round(statsm[x], 2)] for x in stats]
+
+ def get_global_foresight_quality():
+ return RecurrentImport._get_foresight_quality_internal(Event.objects)
+
+ def get_foresight_quality(self):
+ return RecurrentImport._get_foresight_quality_internal(
+ Event.objects.filter(import_sources__contains=[self.source])
+ )
class BatchImportation(models.Model):
diff --git a/src/agenda_culturel/templates/agenda_culturel/page-rimport.html b/src/agenda_culturel/templates/agenda_culturel/page-rimport.html
index 2c5b021..6d6bfbb 100644
--- a/src/agenda_culturel/templates/agenda_culturel/page-rimport.html
+++ b/src/agenda_culturel/templates/agenda_culturel/page-rimport.html
@@ -90,7 +90,9 @@
Qualité de l'anticipation
On s'intéresse à la différence entre la date de publication d'un événement et la date effective de l'événement. Plus le nombre de jours qui les sépare est élevé, plus
- la source anticipe ses événements, et peut être considérée comme une source fiable.
+ la source anticipe ses événements, et peut être considérée comme une source fiable. On ignore les événements ajoutés à l'agenda alors que l'événement a déjà eu lieu.
+ On affiche cette information pour les imports depuis le début de son
+ intégration à l'agenda, mais aussi pour le dernier mois.
@@ -99,9 +101,13 @@
- Nb jours |
+ écart (en jours) |
{% for v in stat %}{{ v.1 }} | {% endfor %}
+
+ écart du dernier mois (en jours) |
+ {% for v in stat %}{{ v.2 }} | {% endfor %}
+
{% endif %}
diff --git a/src/agenda_culturel/templates/agenda_culturel/statistics.html b/src/agenda_culturel/templates/agenda_culturel/statistics.html
index 11ca602..dbee465 100644
--- a/src/agenda_culturel/templates/agenda_culturel/statistics.html
+++ b/src/agenda_culturel/templates/agenda_culturel/statistics.html
@@ -42,6 +42,29 @@
On retrouve une synthèse par mois du tableau précédent, sous forme d'une moyenne du nombre de création d'événements par jour pour chaque mois.
{% include "agenda_culturel/statistics_per_month.html" with data=stats_months_by_creation %}
+ Qualité de l'anticipation
+
+ On s'intéresse à la différence entre la date de publication d'un événement et la date effective de l'événement. Plus le nombre de jours qui les sépare est élevé, plus
+ les sources anticipent leurs événements. On ignore les événements ajoutés à l'agenda alors que l'événement a déjà eu lieu.
+ On affiche cette information pour les imports depuis le début de leur
+ intégration à l'agenda, mais aussi pour le dernier mois.
+
+
+
+ |
+ {% for v in stats_foresight %}{{ v.0 }} | {% endfor %}
+
+
+
+ écart (en jours) |
+ {% for v in stats_foresight %}{{ v.1 }} | {% endfor %}
+
+
+ écart du dernier mois (en jours) |
+ {% for v in stats_foresight %}{{ v.2 }} | {% endfor %}
+
+
+
Par ville
Nombre d'événements référencés par ville.
diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py
index ceed713..30b73ca 100644
--- a/src/agenda_culturel/views.py
+++ b/src/agenda_culturel/views.py
@@ -2816,6 +2816,8 @@ def statistics(request):
.order_by("-total")
)
+ stats_foresight = RecurrentImport.get_global_foresight_quality()
+
context = {
"stats_by_startday": stats["start_day"],
"stats_by_creation": stats["created_date__date"],
@@ -2826,6 +2828,7 @@ def statistics(request):
"first_by_creation": first["created_date__date"],
"last_by_creation": last["created_date__date"],
"nb_by_city": nb_by_city,
+ "stats_foresight": stats_foresight,
}
return render(request, "agenda_culturel/statistics.html", context)