Améliorations diverses

- la recherche ne montre pas les événements masqués au utilisateurs non connectés
- une page administration d'accueil
- corrections de typo html
- affichage du caractère masqué ou version représentative dans les titres
- amélioration des outils de filtre des événements dans la partie administrative
This commit is contained in:
Jean-Marie Favreau 2024-11-11 22:20:20 +01:00
parent d4a12cadcd
commit 84123e8bb9
17 changed files with 367 additions and 374 deletions

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: agenda_culturel\n" "Project-Id-Version: agenda_culturel\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-11-10 20:19+0100\n" "POT-Creation-Date: 2024-11-11 22:18+0100\n"
"PO-Revision-Date: 2023-10-29 14:16+0000\n" "PO-Revision-Date: 2023-10-29 14:16+0000\n"
"Last-Translator: Jean-Marie Favreau <jeanmarie.favreau@free.fr>\n" "Last-Translator: Jean-Marie Favreau <jeanmarie.favreau@free.fr>\n"
"Language-Team: Jean-Marie Favreau <jeanmarie.favreau@free.fr>\n" "Language-Team: Jean-Marie Favreau <jeanmarie.favreau@free.fr>\n"
@ -92,7 +92,7 @@ msgstr "Soir"
#: agenda_culturel/forms.py:47 agenda_culturel/models.py:165 #: agenda_culturel/forms.py:47 agenda_culturel/models.py:165
#: agenda_culturel/models.py:191 agenda_culturel/models.py:446 #: agenda_culturel/models.py:191 agenda_culturel/models.py:446
#: agenda_culturel/models.py:1570 agenda_culturel/models.py:1675 #: agenda_culturel/models.py:1592 agenda_culturel/models.py:1697
msgid "Category" msgid "Category"
msgstr "Catégorie" msgstr "Catégorie"
@ -109,70 +109,70 @@ msgstr "La date de fin doit être après la date de début."
msgid "The end time cannot be earlier than the start time." msgid "The end time cannot be earlier than the start time."
msgstr "L'heure de fin ne peut pas être avant l'heure de début." msgstr "L'heure de fin ne peut pas être avant l'heure de début."
#: agenda_culturel/forms.py:168 #: agenda_culturel/forms.py:170
msgid "JSON in the format expected for the import." msgid "JSON in the format expected for the import."
msgstr "JSON dans le format attendu pour l'import" msgstr "JSON dans le format attendu pour l'import"
#: agenda_culturel/forms.py:188 #: agenda_culturel/forms.py:190
msgid " (locally modified version)" msgid " (locally modified version)"
msgstr " (version modifiée localement)" msgstr " (version modifiée localement)"
#: agenda_culturel/forms.py:191 #: agenda_culturel/forms.py:193
msgid " (synchronized on import version)" msgid " (synchronized on import version)"
msgstr " (version synchronisée sur l'import)" msgstr " (version synchronisée sur l'import)"
#: agenda_culturel/forms.py:195 #: agenda_culturel/forms.py:197
msgid "Select {} as representative version." msgid "Select {} as representative version."
msgstr "Sélectionner {} comme version représentative" msgstr "Sélectionner {} comme version représentative"
#: agenda_culturel/forms.py:204 #: agenda_culturel/forms.py:206
msgid "Update {} using some fields from other versions (interactive mode)." msgid "Update {} using some fields from other versions (interactive mode)."
msgstr "" msgstr ""
"Mettre à jour {} en utilisant quelques champs des autres versions (mode " "Mettre à jour {} en utilisant quelques champs des autres versions (mode "
"interactif)." "interactif)."
#: agenda_culturel/forms.py:211 #: agenda_culturel/forms.py:213
msgid " Warning: a version is already locally modified." msgid " Warning: a version is already locally modified."
msgstr " Attention: une version a déjà été modifiée localement." msgstr " Attention: une version a déjà été modifiée localement."
#: agenda_culturel/forms.py:216 #: agenda_culturel/forms.py:218
msgid "Create a new version by merging (interactive mode)." msgid "Create a new version by merging (interactive mode)."
msgstr "Créer une nouvelle version par fusion (mode interactif)." msgstr "Créer une nouvelle version par fusion (mode interactif)."
#: agenda_culturel/forms.py:223 #: agenda_culturel/forms.py:225
msgid "Make {} independent." msgid "Make {} independent."
msgstr "Rendre {} indépendant." msgstr "Rendre {} indépendant."
#: agenda_culturel/forms.py:225 #: agenda_culturel/forms.py:227
msgid "Make all versions independent." msgid "Make all versions independent."
msgstr "Rendre toutes les versions indépendantes." msgstr "Rendre toutes les versions indépendantes."
#: agenda_culturel/forms.py:281 #: agenda_culturel/forms.py:283
msgid "Value of the selected version" msgid "Value of the selected version"
msgstr "Valeur de la version sélectionnée" msgstr "Valeur de la version sélectionnée"
#: agenda_culturel/forms.py:283 agenda_culturel/forms.py:287 #: agenda_culturel/forms.py:285 agenda_culturel/forms.py:289
msgid "Value of version {}" msgid "Value of version {}"
msgstr "Valeur de la version {}" msgstr "Valeur de la version {}"
#: agenda_culturel/forms.py:474 #: agenda_culturel/forms.py:476
msgid "Apply category {} to the event {}" msgid "Apply category {} to the event {}"
msgstr "Appliquer la catégorie {} à l'événement {}" msgstr "Appliquer la catégorie {} à l'événement {}"
#: agenda_culturel/forms.py:489 agenda_culturel/models.py:370 #: agenda_culturel/forms.py:491 agenda_culturel/models.py:370
#: agenda_culturel/models.py:1727 #: agenda_culturel/models.py:1749
msgid "Place" msgid "Place"
msgstr "Lieu" msgstr "Lieu"
#: agenda_culturel/forms.py:491 #: agenda_culturel/forms.py:493
msgid "Create a missing place" msgid "Create a missing place"
msgstr "Créer un lieu manquant" msgstr "Créer un lieu manquant"
#: agenda_culturel/forms.py:501 #: agenda_culturel/forms.py:503
msgid "Add \"{}\" to the aliases of the place" msgid "Add \"{}\" to the aliases of the place"
msgstr "Ajouter « {} » aux alias du lieu" msgstr "Ajouter « {} » aux alias du lieu"
#: agenda_culturel/forms.py:528 #: agenda_culturel/forms.py:530
msgid "On saving, use aliases to detect all matching events with missing place" msgid "On saving, use aliases to detect all matching events with missing place"
msgstr "" msgstr ""
"Lors de l'enregistrement, utiliser des alias pour détecter tous les " "Lors de l'enregistrement, utiliser des alias pour détecter tous les "
@ -180,8 +180,8 @@ msgstr ""
#: agenda_culturel/models.py:49 agenda_culturel/models.py:94 #: agenda_culturel/models.py:49 agenda_culturel/models.py:94
#: agenda_culturel/models.py:172 agenda_culturel/models.py:332 #: agenda_culturel/models.py:172 agenda_culturel/models.py:332
#: agenda_culturel/models.py:349 agenda_culturel/models.py:1442 #: agenda_culturel/models.py:349 agenda_culturel/models.py:1464
#: agenda_culturel/models.py:1516 #: agenda_culturel/models.py:1538
msgid "Name" msgid "Name"
msgstr "Nom" msgstr "Nom"
@ -335,7 +335,7 @@ msgstr ""
msgid "Places" msgid "Places"
msgstr "Lieux" msgstr "Lieux"
#: agenda_culturel/models.py:424 agenda_culturel/models.py:1557 #: agenda_culturel/models.py:424 agenda_culturel/models.py:1579
msgid "Published" msgid "Published"
msgstr "Publié" msgstr "Publié"
@ -355,7 +355,7 @@ msgstr "Titre"
msgid "Short title" msgid "Short title"
msgstr "Titre court" msgstr "Titre court"
#: agenda_culturel/models.py:441 agenda_culturel/models.py:1643 #: agenda_culturel/models.py:441 agenda_culturel/models.py:1665
msgid "Status" msgid "Status"
msgstr "Status" msgstr "Status"
@ -389,7 +389,7 @@ msgstr "Heure de fin"
msgid "Recurrence" msgid "Recurrence"
msgstr "Récurrence" msgstr "Récurrence"
#: agenda_culturel/models.py:481 agenda_culturel/models.py:1562 #: agenda_culturel/models.py:481 agenda_culturel/models.py:1584
msgid "Location" msgid "Location"
msgstr "Localisation" msgstr "Localisation"
@ -481,139 +481,139 @@ msgstr "Événement"
msgid "Events" msgid "Events"
msgstr "Événements" msgstr "Événements"
#: agenda_culturel/models.py:1433 #: agenda_culturel/models.py:1455
msgid "Contact message" msgid "Contact message"
msgstr "Message de contact" msgstr "Message de contact"
#: agenda_culturel/models.py:1434 #: agenda_culturel/models.py:1456
msgid "Contact messages" msgid "Contact messages"
msgstr "Messages de contact" msgstr "Messages de contact"
#: agenda_culturel/models.py:1437 #: agenda_culturel/models.py:1459
msgid "Subject" msgid "Subject"
msgstr "Sujet" msgstr "Sujet"
#: agenda_culturel/models.py:1438 #: agenda_culturel/models.py:1460
msgid "The subject of your message" msgid "The subject of your message"
msgstr "Sujet de votre message" msgstr "Sujet de votre message"
#: agenda_culturel/models.py:1443 #: agenda_culturel/models.py:1465
msgid "Your name" msgid "Your name"
msgstr "Votre nom" msgstr "Votre nom"
#: agenda_culturel/models.py:1449 #: agenda_culturel/models.py:1471
msgid "Email address" msgid "Email address"
msgstr "Adresse email" msgstr "Adresse email"
#: agenda_culturel/models.py:1450 #: agenda_culturel/models.py:1472
msgid "Your email address" msgid "Your email address"
msgstr "Votre adresse email" msgstr "Votre adresse email"
#: agenda_culturel/models.py:1455 #: agenda_culturel/models.py:1477
msgid "Message" msgid "Message"
msgstr "Message" msgstr "Message"
#: agenda_culturel/models.py:1455 #: agenda_culturel/models.py:1477
msgid "Your message" msgid "Your message"
msgstr "Votre message" msgstr "Votre message"
#: agenda_culturel/models.py:1460 agenda_culturel/views.py:981 #: agenda_culturel/models.py:1482 agenda_culturel/views.py:1005
msgid "Spam" msgid "Spam"
msgstr "Spam" msgstr "Spam"
#: agenda_culturel/models.py:1461 #: agenda_culturel/models.py:1483
msgid "This message is a spam." msgid "This message is a spam."
msgstr "Ce message est un spam." msgstr "Ce message est un spam."
#: agenda_culturel/models.py:1466 agenda_culturel/views.py:976 #: agenda_culturel/models.py:1488 agenda_culturel/views.py:1000
msgid "Closed" msgid "Closed"
msgstr "Fermé" msgstr "Fermé"
#: agenda_culturel/models.py:1468 #: agenda_culturel/models.py:1490
msgid "this message has been processed and no longer needs to be handled" 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" msgstr "Ce message a été traité et ne nécessite plus d'être pris en charge"
#: agenda_culturel/models.py:1473 #: agenda_culturel/models.py:1495
msgid "Comments" msgid "Comments"
msgstr "Commentaires" msgstr "Commentaires"
#: agenda_culturel/models.py:1474 #: agenda_culturel/models.py:1496
msgid "Comments on the message from the moderation team" msgid "Comments on the message from the moderation team"
msgstr "Commentaires sur ce message par l'équipe de modération" msgstr "Commentaires sur ce message par l'équipe de modération"
#: agenda_culturel/models.py:1486 agenda_culturel/models.py:1623 #: agenda_culturel/models.py:1508 agenda_culturel/models.py:1645
msgid "Recurrent import" msgid "Recurrent import"
msgstr "Import récurrent" msgstr "Import récurrent"
#: agenda_culturel/models.py:1487 #: agenda_culturel/models.py:1509
msgid "Recurrent imports" msgid "Recurrent imports"
msgstr "Imports récurrents" msgstr "Imports récurrents"
#: agenda_culturel/models.py:1491 #: agenda_culturel/models.py:1513
msgid "ical" msgid "ical"
msgstr "ical" msgstr "ical"
#: agenda_culturel/models.py:1492 #: agenda_culturel/models.py:1514
msgid "ical no busy" msgid "ical no busy"
msgstr "ical sans busy" msgstr "ical sans busy"
#: agenda_culturel/models.py:1493 #: agenda_culturel/models.py:1515
msgid "ical no VC" msgid "ical no VC"
msgstr "ical sans VC" msgstr "ical sans VC"
#: agenda_culturel/models.py:1494 #: agenda_culturel/models.py:1516
msgid "lacoope.org" msgid "lacoope.org"
msgstr "lacoope.org" msgstr "lacoope.org"
#: agenda_culturel/models.py:1495 #: agenda_culturel/models.py:1517
msgid "la comédie" msgid "la comédie"
msgstr "la comédie" msgstr "la comédie"
#: agenda_culturel/models.py:1496 #: agenda_culturel/models.py:1518
msgid "le fotomat" msgid "le fotomat"
msgstr "le fotomat" msgstr "le fotomat"
#: agenda_culturel/models.py:1497 #: agenda_culturel/models.py:1519
msgid "la puce à l'oreille" msgid "la puce à l'oreille"
msgstr "la puce à loreille" msgstr "la puce à loreille"
#: agenda_culturel/models.py:1498 #: agenda_culturel/models.py:1520
msgid "Plugin wordpress MEC" msgid "Plugin wordpress MEC"
msgstr "Plugin wordpress MEC" msgstr "Plugin wordpress MEC"
#: agenda_culturel/models.py:1499 #: agenda_culturel/models.py:1521
msgid "Événements d'une page FB" msgid "Événements d'une page FB"
msgstr "Événements d'une page FB" msgstr "Événements d'une page FB"
#: agenda_culturel/models.py:1500 #: agenda_culturel/models.py:1522
msgid "la cour des 3 coquins" msgid "la cour des 3 coquins"
msgstr "la cour des 3 coquins" msgstr "la cour des 3 coquins"
#: agenda_culturel/models.py:1501 #: agenda_culturel/models.py:1523
msgid "Arachnée concert" msgid "Arachnée concert"
msgstr "Arachnée concert" msgstr "Arachnée concert"
#: agenda_culturel/models.py:1504 #: agenda_culturel/models.py:1526
msgid "simple" msgid "simple"
msgstr "simple" msgstr "simple"
#: agenda_culturel/models.py:1505 #: agenda_culturel/models.py:1527
msgid "Headless Chromium" msgid "Headless Chromium"
msgstr "chromium sans interface" msgstr "chromium sans interface"
#: agenda_culturel/models.py:1506 #: agenda_culturel/models.py:1528
msgid "Headless Chromium (pause)" msgid "Headless Chromium (pause)"
msgstr "chromium sans interface (pause)" msgstr "chromium sans interface (pause)"
#: agenda_culturel/models.py:1511 #: agenda_culturel/models.py:1533
msgid "daily" msgid "daily"
msgstr "chaque jour" msgstr "chaque jour"
#: agenda_culturel/models.py:1513 #: agenda_culturel/models.py:1535
msgid "weekly" msgid "weekly"
msgstr "chaque semaine" msgstr "chaque semaine"
#: agenda_culturel/models.py:1518 #: agenda_culturel/models.py:1540
msgid "" msgid ""
"Recurrent import name. Be careful to choose a name that is easy to " "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." "understand, as it will be public and displayed on the sites About page."
@ -621,135 +621,135 @@ msgstr ""
"Nom de l'import récurrent. Attention à choisir un nom compréhensible, car il " "Nom de l'import récurrent. Attention à choisir un nom compréhensible, car il "
"sera public, et affiché sur la page à propos du site." "sera public, et affiché sur la page à propos du site."
#: agenda_culturel/models.py:1525 #: agenda_culturel/models.py:1547
msgid "Processor" msgid "Processor"
msgstr "Processeur" msgstr "Processeur"
#: agenda_culturel/models.py:1528 #: agenda_culturel/models.py:1550
msgid "Downloader" msgid "Downloader"
msgstr "Téléchargeur" msgstr "Téléchargeur"
#: agenda_culturel/models.py:1535 #: agenda_culturel/models.py:1557
msgid "Import recurrence" msgid "Import recurrence"
msgstr "Récurrence d'import" msgstr "Récurrence d'import"
#: agenda_culturel/models.py:1542 #: agenda_culturel/models.py:1564
msgid "Source" msgid "Source"
msgstr "Source" msgstr "Source"
#: agenda_culturel/models.py:1543 #: agenda_culturel/models.py:1565
msgid "URL of the source document" msgid "URL of the source document"
msgstr "URL du document source" msgstr "URL du document source"
#: agenda_culturel/models.py:1547 #: agenda_culturel/models.py:1569
msgid "Browsable url" msgid "Browsable url"
msgstr "URL navigable" msgstr "URL navigable"
#: agenda_culturel/models.py:1549 #: agenda_culturel/models.py:1571
msgid "URL of the corresponding document that will be shown to visitors." msgid "URL of the corresponding document that will be shown to visitors."
msgstr "URL correspondant au document et qui sera montrée aux visiteurs" msgstr "URL correspondant au document et qui sera montrée aux visiteurs"
#: agenda_culturel/models.py:1558 #: agenda_culturel/models.py:1580
msgid "Status of each imported event (published or draft)" msgid "Status of each imported event (published or draft)"
msgstr "Status de chaque événement importé (publié ou brouillon)" msgstr "Status de chaque événement importé (publié ou brouillon)"
#: agenda_culturel/models.py:1563 #: agenda_culturel/models.py:1585
msgid "Address for each imported event" msgid "Address for each imported event"
msgstr "Adresse de chaque événement importé" msgstr "Adresse de chaque événement importé"
#: agenda_culturel/models.py:1571 #: agenda_culturel/models.py:1593
msgid "Category of each imported event" msgid "Category of each imported event"
msgstr "Catégorie de chaque événement importé" msgstr "Catégorie de chaque événement importé"
#: agenda_culturel/models.py:1579 #: agenda_culturel/models.py:1601
msgid "Tags for each imported event" msgid "Tags for each imported event"
msgstr "Étiquettes de chaque événement importé" msgstr "Étiquettes de chaque événement importé"
#: agenda_culturel/models.py:1580 #: agenda_culturel/models.py:1602
msgid "A list of tags that describe each imported event." msgid "A list of tags that describe each imported event."
msgstr "Une liste d'étiquettes décrivant chaque événement importé" msgstr "Une liste d'étiquettes décrivant chaque événement importé"
#: agenda_culturel/models.py:1609 #: agenda_culturel/models.py:1631
msgid "Running" msgid "Running"
msgstr "En cours" msgstr "En cours"
#: agenda_culturel/models.py:1610 #: agenda_culturel/models.py:1632
msgid "Canceled" msgid "Canceled"
msgstr "Annulé" msgstr "Annulé"
#: agenda_culturel/models.py:1611 #: agenda_culturel/models.py:1633
msgid "Success" msgid "Success"
msgstr "Succès" msgstr "Succès"
#: agenda_culturel/models.py:1612 #: agenda_culturel/models.py:1634
msgid "Failed" msgid "Failed"
msgstr "Erreur" msgstr "Erreur"
#: agenda_culturel/models.py:1615 #: agenda_culturel/models.py:1637
msgid "Batch importation" msgid "Batch importation"
msgstr "Importation par lot" msgstr "Importation par lot"
#: agenda_culturel/models.py:1616 #: agenda_culturel/models.py:1638
msgid "Batch importations" msgid "Batch importations"
msgstr "Importations par lot" msgstr "Importations par lot"
#: agenda_culturel/models.py:1624 #: agenda_culturel/models.py:1646
msgid "Reference to the recurrent import processing" msgid "Reference to the recurrent import processing"
msgstr "Référence du processus d'import récurrent" msgstr "Référence du processus d'import récurrent"
#: agenda_culturel/models.py:1632 #: agenda_culturel/models.py:1654
msgid "URL (if not recurrent import)" msgid "URL (if not recurrent import)"
msgstr "URL (si pas d'import récurrent)" msgstr "URL (si pas d'import récurrent)"
#: agenda_culturel/models.py:1634 #: agenda_culturel/models.py:1656
msgid "Source URL if no RecurrentImport is associated." msgid "Source URL if no RecurrentImport is associated."
msgstr "URL source si aucun import récurrent n'est associé" msgstr "URL source si aucun import récurrent n'est associé"
#: agenda_culturel/models.py:1647 #: agenda_culturel/models.py:1669
msgid "Error message" msgid "Error message"
msgstr "Votre message" msgstr "Votre message"
#: agenda_culturel/models.py:1651 #: agenda_culturel/models.py:1673
msgid "Number of collected events" msgid "Number of collected events"
msgstr "Nombre d'événements collectés" msgstr "Nombre d'événements collectés"
#: agenda_culturel/models.py:1654 #: agenda_culturel/models.py:1676
msgid "Number of imported events" msgid "Number of imported events"
msgstr "Nombre d'événements importés" msgstr "Nombre d'événements importés"
#: agenda_culturel/models.py:1657 #: agenda_culturel/models.py:1679
msgid "Number of updated events" msgid "Number of updated events"
msgstr "Nombre d'événements mis à jour" msgstr "Nombre d'événements mis à jour"
#: agenda_culturel/models.py:1660 #: agenda_culturel/models.py:1682
msgid "Number of removed events" msgid "Number of removed events"
msgstr "Nombre d'événements supprimés" msgstr "Nombre d'événements supprimés"
#: agenda_culturel/models.py:1668 #: agenda_culturel/models.py:1690
msgid "Weight" msgid "Weight"
msgstr "Poids" msgstr "Poids"
#: agenda_culturel/models.py:1669 #: agenda_culturel/models.py:1691
msgid "The lower is the weight, the earlier the filter is applied" 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" msgstr "Plus le poids est léger, plus le filtre sera appliqué tôt"
#: agenda_culturel/models.py:1676 #: agenda_culturel/models.py:1698
msgid "Category applied to the event" msgid "Category applied to the event"
msgstr "Catégorie appliquée à l'événement" msgstr "Catégorie appliquée à l'événement"
#: agenda_culturel/models.py:1681 #: agenda_culturel/models.py:1703
msgid "Contained in the title" msgid "Contained in the title"
msgstr "Contenu dans le titre" msgstr "Contenu dans le titre"
#: agenda_culturel/models.py:1682 #: agenda_culturel/models.py:1704
msgid "Text contained in the event title" msgid "Text contained in the event title"
msgstr "Texte contenu dans le titre de l'événement" msgstr "Texte contenu dans le titre de l'événement"
#: agenda_culturel/models.py:1688 #: agenda_culturel/models.py:1710
msgid "Exact title extract" msgid "Exact title extract"
msgstr "Extrait exact du titre" msgstr "Extrait exact du titre"
#: agenda_culturel/models.py:1690 #: agenda_culturel/models.py:1712
msgid "" msgid ""
"If checked, the extract will be searched for in the title using the exact " "If checked, the extract will be searched for in the title using the exact "
"form (capitals, accents)." "form (capitals, accents)."
@ -757,19 +757,19 @@ msgstr ""
"Si coché, l'extrait sera recherché dans le titre en utilisant la forme " "Si coché, l'extrait sera recherché dans le titre en utilisant la forme "
"exacte (majuscules, accents)" "exacte (majuscules, accents)"
#: agenda_culturel/models.py:1696 #: agenda_culturel/models.py:1718
msgid "Contained in the description" msgid "Contained in the description"
msgstr "Contenu dans la description" msgstr "Contenu dans la description"
#: agenda_culturel/models.py:1697 #: agenda_culturel/models.py:1719
msgid "Text contained in the description" msgid "Text contained in the description"
msgstr "Texte contenu dans la description" msgstr "Texte contenu dans la description"
#: agenda_culturel/models.py:1703 #: agenda_culturel/models.py:1725
msgid "Exact description extract" msgid "Exact description extract"
msgstr "Extrait exact de description" msgstr "Extrait exact de description"
#: agenda_culturel/models.py:1705 #: agenda_culturel/models.py:1727
msgid "" msgid ""
"If checked, the extract will be searched for in the description using the " "If checked, the extract will be searched for in the description using the "
"exact form (capitals, accents)." "exact form (capitals, accents)."
@ -777,19 +777,19 @@ msgstr ""
"Si coché, l'extrait sera recherché dans la description en utilisant la forme " "Si coché, l'extrait sera recherché dans la description en utilisant la forme "
"exacte (majuscules, accents)" "exacte (majuscules, accents)"
#: agenda_culturel/models.py:1711 #: agenda_culturel/models.py:1733
msgid "Contained in the location" msgid "Contained in the location"
msgstr "Contenu dans la localisation" msgstr "Contenu dans la localisation"
#: agenda_culturel/models.py:1712 #: agenda_culturel/models.py:1734
msgid "Text contained in the event location" msgid "Text contained in the event location"
msgstr "Texte contenu dans la localisation de l'événement" msgstr "Texte contenu dans la localisation de l'événement"
#: agenda_culturel/models.py:1718 #: agenda_culturel/models.py:1740
msgid "Exact location extract" msgid "Exact location extract"
msgstr "Extrait exact de localisation" msgstr "Extrait exact de localisation"
#: agenda_culturel/models.py:1720 #: agenda_culturel/models.py:1742
msgid "" msgid ""
"If checked, the extract will be searched for in the location using the exact " "If checked, the extract will be searched for in the location using the exact "
"form (capitals, accents)." "form (capitals, accents)."
@ -797,56 +797,56 @@ msgstr ""
"Si coché, l'extrait sera recherché dans la localisation en utilisant la " "Si coché, l'extrait sera recherché dans la localisation en utilisant la "
"forme exacte (majuscules, accents)" "forme exacte (majuscules, accents)"
#: agenda_culturel/models.py:1728 #: agenda_culturel/models.py:1750
msgid "Location from place" msgid "Location from place"
msgstr "Localisation depuis le lieu" msgstr "Localisation depuis le lieu"
#: agenda_culturel/models.py:1737 #: agenda_culturel/models.py:1759
msgid "Categorisation rule" msgid "Categorisation rule"
msgstr "Règle de catégorisation" msgstr "Règle de catégorisation"
#: agenda_culturel/models.py:1738 #: agenda_culturel/models.py:1760
msgid "Categorisation rules" msgid "Categorisation rules"
msgstr "Règles de catégorisation" msgstr "Règles de catégorisation"
#: agenda_culturel/models.py:1809 agenda_culturel/models.py:1841 #: agenda_culturel/models.py:1831 agenda_culturel/models.py:1863
msgid "Question" msgid "Question"
msgstr "Question" msgstr "Question"
#: agenda_culturel/models.py:1810 agenda_culturel/models.py:1848 #: agenda_culturel/models.py:1832 agenda_culturel/models.py:1870
msgid "Text that will be shown to moderators" msgid "Text that will be shown to moderators"
msgstr "Text tel que présenté aux modérateurices" msgstr "Text tel que présenté aux modérateurices"
#: agenda_culturel/models.py:1816 #: agenda_culturel/models.py:1838
msgid "Moderation question" msgid "Moderation question"
msgstr "Question de modération" msgstr "Question de modération"
#: agenda_culturel/models.py:1817 #: agenda_culturel/models.py:1839
msgid "Moderation questions" msgid "Moderation questions"
msgstr "Questions de modération" msgstr "Questions de modération"
#: agenda_culturel/models.py:1842 #: agenda_culturel/models.py:1864
msgid "Associated question from moderation" msgid "Associated question from moderation"
msgstr "Question associée pour la modération" msgstr "Question associée pour la modération"
#: agenda_culturel/models.py:1847 #: agenda_culturel/models.py:1869
msgid "Answer" msgid "Answer"
msgstr "Réponse" msgstr "Réponse"
#: agenda_culturel/models.py:1854 #: agenda_culturel/models.py:1876
msgid "Adds tags" msgid "Adds tags"
msgstr "Ajoute les étiquettes" msgstr "Ajoute les étiquettes"
#: agenda_culturel/models.py:1855 #: agenda_culturel/models.py:1877
msgid "A list of tags that will be added if you choose this answer." msgid "A list of tags that will be added if you choose this answer."
msgstr "" msgstr ""
"Une liste d'étiquettes qui seront ajoutées si vous choisissez cette réponse." "Une liste d'étiquettes qui seront ajoutées si vous choisissez cette réponse."
#: agenda_culturel/models.py:1861 #: agenda_culturel/models.py:1883
msgid "Removes tags" msgid "Removes tags"
msgstr "Retire les étiquettes" msgstr "Retire les étiquettes"
#: agenda_culturel/models.py:1862 #: agenda_culturel/models.py:1884
msgid "A list of tags that will be removed if you choose this answer." msgid "A list of tags that will be removed if you choose this answer."
msgstr "" msgstr ""
"Une liste d'étiquettes qui seront retirées si vous choisissez cette réponse." "Une liste d'étiquettes qui seront retirées si vous choisissez cette réponse."
@ -875,11 +875,11 @@ msgstr "Naviguer..."
msgid "No file selected." msgid "No file selected."
msgstr "Pas de fichier sélectionné." msgstr "Pas de fichier sélectionné."
#: agenda_culturel/views.py:541 #: agenda_culturel/views.py:545
msgid "The static content has been successfully updated." msgid "The static content has been successfully updated."
msgstr "Le contenu statique a été modifié avec succès." msgstr "Le contenu statique a été modifié avec succès."
#: agenda_culturel/views.py:549 #: agenda_culturel/views.py:553
msgid "" msgid ""
"The event cannot be updated because the import process is not available for " "The event cannot be updated because the import process is not available for "
"the referenced sources." "the referenced sources."
@ -887,29 +887,29 @@ msgstr ""
"La mise à jour de l'événement n'est pas possible car le processus d'import " "La mise à jour de l'événement n'est pas possible car le processus d'import "
"n'est pas disponible pour les sources référencées." "n'est pas disponible pour les sources référencées."
#: agenda_culturel/views.py:552 #: agenda_culturel/views.py:556
msgid "The event update has been queued and will be completed shortly." msgid "The event update has been queued and will be completed shortly."
msgstr "" msgstr ""
"La mise à jour de l'événement a été mise en attente et sera effectuée sous " "La mise à jour de l'événement a été mise en attente et sera effectuée sous "
"peu." "peu."
#: agenda_culturel/views.py:562 agenda_culturel/views.py:635 #: agenda_culturel/views.py:566 agenda_culturel/views.py:640
msgid "The event has been successfully modified." msgid "The event has been successfully modified."
msgstr "L'événement a été modifié avec succès." msgstr "L'événement a été modifié avec succès."
#: agenda_culturel/views.py:604 #: agenda_culturel/views.py:609
msgid "The event has been successfully deleted." msgid "The event has been successfully deleted."
msgstr "L'événement a été supprimé avec succès" msgstr "L'événement a été supprimé avec succès"
#: agenda_culturel/views.py:660 #: agenda_culturel/views.py:665
msgid "The status has been successfully modified." msgid "The status has been successfully modified."
msgstr "Le status a été modifié avec succès." msgstr "Le status a été modifié avec succès."
#: agenda_culturel/views.py:696 #: agenda_culturel/views.py:701
msgid "The event was created: <a href=\"{}\">{}</a>." msgid "The event was created: <a href=\"{}\">{}</a>."
msgstr "L'événement a été créé: <a href=\"{}\">{}</a>." msgstr "L'événement a été créé: <a href=\"{}\">{}</a>."
#: agenda_culturel/views.py:698 agenda_culturel/views.py:712 #: agenda_culturel/views.py:703 agenda_culturel/views.py:717
msgid "" msgid ""
"The event has been submitted and will be published as soon as it has been " "The event has been submitted and will be published as soon as it has been "
"validated by the moderation team." "validated by the moderation team."
@ -917,94 +917,110 @@ msgstr ""
"L'événement a été soumis et sera publié dès qu'il aura été validé par " "L'événement a été soumis et sera publié dès qu'il aura été validé par "
"l'équipe de modération." "l'équipe de modération."
#: agenda_culturel/views.py:706 #: agenda_culturel/views.py:711
msgid "The event is saved." msgid "The event is saved."
msgstr "L'événement est enregistré." msgstr "L'événement est enregistré."
#: agenda_culturel/views.py:798 agenda_culturel/views.py:850 #: agenda_culturel/views.py:803 agenda_culturel/views.py:855
msgid "{} has not been submitted since its already known: {}." msgid "{} has not been submitted since its already known: {}."
msgstr "{} n'a pas été soumis car il est déjà connu: {}." msgstr "{} n'a pas été soumis car il est déjà connu: {}."
#: agenda_culturel/views.py:803 agenda_culturel/views.py:856 #: agenda_culturel/views.py:808 agenda_culturel/views.py:861
msgid "" msgid ""
"{} has not been submitted since its already known and currently into " "{} has not been submitted since its already known and currently into "
"moderation process." "moderation process."
msgstr "{} n'a pas été soumis car il est déjà connu et en cours de modération" msgstr "{} n'a pas été soumis car il est déjà connu et en cours de modération"
#: agenda_culturel/views.py:813 #: agenda_culturel/views.py:818
msgid "Integrating {} url(s) into our import process." msgid "Integrating {} url(s) into our import process."
msgstr "Intégration de {} url(s) dans notre processus d'import." msgstr "Intégration de {} url(s) dans notre processus d'import."
#: agenda_culturel/views.py:863 #: agenda_culturel/views.py:868
msgid "Integrating {} into our import process." msgid "Integrating {} into our import process."
msgstr "Intégration de {} dans notre processus d'import." msgstr "Intégration de {} dans notre processus d'import."
#: agenda_culturel/views.py:936 #: agenda_culturel/views.py:921
msgid "Representative version"
msgstr "Version représentative"
#: agenda_culturel/views.py:922
msgid "Yes"
msgstr "Oui"
#: agenda_culturel/views.py:922
msgid "Non"
msgstr "Non"
#: agenda_culturel/views.py:927
msgid "Imported from"
msgstr "Importé depuis"
#: agenda_culturel/views.py:960
msgid "Your message has been sent successfully." msgid "Your message has been sent successfully."
msgstr "Votre message a été envoyé avec succès." msgstr "Votre message a été envoyé avec succès."
#: agenda_culturel/views.py:946 #: agenda_culturel/views.py:970
msgid "The contact message has been successfully deleted." msgid "The contact message has been successfully deleted."
msgstr "Le message de contact a été supprimé avec succès." msgstr "Le message de contact a été supprimé avec succès."
#: agenda_culturel/views.py:960 #: agenda_culturel/views.py:984
msgid "The contact message properties has been successfully modified." msgid "The contact message properties has been successfully modified."
msgstr "Les propriétés du message de contact ont été modifié avec succès." msgstr "Les propriétés du message de contact ont été modifié avec succès."
#: agenda_culturel/views.py:976 #: agenda_culturel/views.py:1000
msgid "Open" msgid "Open"
msgstr "Ouvert" msgstr "Ouvert"
#: agenda_culturel/views.py:981 #: agenda_culturel/views.py:1005
msgid "Non spam" msgid "Non spam"
msgstr "Non spam" msgstr "Non spam"
#: agenda_culturel/views.py:1044 #: agenda_culturel/views.py:1131
msgid "Spam has been successfully deleted." msgid "Spam has been successfully deleted."
msgstr "Le spam a été supprimé avec succès" msgstr "Le spam a été supprimé avec succès"
#: agenda_culturel/views.py:1061 #: agenda_culturel/views.py:1148
msgid "Search" msgid "Search"
msgstr "Rechercher" msgstr "Rechercher"
#: agenda_culturel/views.py:1247 #: agenda_culturel/views.py:1340
msgid "The import has been run successfully." msgid "The import has been run successfully."
msgstr "L'import a été lancé avec succès" msgstr "L'import a été lancé avec succès"
#: agenda_culturel/views.py:1266 #: agenda_culturel/views.py:1359
msgid "The import has been canceled." msgid "The import has been canceled."
msgstr "L'import a été annulé" msgstr "L'import a été annulé"
#: agenda_culturel/views.py:1340 #: agenda_culturel/views.py:1433
msgid "The recurrent import has been successfully modified." msgid "The recurrent import has been successfully modified."
msgstr "L'import récurrent a été modifié avec succès." msgstr "L'import récurrent a été modifié avec succès."
#: agenda_culturel/views.py:1349 #: agenda_culturel/views.py:1442
msgid "The recurrent import has been successfully deleted." msgid "The recurrent import has been successfully deleted."
msgstr "L'import récurrent a été supprimé avec succès" msgstr "L'import récurrent a été supprimé avec succès"
#: agenda_culturel/views.py:1389 #: agenda_culturel/views.py:1482
msgid "The import has been launched." msgid "The import has been launched."
msgstr "L'import a été lancé" msgstr "L'import a été lancé"
#: agenda_culturel/views.py:1411 #: agenda_culturel/views.py:1504
msgid "Imports has been launched." msgid "Imports has been launched."
msgstr "Les imports ont été lancés" msgstr "Les imports ont été lancés"
#: agenda_culturel/views.py:1482 #: agenda_culturel/views.py:1575
msgid "Update successfully completed." msgid "Update successfully completed."
msgstr "Mise à jour réalisée avec succès." msgstr "Mise à jour réalisée avec succès."
#: agenda_culturel/views.py:1540 #: agenda_culturel/views.py:1633
msgid "Creation of a merged event has been successfully completed." msgid "Creation of a merged event has been successfully completed."
msgstr "Création d'un événement fusionné réalisée avec succès." msgstr "Création d'un événement fusionné réalisée avec succès."
#: agenda_culturel/views.py:1576 #: agenda_culturel/views.py:1669
msgid "Events have been marked as unduplicated." msgid "Events have been marked as unduplicated."
msgstr "Les événements ont été marqués comme non dupliqués." msgstr "Les événements ont été marqués comme non dupliqués."
#: agenda_culturel/views.py:1590 agenda_culturel/views.py:1599 #: agenda_culturel/views.py:1683 agenda_culturel/views.py:1692
#: agenda_culturel/views.py:1617 #: agenda_culturel/views.py:1710
msgid "" msgid ""
"The selected item is no longer included in the list of duplicates. Someone " "The selected item is no longer included in the list of duplicates. Someone "
"else has probably modified the list in the meantime." "else has probably modified the list in the meantime."
@ -1012,23 +1028,23 @@ msgstr ""
"L'élément sélectionné ne fait plus partie de la liste des dupliqués. Une " "L'élément sélectionné ne fait plus partie de la liste des dupliqués. Une "
"autre personne a probablement modifié la liste entre temps." "autre personne a probablement modifié la liste entre temps."
#: agenda_culturel/views.py:1593 #: agenda_culturel/views.py:1686
msgid "The selected event has been set as representative" msgid "The selected event has been set as representative"
msgstr "L'événement sélectionné a été défini comme representatif." msgstr "L'événement sélectionné a été défini comme representatif."
#: agenda_culturel/views.py:1608 #: agenda_culturel/views.py:1701
msgid "The event has been withdrawn from the group and made independent." msgid "The event has been withdrawn from the group and made independent."
msgstr "L'événement a été retiré du groupe et rendu indépendant." msgstr "L'événement a été retiré du groupe et rendu indépendant."
#: agenda_culturel/views.py:1652 #: agenda_culturel/views.py:1745
msgid "Cleaning up duplicates: {} item(s) fixed." msgid "Cleaning up duplicates: {} item(s) fixed."
msgstr "Nettoyage des dupliqués: {} élément(s) corrigé(s)." msgstr "Nettoyage des dupliqués: {} élément(s) corrigé(s)."
#: agenda_culturel/views.py:1701 #: agenda_culturel/views.py:1794
msgid "The event was successfully duplicated." msgid "The event was successfully duplicated."
msgstr "L'événement a été marqué dupliqué avec succès." msgstr "L'événement a été marqué dupliqué avec succès."
#: agenda_culturel/views.py:1709 #: agenda_culturel/views.py:1802
msgid "" msgid ""
"The event has been successfully flagged as a duplicate. The moderation team " "The event has been successfully flagged as a duplicate. The moderation team "
"will deal with your suggestion shortly." "will deal with your suggestion shortly."
@ -1036,32 +1052,32 @@ msgstr ""
"L'événement a été signalé comme dupliqué avec succès. Votre suggestion sera " "L'événement a été signalé comme dupliqué avec succès. Votre suggestion sera "
"prochainement prise en charge par l'équipe de modération." "prochainement prise en charge par l'équipe de modération."
#: agenda_culturel/views.py:1762 #: agenda_culturel/views.py:1855
msgid "The categorisation rule has been successfully modified." msgid "The categorisation rule has been successfully modified."
msgstr "La règle de catégorisation a été modifiée avec succès." msgstr "La règle de catégorisation a été modifiée avec succès."
#: agenda_culturel/views.py:1771 #: agenda_culturel/views.py:1864
msgid "The categorisation rule has been successfully deleted." msgid "The categorisation rule has been successfully deleted."
msgstr "La règle de catégorisation a été supprimée avec succès" msgstr "La règle de catégorisation a été supprimée avec succès"
#: agenda_culturel/views.py:1793 #: agenda_culturel/views.py:1886
msgid "The rules were successfully applied and 1 event was categorised." msgid "The rules were successfully applied and 1 event was categorised."
msgstr "" msgstr ""
"Les règles ont été appliquées avec succès et 1 événement a été catégorisé" "Les règles ont été appliquées avec succès et 1 événement a été catégorisé"
#: agenda_culturel/views.py:1800 #: agenda_culturel/views.py:1893
msgid "The rules were successfully applied and {} events were categorised." msgid "The rules were successfully applied and {} events were categorised."
msgstr "" msgstr ""
"Les règles ont été appliquées avec succès et {} événements ont été " "Les règles ont été appliquées avec succès et {} événements ont été "
"catégorisés" "catégorisés"
#: agenda_culturel/views.py:1807 agenda_culturel/views.py:1860 #: agenda_culturel/views.py:1900 agenda_culturel/views.py:1953
msgid "The rules were successfully applied and no events were categorised." msgid "The rules were successfully applied and no events were categorised."
msgstr "" msgstr ""
"Les règles ont été appliquées avec succès et aucun événement n'a été " "Les règles ont été appliquées avec succès et aucun événement n'a été "
"catégorisé" "catégorisé"
#: agenda_culturel/views.py:1846 #: agenda_culturel/views.py:1939
msgid "" msgid ""
"The rules were successfully applied and 1 event with default category was " "The rules were successfully applied and 1 event with default category was "
"categorised." "categorised."
@ -1069,7 +1085,7 @@ msgstr ""
"Les règles ont été appliquées avec succès et 1 événement avec catégorie par " "Les règles ont été appliquées avec succès et 1 événement avec catégorie par "
"défaut a été catégorisé" "défaut a été catégorisé"
#: agenda_culturel/views.py:1853 #: agenda_culturel/views.py:1946
msgid "" msgid ""
"The rules were successfully applied and {} events with default category were " "The rules were successfully applied and {} events with default category were "
"categorised." "categorised."
@ -1077,46 +1093,46 @@ msgstr ""
"Les règles ont été appliquées avec succès et {} événements avec catégorie " "Les règles ont été appliquées avec succès et {} événements avec catégorie "
"par défaut ont été catégorisés" "par défaut ont été catégorisés"
#: agenda_culturel/views.py:1900 #: agenda_culturel/views.py:1993
msgid "The moderation question has been created with success." msgid "The moderation question has been created with success."
msgstr "La question de modération a été créée avec succès." msgstr "La question de modération a été créée avec succès."
#: agenda_culturel/views.py:2026 agenda_culturel/views.py:2088 #: agenda_culturel/views.py:2122 agenda_culturel/views.py:2184
#: agenda_culturel/views.py:2126 #: agenda_culturel/views.py:2222
msgid "{} events have been updated." msgid "{} events have been updated."
msgstr "{} événements ont été mis à jour." msgstr "{} événements ont été mis à jour."
#: agenda_culturel/views.py:2029 agenda_culturel/views.py:2090 #: agenda_culturel/views.py:2125 agenda_culturel/views.py:2186
#: agenda_culturel/views.py:2129 #: agenda_culturel/views.py:2225
msgid "1 event has been updated." msgid "1 event has been updated."
msgstr "1 événement a été mis à jour" msgstr "1 événement a été mis à jour"
#: agenda_culturel/views.py:2031 agenda_culturel/views.py:2092 #: agenda_culturel/views.py:2127 agenda_culturel/views.py:2188
#: agenda_culturel/views.py:2131 #: agenda_culturel/views.py:2227
msgid "No events have been modified." msgid "No events have been modified."
msgstr "Aucun événement n'a été modifié." msgstr "Aucun événement n'a été modifié."
#: agenda_culturel/views.py:2040 #: agenda_culturel/views.py:2136
msgid "The place has been successfully updated." msgid "The place has been successfully updated."
msgstr "Le lieu a été modifié avec succès." msgstr "Le lieu a été modifié avec succès."
#: agenda_culturel/views.py:2049 #: agenda_culturel/views.py:2145
msgid "The place has been successfully created." msgid "The place has been successfully created."
msgstr "Le lieu a été créé avec succès." msgstr "Le lieu a été créé avec succès."
#: agenda_culturel/views.py:2114 #: agenda_culturel/views.py:2210
msgid "The selected place has been assigned to the event." msgid "The selected place has been assigned to the event."
msgstr "Le lieu sélectionné a été assigné à l'événement." msgstr "Le lieu sélectionné a été assigné à l'événement."
#: agenda_culturel/views.py:2118 #: agenda_culturel/views.py:2214
msgid "A new alias has been added to the selected place." msgid "A new alias has been added to the selected place."
msgstr "Un nouvel alias a été créé pour le lieu sélectionné." msgstr "Un nouvel alias a été créé pour le lieu sélectionné."
#: agenda_culturel/views.py:2174 #: agenda_culturel/views.py:2270
msgid "The tag has been successfully updated." msgid "The tag has been successfully updated."
msgstr "L'étiquette a été modifiée avec succès." msgstr "L'étiquette a été modifiée avec succès."
#: agenda_culturel/views.py:2181 #: agenda_culturel/views.py:2277
msgid "The tag has been successfully created." msgid "The tag has been successfully created."
msgstr "L'étiquette a été créée avec succès." msgstr "L'étiquette a été créée avec succès."

