From 527fa886b728cca44d030457e1b70e7f2dc1f692 Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Sat, 15 Mar 2025 19:11:27 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20statistiques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../locale/fr/LC_MESSAGES/django.po | 509 +++++++++--------- src/agenda_culturel/models.py | 67 ++- .../agenda_culturel/page-rimport.html | 10 +- .../templates/agenda_culturel/statistics.html | 23 + src/agenda_culturel/views.py | 3 + 5 files changed, 338 insertions(+), 274 deletions(-) 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 @@ - + {% for v in stat %}{% endfor %} + + + {% for v in stat %}{% endfor %} +
Nb joursécart (en jours){{ v.1 }}
écart du dernier mois (en jours){{ v.2 }}
{% 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 %}{% endfor %} + + + + + {% for v in stats_foresight %}{% endfor %} + + + + {% for v in stats_foresight %}{% endfor %} + + +
{{ v.0 }}
écart (en jours){{ v.1 }}
écart du dernier mois (en jours){{ v.2 }}

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)