View File

@ -0,0 +1,52 @@
{% extends "agenda_culturel/page-admin.html" %}
{% load utils_extra %}
{% block title %}{% block og_title %}Administration{% endblock %}{% endblock %}
{% load cat_extra %}
{% block entete_header %}
{% css_categories %}
{% endblock %}
{% block sidemenu-bouton %}
<li><a href="#contenu-principal" aria-label="Aller au contenu">{% picto_from_name "chevron-up" %}</a></li>
<li><a href="#sidebar" aria-label="Aller au menu latéral">{% picto_from_name "chevron-down" %}</a></li>
{% endblock %}
{% block content %}
<div class="grid two-columns">
<div id="contenu-principal">
<article>
<header>
<div class="slide-buttons">
<a href="{% url 'activite' %}" role="button">Voir l'historique {% picto_from_name "chevron-right" %}</a>
</div>
<h2>Activité des derniers jours</h2>
</header>
{% include "agenda_culturel/recent-activity-inc.html" with modifications=daily_modifications %}
<p>Détail des imports récurrents&nbsp;:
{% include "agenda_culturel/rimports-info-inc.html" with all=1 %}</p>
</article>
<article>
<header>
<div class="slide-buttons">
<a href="{% url 'moderation' %}" role="button">Voir tout {% picto_from_name "chevron-right" %}</a>
</div>
<h2>Derniers événements soumis</h2>
</header>
{% for e in events %}
<article>{% include "agenda_culturel/single-event/event-in-flat-list-inc.html" with event=e %}</article>
{% endfor %}
</article>
</div>
{% include "agenda_culturel/side-nav.html" with current="administration" %}
</div>
{% endblock %}

View File

@ -31,16 +31,6 @@
<div style="clear: both"></div> <div style="clear: both"></div>
{% endif %} {% endif %}
{% if daily_modifications %}
<article>
<div class="slide-buttons">
<a href="{% url 'activite' %}" role="button">Voir l'historique {% picto_from_name "chevron-right" %}</a>
</div>
<h2>Activité des derniers jours</h2>
{% include "agenda_culturel/recent-activity-inc.html" with modifications=daily_modifications %}
</article>
{% endif %}
{% include 'agenda_culturel/paginator_filter.html' %} {% include 'agenda_culturel/paginator_filter.html' %}
</header> </header>

View File

@ -37,7 +37,7 @@
<div id="boutons-fixes"> <div id="boutons-fixes">
<ul> <ul>
{% block sidemenu-bouton %}{% endblock %} {% block sidemenu-bouton %}{% endblock %}
{% if user.is_authenticated %}{% block configurer-bouton %}<li class="configurer-bouton"><a href="{% url 'moderation' %}" aria-label="Administrer">{% picto_from_name "settings" %}</a></li>{% endblock %}{% endif %} {% if user.is_authenticated %}{% block configurer-bouton %}<li class="configurer-bouton"><a href="{% url 'administration' %}" aria-label="Administrer">{% picto_from_name "settings" %}</a></li>{% endblock %}{% endif %}
{% block ajouter-bouton %}<li class="ajouter-bouton"><a href="{% url 'add_event' %}" aria-label="Ajouter un événement">{% picto_from_name "plus" %}</a></li>{% endblock %} {% block ajouter-bouton %}<li class="ajouter-bouton"><a href="{% url 'add_event' %}" aria-label="Ajouter un événement">{% picto_from_name "plus" %}</a></li>{% endblock %}
{% block rechercher-bouton %}<li class="rechercher-bouton"><a href="{% url 'event_search' %}" aria-label="Rechercher">{% picto_from_name "search" %}</a></li>{% endblock %} {% block rechercher-bouton %}<li class="rechercher-bouton"><a href="{% url 'event_search' %}" aria-label="Rechercher">{% picto_from_name "search" %}</a></li>{% endblock %}
</ul> </ul>
@ -47,7 +47,7 @@
<input class="menu-btn" type="checkbox" id="menu-btn" /> <input class="menu-btn" type="checkbox" id="menu-btn" />
<label class="menu-icon" for="menu-btn">{% picto_from_name "menu" %}</label> <label class="menu-icon" for="menu-btn">{% picto_from_name "menu" %}</label>
<ul class="menu"> <ul class="menu">
{% if user.is_authenticated %}{% block configurer-menu %}<li id="menu-configurer" class="configurer-bouton"><a href="{% url 'moderation' %}">Administrer {% picto_from_name "settings" %}</a></li>{% endblock %}{% endif %} {% if user.is_authenticated %}{% block configurer-menu %}<li id="menu-configurer" class="configurer-bouton"><a href="{% url 'administration' %}">Administrer {% picto_from_name "settings" %}</a></li>{% endblock %}{% endif %}
{% block ajouter-menu %}<li id="menu-ajouter" class="ajouter-bouton"><a href="{% url 'add_event' %}">Ajouter un événement {% picto_from_name "plus-circle" %}</a></li>{% endblock %} {% block ajouter-menu %}<li id="menu-ajouter" class="ajouter-bouton"><a href="{% url 'add_event' %}">Ajouter un événement {% picto_from_name "plus-circle" %}</a></li>{% endblock %}
{% block rechercher-menu %}<li id="menu-rechercher" class="rechercher-bouton"><a href="{% url 'event_search' %}">Rechercher {% picto_from_name "search" %}</a></li>{% endblock %} {% block rechercher-menu %}<li id="menu-rechercher" class="rechercher-bouton"><a href="{% url 'event_search' %}">Rechercher {% picto_from_name "search" %}</a></li>{% endblock %}
<li><a href="{% url 'a_venir' %}{% block a_venir_parameters %}{% endblock %}">À venir</a></li> <li><a href="{% url 'a_venir' %}{% block a_venir_parameters %}{% endblock %}">À venir</a></li>
@ -120,10 +120,10 @@
</div> </div>
<div> <div>
{% if user.is_authenticated %} {% if user.is_authenticated %}
<a href="{% url 'moderation' %}">{% picto_from_name "settings" %} administrer</a> <a href="{% url 'administration' %}">{% picto_from_name "settings" %} administrer</a>
<p>Vous êtes connecté(e) en tant que {{ user }}</p> <p>Vous êtes connecté(e) en tant que {{ user }}</p>
{% else %} {% else %}
<a href="{% url 'login' %}?next={% url 'moderation' %}">{% picto_from_name "log-in" %} administrer</a> <a href="{% url 'login' %}?next={% url 'administration' %}">{% picto_from_name "log-in" %} administrer</a>
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@ -0,0 +1,26 @@
{% if status or all == 1 %}
<a href="{% url 'recurrent_imports' %}">tous&nbsp;: {{ nb_all }}</a>
{% else %}
<strong>tous&nbsp;: {{ nb_all }}</strong>
{% endif %}
{% if nb_failed > 0 or all == 1 %}—
{% if not status or status != "failed" %}
<a href="{% url 'recurrent_imports_status' 'failed' %}">échoués&nbsp;: {{ nb_failed }}</a>
{% else %}
<strong>échoués&nbsp;: {{ nb_failed }}</strong>
{% endif %}
{% endif %}
{% if nb_canceled > 0 or all == 1 %}—
{% if not status or status != "canceled" %}
<a href="{% url 'recurrent_imports_status' 'canceled' %}">annulés&nbsp;: {{ nb_canceled }}</a>
{% else %}
<strong>annulés&nbsp;: {{ nb_canceled }}</strong>
{% endif %}
{% endif %}
{% if nb_running > 0 or all == 1 %}—
{% if not status or status != "running" %}
<a href="{% url 'recurrent_imports_status' 'running' %}">en cours&nbsp;: {{ nb_running }}</a>
{% else %}
<strong>en cours&nbsp;: {{ nb_running }}</strong>
{% endif %}
{% endif %}

View File

@ -31,32 +31,7 @@
<a href="{% url 'add_rimport'%}" role="button">Ajouter {% picto_from_name "plus-circle" %}</a> <a href="{% url 'add_rimport'%}" role="button">Ajouter {% picto_from_name "plus-circle" %}</a>
</div> </div>
<h1>Importations récurrentes {% if status %}<em>{{ status }}</em>{% endif %}</h1> <h1>Importations récurrentes {% if status %}<em>{{ status }}</em>{% endif %}</h1>
{% if status %} {% include "agenda_culturel/rimports-info-inc.html" with all=0 %}
<a href="{% url 'recurrent_imports' %}">tous&nbsp;: {{ nb_all }}</a>
{% else %}
<strong>tous&nbsp;: {{ nb_all }}</strong>
{% endif %}
{% if nb_failed > 0 %}—
{% if not status or status != "failed" %}
<a href="{% url 'recurrent_imports_status' 'failed' %}">échoués&nbsp;: {{ nb_failed }}</a>
{% else %}
<strong>échoués&nbsp;: {{ nb_failed }}</strong>
{% endif %}
{% endif %}
{% if nb_canceled > 0 %}—
{% if not status or status != "canceled" %}
<a href="{% url 'recurrent_imports_status' 'canceled' %}">annulés&nbsp;: {{ nb_canceled }}</a>
{% else %}
<strong>annulés&nbsp;: {{ nb_canceled }}</strong>
{% endif %}
{% endif %}
{% if nb_running > 0 %}—
{% if not status or status != "running" %}
<a href="{% url 'recurrent_imports_status' 'running' %}">en cours&nbsp;: {{ nb_running }}</a>
{% else %}
<strong>en cours&nbsp;: {{ nb_running }}</strong>
{% endif %}
{% endif %}
</header> </header>
<table role="grid"> <table role="grid">

View File

@ -6,6 +6,11 @@
<header> <header>
<h2>Administrer</h2> <h2>Administrer</h2>
</header> </header>
<nav>
<ul>
<li><a {% if current == "administration" %}class="selected" {% endif %}href="{% url 'administration' %}">Administration</a></li>
</ul>
</nav>
<h3>Événements</h3> <h3>Événements</h3>
<nav> <nav>
<ul> <ul>

View File

@ -29,6 +29,7 @@
<h4> <h4>
{{ event|picto_status }} {{ event|picto_status }}
<a href="{{ event.get_absolute_url }}">{{ event.title }}</a> <a href="{{ event.get_absolute_url }}">{{ event.title }}</a>
{{ event|picto_visibility:user.is_authenticated }}
</h4> </h4>
{% if event.location or event.exact_location %} {% if event.location or event.exact_location %}
{% if not no_location %} {% if not no_location %}

View File

@ -3,10 +3,11 @@
{% load tag_extra %} {% load tag_extra %}
{% load event_extra %} {% load event_extra %}
<header>{{ event.category | small_cat_recurrent:event.has_recurrences }} <header><h3>{{ event.category | small_cat_recurrent:event.has_recurrences }}
{{ event|picto_status }} {{ event|picto_status }} <a href="{{ event.get_absolute_url }}">
<a href="{{ event.get_absolute_url }}"> {% if event.title_hl %}{{ event.title_hl | safe }}{% else %}{{ event.title }}{% endif %}</a>
{% if event.title_hl %}{{ event.title_hl | safe }}{% else %}{{ event.title }}{% endif %}</a></p> {{ event|picto_visibility:user.is_authenticated }}
</h3>
<p class="subentry-search">{% picto_from_name "calendar" %} <p class="subentry-search">{% picto_from_name "calendar" %}
{% if event.end_day and event.end_day != event.start_day %}du{% else %}le{% endif %} {% if event.end_day and event.end_day != event.start_day %}du{% else %}le{% endif %}
{% include "agenda_culturel/date-times-inc.html" with event=event %} {% include "agenda_culturel/date-times-inc.html" with event=event %}

View File

@ -1,84 +0,0 @@
{% load static %}
{% load cat_extra %}
{% load utils_extra %}
{% load event_extra %}
{% load tag_extra %}
<article id="event-{{ event.pk}}">
{% if indexlink %}<a role="button" class="secondary slide-buttons" href="#index-day" data-tooltip="Retour au résumé">{% picto_from_name "arrow-up" %}</a>{% endif %}
{% if event|can_show_start_time:day %}
{% if event.start_time %}
<article class='ephemeris-hour'>
<span class="large">{{ event.start_time }}</span>
</article>
{% endif %}
{% endif %}
{% if event|can_show_end_time:day %}
{% if event.end_time %}
<article class='ephemeris-hour'>
jusqu'à <span class="large">{{ event.end_time }}</span>
</article>
{% endif %}
{% endif %}
{{ event.category | small_cat_recurrent:event.has_recurrences }}
{% if event.location or event.exact_location %}<hgroup>{% endif %}
<h3>
{{ event|picto_status }}
<a href="{{ event.get_absolute_url }}">{{ event.title }}</a>
</h3>
{% if event.location or event.exact_location %}
<h4>
{% picto_from_name "map-pin" %}
{% include "agenda_culturel/event-location-inc.html" with event=event %}
</h4>
</hgroup>
{% endif %}
{% if event|need_complete_display:True %}<p>
{% picto_from_name "calendar" %}
<em>{% if event.end_day and event.end_day != event.start_day %}Cet événement dure du {% else %}Cet événement a lieu le{% endif %}
{% include "agenda_culturel/date-times-inc.html" with event=event %}
</em></p>
{% endif %}
{% if event.image or event.local_image %}
<article class='illustration'>
<img src="{% if event.local_image %}{{ event.local_image.url }}{% else %}{{ event.image }}{% endif %}" alt="{{ event.image_alt }}" />
</article>
{% endif %}
<p>{{ event.description |linebreaks }}</p>
<footer class="infos-and-buttons">
<div class="infos">
<p>
{% for tag in event.tags %}
<a href="{% url 'view_tag' tag|prepare_tag %}" role="button" class="small-cat">{{ tag }}</a>
{% endfor %}
</p>
{% include "agenda_culturel/event-sources-inc.html" %}
{% if event.has_recurrences %}
<p class="footer">
{% picto_from_name "repeat" %}
<!-- TODO: see https://forge.chapril.org/jmtrivial/agenda_culturel/issues/65 -->
{% for r in event.recurrences.rrules %}
{{ r.to_text }}{% if not forloop.first %}, {% endif %}{% endfor %}, depuis le {{ event.recurrences.dtstart.date }}
</p>
{% endif %}
</div>
{% if perms.agenda_culturel.change_event %}
<div class="buttons">
{% include "agenda_culturel/edit-buttons-inc.html" with event=event %}
<a href="{{ event.get_absolute_url }}" role="button">Voir l'événement <svg width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<use href="{% static 'images/feather-sprite.svg' %}#chevron-right" />
</svg></a>
</div>
{% endif %}
</footer>
</article>

View File

@ -1,62 +0,0 @@
{% load static %}
{% load cat_extra %}
{% load utils_extra %}
{% load event_extra %}
{% load tag_extra %}
<article>
{% include "agenda_culturel/ephemeris-inc.html" with event=event filter=filter with_year=with_year %}
{{ event.category | small_cat_recurrent:event.has_recurrences }}
{% if event.location or event.exact_location %}<hgroup>{% endif %}
<h2>
{{ event|picto_status }}
<a href="{{ event.get_absolute_url }}">{{ event.title }}</a>
</h2>
{% if event.location or event.exact_location %}
<h3>
{% picto_from_name "map-pin" %}
{% include "agenda_culturel/event-location-inc.html" with event=event %}
</h3>
</hgroup>
{% endif %}
{% if event|need_complete_display:False %}<p>
{% picto_from_name "calendar" %}
<em>{% if event.end_day and event.end_day != event.start_day %}Cet événement dure du {% else %}Cet événement a lieu le{% endif %}
{% include "agenda_culturel/date-times-inc.html" with event=event %}
</em></p>
{% endif %}
{% if event.image or event.local_image %}
<article class='illustration'>
<img src="{% if event.local_image %}{{ event.local_image.url }}{% else %}{{ event.image }}{% endif %}" alt="{{ event.image_alt }}" />
</article>
{% endif %}
<p>{{ event.description |truncatewords:20 |linebreaks }}</p>
<footer class="infos-and-buttons">
<div class="infos">
<p>
{% for tag in event.tags %}
<a href="{% url 'view_tag' tag|prepare_tag %}" role="button" class="small-cat">{{ tag }}</a>
{% endfor %}
</p>
{% include "agenda_culturel/event-sources-inc.html" %}
</div>
{% if perms.agenda_culturel.change_event %}
<div class="buttons">
{% include "agenda_culturel/edit-buttons-inc.html" with event=event %}
<a href="{{ event.get_absolute_url }}" role="button">Voir l'événement <svg width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<use href="{% static 'images/feather-sprite.svg' %}#chevron-right" />
</svg></a>
</div>
{% endif %}
</footer>
</article>

View File

@ -11,10 +11,12 @@
</div> </div>
{{ event.category | small_cat_recurrent:event.has_recurrences }} <h3>{{ event.category | small_cat_recurrent:event.has_recurrences }}
{{ event|picto_status }} {{ event|picto_status }}
<a href="{{ event.get_absolute_url }}"> <a href="{{ event.get_absolute_url }}">
{{ event.title }}</a></p> {{ event.title }}</a>
{{ event|picto_visibility:user.is_authenticated }}</h3>
{% picto_from_name "map-pin" %} {% picto_from_name "map-pin" %}
{% include "agenda_culturel/event-location-inc.html" with event=event %} {% include "agenda_culturel/event-location-inc.html" with event=event %}
<p>{% picto_from_name "calendar" %} <p>{% picto_from_name "calendar" %}

View File

@ -11,7 +11,7 @@
class="close" class="close"
data-target="event-{{ event.id }}" data-target="event-{{ event.id }}"
onClick="toggleModal(event)"></a> onClick="toggleModal(event)"></a>
<h3>{{ event.category|small_cat_recurrent:event.has_recurrences }} {{ event|picto_status }} {{ event.title }}</h3> <h3>{{ event.category|small_cat_recurrent:event.has_recurrences }} {{ event|picto_status }} {{ event.title }} {{ event|picto_visibility:user.is_authenticated }}</h3>
<p> <p>
{% picto_from_name "map-pin" %} {% picto_from_name "map-pin" %}

View File

@ -8,7 +8,7 @@
<header> <header>
{% include "agenda_culturel/ephemeris-inc.html" with event=event filter=filter %} {% include "agenda_culturel/ephemeris-inc.html" with event=event filter=filter %}
{{ event.category | small_cat_recurrent:event.has_recurrences }} {{ event.category | small_cat_recurrent:event.has_recurrences }}
<h1>{{ event|picto_status }} {{ event.title }}</h1> <h1>{{ event|picto_status }} {{ event.title }} {{ event|picto_visibility:user.is_authenticated }}</h1>
<p> <p>
{% picto_from_name "calendar" %} {% picto_from_name "calendar" %}
{% if event.end_day and event.end_day != event.start_day %}du{% else %}le{% endif %} {% if event.end_day and event.end_day != event.start_day %}du{% else %}le{% endif %}

View File

@ -52,6 +52,17 @@ def picto_status(event):
else: else:
return "" return ""
@register.filter
def picto_visibility(event, visible=True):
if not visible:
return ""
if event.is_representative():
return picto_from_name("award", "version mise en avant")
elif event.masked():
return picto_from_name("archive", "version non mise en avant")
else:
return ""
@register.simple_tag @register.simple_tag
def show_badges_events(placement="top"): def show_badges_events(placement="top"):

View File

@ -24,6 +24,7 @@ urlpatterns = [
path("tag/<int:pk>/delete", TagDeleteView.as_view(), name="delete_tag"), path("tag/<int:pk>/delete", TagDeleteView.as_view(), name="delete_tag"),
path("tags/add", TagCreateView.as_view(), name="add_tag"), path("tags/add", TagCreateView.as_view(), name="add_tag"),
path("moderation/", moderation, name="moderation"), path("moderation/", moderation, name="moderation"),
path("administration/", administration, name="administration"),
path("activite/", activite, name="activite"), 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>",

View File

@ -917,8 +917,14 @@ class EventFilterAdmin(django_filters.FilterSet):
choices=Event.STATUS.choices, widget=forms.CheckboxSelectMultiple choices=Event.STATUS.choices, widget=forms.CheckboxSelectMultiple
) )
representative = django_filters.MultipleChoiceFilter(
label=_("Representative version"),
choices=[(True, _("Yes")), (False, _("Non"))],
method="filter_by_representative",
widget=forms.CheckboxSelectMultiple)
import_sources = django_filters.ModelChoiceFilter( import_sources = django_filters.ModelChoiceFilter(
label="Importé depuis", label=_("Imported from"),
method="filter_by_source", method="filter_by_source",
queryset=RecurrentImport.objects.all().order_by("name__unaccent") queryset=RecurrentImport.objects.all().order_by("name__unaccent")
) )
@ -927,6 +933,19 @@ class EventFilterAdmin(django_filters.FilterSet):
src = RecurrentImport.objects.get(pk=value.pk).source src = RecurrentImport.objects.get(pk=value.pk).source
return queryset.filter(import_sources__contains=[src]) return queryset.filter(import_sources__contains=[src])
def filter_by_representative(self, queryset, name, value):
if value is None or len(value) != 1:
return queryset
else:
q = (Q(other_versions__isnull=True) |
Q(other_versions__representative=F('pk')) |
Q(other_versions__representative__isnull=True))
if value[0] == True:
return queryset.filter(q)
else:
return queryset.exclude(q)
class Meta: class Meta:
model = Event model = Event
fields = ["status"] fields = ["status"]
@ -1014,6 +1033,45 @@ def activite(request):
{"daily_modifications": daily_modifications, "weekly_modifications": weekly_modifications }, {"daily_modifications": daily_modifications, "weekly_modifications": weekly_modifications },
) )
@login_required(login_url="/accounts/login/")
@permission_required("agenda_culturel.view_event")
def administration(request):
# get information about recent modifications
days = [date.today()]
for i in range(0, 2):
days.append(days[-1] + timedelta(days=-1))
daily_modifications = Event.get_count_modifications([(d, 1) for d in days])
# get last created events
events = queryset=Event.objects.all().order_by("-created_date")[:10]
# get info about batch information
newest = BatchImportation.objects.filter(recurrentImport=OuterRef("pk")).order_by(
"-created_date"
)
imported_events = RecurrentImport.objects.annotate(
last_run_status=Subquery(newest.values("status")[:1])
)
nb_failed = (imported_events
.filter(last_run_status=BatchImportation.STATUS.FAILED)
.count())
nb_canceled = (imported_events
.filter(last_run_status=BatchImportation.STATUS.CANCELED)
.count())
nb_running = (imported_events
.filter(last_run_status=BatchImportation.STATUS.RUNNING)
.count())
nb_all = imported_events.count()
return render(
request,
"agenda_culturel/administration.html",
{"daily_modifications": daily_modifications, "events": events, "nb_failed": nb_failed, "nb_canceled": nb_canceled,
"nb_running": nb_running, "nb_all": nb_all},
)
@login_required(login_url="/accounts/login/") @login_required(login_url="/accounts/login/")
@permission_required("agenda_culturel.view_event") @permission_required("agenda_culturel.view_event")
@ -1024,12 +1082,7 @@ def moderation(request):
paginator = PaginatorFilter(filter, 10, request) paginator = PaginatorFilter(filter, 10, request)
page = request.GET.get("page") page = request.GET.get("page")
daily_modifications = []
if not page or page == 1:
days = [date.today()]
for i in range(0, 2):
days.append(days[-1] + timedelta(days=-1))
daily_modifications = Event.get_count_modifications([(d, 1) for d in days])
try: try:
response = paginator.page(page) response = paginator.page(page)
except PageNotAnInteger: except PageNotAnInteger:
@ -1040,7 +1093,7 @@ def moderation(request):
return render( return render(
request, request,
"agenda_culturel/moderation.html", "agenda_culturel/moderation.html",
{"filter": filter, "paginator_filter": response, "daily_modifications": daily_modifications}, {"filter": filter, "paginator_filter": response},
) )
@ -1194,21 +1247,27 @@ def event_search(request, full=False):
tags = None tags = None
places = None places = None
qs = get_event_qs(request).order_by("-start_day")
if not request.user.is_authenticated:
qs = qs.filter((Q(other_versions__isnull=True) |
Q(other_versions__representative=F('pk')) |
Q(other_versions__representative__isnull=True)))
if full: if full:
filter = SearchEventFilter( filter = SearchEventFilter(
request.GET, request.GET,
queryset=get_event_qs(request).order_by("-start_day"), queryset=qs,
request=request, request=request,
) )
else: else:
filter = SimpleSearchEventFilter( filter = SimpleSearchEventFilter(
request.GET, request.GET,
queryset=get_event_qs(request).order_by("-start_day"), queryset=qs,
request=request, request=request,
) )
if 'q' in request.GET: if 'q' in request.GET:
categories = Category.objects.filter(name__icontains=request.GET['q']) categories = Category.objects.filter(name__icontains=request.GET['q'])
tags = [item for row in Event.objects.extra(where=['%s ILIKE ANY (tags)'], params=[request.GET['q']]).values_list('tags', flat=True).distinct() for item in row] tags = list(set([item for row in Event.objects.extra(where=['%s ILIKE ANY (tags)'], params=[request.GET['q']]).values_list('tags', flat=True).distinct() for item in row]))
tags.sort(key=lambda x: remove_accents(x).lower())
places = Place.objects.filter(Q(name__icontains=request.GET['q'])) places = Place.objects.filter(Q(name__icontains=request.GET['q']))
paginator = PaginatorFilter(filter, 10, request) paginator = PaginatorFilter(filter, 10, request)