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

@ -2,13 +2,13 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jean-Marie Favreau <jeanmarie.favreau@free.fr>, 2023.
#
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: agenda_culturel\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"
"Last-Translator: 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/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"
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."
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."
msgstr "JSON dans le format attendu pour l'import"
#: agenda_culturel/forms.py:188
#: agenda_culturel/forms.py:190
msgid " (locally modified version)"
msgstr " (version modifiée localement)"
#: agenda_culturel/forms.py:191
#: agenda_culturel/forms.py:193
msgid " (synchronized on import version)"
msgstr " (version synchronisée sur l'import)"
#: agenda_culturel/forms.py:195
#: agenda_culturel/forms.py:197
msgid "Select {} as representative version."
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)."
msgstr ""
"Mettre à jour {} en utilisant quelques champs des autres versions (mode "
"interactif)."
#: agenda_culturel/forms.py:211
#: agenda_culturel/forms.py:213
msgid " Warning: a version is already locally modified."
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)."
msgstr "Créer une nouvelle version par fusion (mode interactif)."
#: agenda_culturel/forms.py:223
#: agenda_culturel/forms.py:225
msgid "Make {} independent."
msgstr "Rendre {} indépendant."
#: agenda_culturel/forms.py:225
#: agenda_culturel/forms.py:227
msgid "Make all versions independent."
msgstr "Rendre toutes les versions indépendantes."
#: agenda_culturel/forms.py:281
#: agenda_culturel/forms.py:283
msgid "Value of the selected version"
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 {}"
msgstr "Valeur de la version {}"
#: agenda_culturel/forms.py:474
#: agenda_culturel/forms.py:476
msgid "Apply category {} to the event {}"
msgstr "Appliquer la catégorie {} à l'événement {}"
#: agenda_culturel/forms.py:489 agenda_culturel/models.py:370
#: agenda_culturel/models.py:1727
#: agenda_culturel/forms.py:491 agenda_culturel/models.py:370
#: agenda_culturel/models.py:1749
msgid "Place"
msgstr "Lieu"
#: agenda_culturel/forms.py:491
#: agenda_culturel/forms.py:493
msgid "Create a missing place"
msgstr "Créer un lieu manquant"
#: agenda_culturel/forms.py:501
#: agenda_culturel/forms.py:503
msgid "Add \"{}\" to the aliases of the place"
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"
msgstr ""
"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:172 agenda_culturel/models.py:332
#: agenda_culturel/models.py:349 agenda_culturel/models.py:1442
#: agenda_culturel/models.py:1516
#: agenda_culturel/models.py:349 agenda_culturel/models.py:1464
#: agenda_culturel/models.py:1538
msgid "Name"
msgstr "Nom"
@ -335,7 +335,7 @@ msgstr ""
msgid "Places"
msgstr "Lieux"
#: agenda_culturel/models.py:424 agenda_culturel/models.py:1557
#: agenda_culturel/models.py:424 agenda_culturel/models.py:1579
msgid "Published"
msgstr "Publié"
@ -355,7 +355,7 @@ msgstr "Titre"
msgid "Short title"
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"
msgstr "Status"
@ -389,7 +389,7 @@ msgstr "Heure de fin"
msgid "Recurrence"
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"
msgstr "Localisation"
@ -481,139 +481,139 @@ msgstr "Événement"
msgid "Events"
msgstr "Événements"
#: agenda_culturel/models.py:1433
#: agenda_culturel/models.py:1455
msgid "Contact message"
msgstr "Message de contact"
#: agenda_culturel/models.py:1434
#: agenda_culturel/models.py:1456
msgid "Contact messages"
msgstr "Messages de contact"
#: agenda_culturel/models.py:1437
#: agenda_culturel/models.py:1459
msgid "Subject"
msgstr "Sujet"
#: agenda_culturel/models.py:1438
#: agenda_culturel/models.py:1460
msgid "The subject of your message"
msgstr "Sujet de votre message"
#: agenda_culturel/models.py:1443
#: agenda_culturel/models.py:1465
msgid "Your name"
msgstr "Votre nom"
#: agenda_culturel/models.py:1449
#: agenda_culturel/models.py:1471
msgid "Email address"
msgstr "Adresse email"
#: agenda_culturel/models.py:1450
#: agenda_culturel/models.py:1472
msgid "Your email address"
msgstr "Votre adresse email"
#: agenda_culturel/models.py:1455
#: agenda_culturel/models.py:1477
msgid "Message"
msgstr "Message"
#: agenda_culturel/models.py:1455
#: agenda_culturel/models.py:1477
msgid "Your 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"
msgstr "Spam"
#: agenda_culturel/models.py:1461
#: agenda_culturel/models.py:1483
msgid "This message is a 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"
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"
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"
msgstr "Commentaires"
#: agenda_culturel/models.py:1474
#: agenda_culturel/models.py:1496
msgid "Comments on the message from the moderation team"
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"
msgstr "Import récurrent"
#: agenda_culturel/models.py:1487
#: agenda_culturel/models.py:1509
msgid "Recurrent imports"
msgstr "Imports récurrents"
#: agenda_culturel/models.py:1491
#: agenda_culturel/models.py:1513
msgid "ical"
msgstr "ical"
#: agenda_culturel/models.py:1492
#: agenda_culturel/models.py:1514
msgid "ical no busy"
msgstr "ical sans busy"
#: agenda_culturel/models.py:1493
#: agenda_culturel/models.py:1515
msgid "ical no VC"
msgstr "ical sans VC"
#: agenda_culturel/models.py:1494
#: agenda_culturel/models.py:1516
msgid "lacoope.org"
msgstr "lacoope.org"
#: agenda_culturel/models.py:1495
#: agenda_culturel/models.py:1517
msgid "la comédie"
msgstr "la comédie"
#: agenda_culturel/models.py:1496
#: agenda_culturel/models.py:1518
msgid "le fotomat"
msgstr "le fotomat"
#: agenda_culturel/models.py:1497
#: agenda_culturel/models.py:1519
msgid "la puce à l'oreille"
msgstr "la puce à loreille"
#: agenda_culturel/models.py:1498
#: agenda_culturel/models.py:1520
msgid "Plugin wordpress MEC"
msgstr "Plugin wordpress MEC"
#: agenda_culturel/models.py:1499
#: agenda_culturel/models.py:1521
msgid "É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"
msgstr "la cour des 3 coquins"
#: agenda_culturel/models.py:1501
#: agenda_culturel/models.py:1523
msgid "Arachnée concert"
msgstr "Arachnée concert"
#: agenda_culturel/models.py:1504
#: agenda_culturel/models.py:1526
msgid "simple"
msgstr "simple"
#: agenda_culturel/models.py:1505
#: agenda_culturel/models.py:1527
msgid "Headless Chromium"
msgstr "chromium sans interface"
#: agenda_culturel/models.py:1506
#: agenda_culturel/models.py:1528
msgid "Headless Chromium (pause)"
msgstr "chromium sans interface (pause)"
#: agenda_culturel/models.py:1511
#: agenda_culturel/models.py:1533
msgid "daily"
msgstr "chaque jour"
#: agenda_culturel/models.py:1513
#: agenda_culturel/models.py:1535
msgid "weekly"
msgstr "chaque semaine"
#: agenda_culturel/models.py:1518
#: agenda_culturel/models.py:1540
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."
@ -621,135 +621,135 @@ 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:1525
#: agenda_culturel/models.py:1547
msgid "Processor"
msgstr "Processeur"
#: agenda_culturel/models.py:1528
#: agenda_culturel/models.py:1550
msgid "Downloader"
msgstr "Téléchargeur"
#: agenda_culturel/models.py:1535
#: agenda_culturel/models.py:1557
msgid "Import recurrence"
msgstr "Récurrence d'import"
#: agenda_culturel/models.py:1542
#: agenda_culturel/models.py:1564
msgid "Source"
msgstr "Source"
#: agenda_culturel/models.py:1543
#: agenda_culturel/models.py:1565
msgid "URL of the source document"
msgstr "URL du document source"
#: agenda_culturel/models.py:1547
#: agenda_culturel/models.py:1569
msgid "Browsable url"
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."
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)"
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"
msgstr "Adresse de chaque événement importé"
#: agenda_culturel/models.py:1571
#: agenda_culturel/models.py:1593
msgid "Category of each imported event"
msgstr "Catégorie de chaque événement importé"
#: agenda_culturel/models.py:1579
#: agenda_culturel/models.py:1601
msgid "Tags for each imported event"
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."
msgstr "Une liste d'étiquettes décrivant chaque événement importé"
#: agenda_culturel/models.py:1609
#: agenda_culturel/models.py:1631
msgid "Running"
msgstr "En cours"
#: agenda_culturel/models.py:1610
#: agenda_culturel/models.py:1632
msgid "Canceled"
msgstr "Annulé"
#: agenda_culturel/models.py:1611
#: agenda_culturel/models.py:1633
msgid "Success"
msgstr "Succès"
#: agenda_culturel/models.py:1612
#: agenda_culturel/models.py:1634
msgid "Failed"
msgstr "Erreur"
#: agenda_culturel/models.py:1615
#: agenda_culturel/models.py:1637
msgid "Batch importation"
msgstr "Importation par lot"
#: agenda_culturel/models.py:1616
#: agenda_culturel/models.py:1638
msgid "Batch importations"
msgstr "Importations par lot"
#: agenda_culturel/models.py:1624
#: agenda_culturel/models.py:1646
msgid "Reference to the recurrent import processing"
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)"
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."
msgstr "URL source si aucun import récurrent n'est associé"
#: agenda_culturel/models.py:1647
#: agenda_culturel/models.py:1669
msgid "Error message"
msgstr "Votre message"
#: agenda_culturel/models.py:1651
#: agenda_culturel/models.py:1673
msgid "Number of collected events"
msgstr "Nombre d'événements collectés"
#: agenda_culturel/models.py:1654
#: agenda_culturel/models.py:1676
msgid "Number of imported events"
msgstr "Nombre d'événements importés"
#: agenda_culturel/models.py:1657
#: agenda_culturel/models.py:1679
msgid "Number of updated events"
msgstr "Nombre d'événements mis à jour"
#: agenda_culturel/models.py:1660
#: agenda_culturel/models.py:1682
msgid "Number of removed events"
msgstr "Nombre d'événements supprimés"
#: agenda_culturel/models.py:1668
#: agenda_culturel/models.py:1690
msgid "Weight"
msgstr "Poids"
#: agenda_culturel/models.py:1669
#: agenda_culturel/models.py:1691
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:1676
#: agenda_culturel/models.py:1698
msgid "Category applied to the event"
msgstr "Catégorie appliquée à l'événement"
#: agenda_culturel/models.py:1681
#: agenda_culturel/models.py:1703
msgid "Contained in the title"
msgstr "Contenu dans le titre"
#: agenda_culturel/models.py:1682
#: agenda_culturel/models.py:1704
msgid "Text contained in the event title"
msgstr "Texte contenu dans le titre de l'événement"
#: agenda_culturel/models.py:1688
#: agenda_culturel/models.py:1710
msgid "Exact title extract"
msgstr "Extrait exact du titre"
#: agenda_culturel/models.py:1690
#: agenda_culturel/models.py:1712
msgid ""
"If checked, the extract will be searched for in the title using the exact "
"form (capitals, accents)."
@ -757,19 +757,19 @@ msgstr ""
"Si coché, l'extrait sera recherché dans le titre en utilisant la forme "
"exacte (majuscules, accents)"
#: agenda_culturel/models.py:1696
#: agenda_culturel/models.py:1718
msgid "Contained in the description"
msgstr "Contenu dans la description"
#: agenda_culturel/models.py:1697
#: agenda_culturel/models.py:1719
msgid "Text contained in the description"
msgstr "Texte contenu dans la description"
#: agenda_culturel/models.py:1703
#: agenda_culturel/models.py:1725
msgid "Exact description extract"
msgstr "Extrait exact de description"
#: agenda_culturel/models.py:1705
#: agenda_culturel/models.py:1727
msgid ""
"If checked, the extract will be searched for in the description using the "
"exact form (capitals, accents)."
@ -777,19 +777,19 @@ msgstr ""
"Si coché, l'extrait sera recherché dans la description en utilisant la forme "
"exacte (majuscules, accents)"
#: agenda_culturel/models.py:1711
#: agenda_culturel/models.py:1733
msgid "Contained in the location"
msgstr "Contenu dans la localisation"
#: agenda_culturel/models.py:1712
#: agenda_culturel/models.py:1734
msgid "Text contained in the event location"
msgstr "Texte contenu dans la localisation de l'événement"
#: agenda_culturel/models.py:1718
#: agenda_culturel/models.py:1740
msgid "Exact location extract"
msgstr "Extrait exact de localisation"
#: agenda_culturel/models.py:1720
#: agenda_culturel/models.py:1742
msgid ""
"If checked, the extract will be searched for in the location using the exact "
"form (capitals, accents)."
@ -797,56 +797,56 @@ msgstr ""
"Si coché, l'extrait sera recherché dans la localisation en utilisant la "
"forme exacte (majuscules, accents)"
#: agenda_culturel/models.py:1728
#: agenda_culturel/models.py:1750
msgid "Location from place"
msgstr "Localisation depuis le lieu"
#: agenda_culturel/models.py:1737
#: agenda_culturel/models.py:1759
msgid "Categorisation rule"
msgstr "Règle de catégorisation"
#: agenda_culturel/models.py:1738
#: agenda_culturel/models.py:1760
msgid "Categorisation rules"
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"
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"
msgstr "Text tel que présenté aux modérateurices"
#: agenda_culturel/models.py:1816
#: agenda_culturel/models.py:1838
msgid "Moderation question"
msgstr "Question de modération"
#: agenda_culturel/models.py:1817
#: agenda_culturel/models.py:1839
msgid "Moderation questions"
msgstr "Questions de modération"
#: agenda_culturel/models.py:1842
#: agenda_culturel/models.py:1864
msgid "Associated question from moderation"
msgstr "Question associée pour la modération"
#: agenda_culturel/models.py:1847
#: agenda_culturel/models.py:1869
msgid "Answer"
msgstr "Réponse"
#: agenda_culturel/models.py:1854
#: agenda_culturel/models.py:1876
msgid "Adds tags"
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."
msgstr ""
"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"
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."
msgstr ""
"Une liste d'étiquettes qui seront retirées si vous choisissez cette réponse."
@ -875,11 +875,11 @@ msgstr "Naviguer..."
msgid "No file selected."
msgstr "Pas de fichier sélectionné."
#: agenda_culturel/views.py:541
#: agenda_culturel/views.py:545
msgid "The static content has been successfully updated."
msgstr "Le contenu statique a été modifié avec succès."
#: agenda_culturel/views.py:549
#: agenda_culturel/views.py:553
msgid ""
"The event cannot be updated because the import process is not available for "
"the referenced sources."
@ -887,29 +887,29 @@ msgstr ""
"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."
#: agenda_culturel/views.py:552
#: agenda_culturel/views.py:556
msgid "The event update has been queued and will be completed shortly."
msgstr ""
"La mise à jour de l'événement a été mise en attente et sera effectuée sous "
"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."
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."
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."
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>."
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 ""
"The event has been submitted and will be published as soon as it has been "
"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'équipe de modération."
#: agenda_culturel/views.py:706
#: agenda_culturel/views.py:711
msgid "The event is saved."
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: {}."
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 ""
"{} has not been submitted since its already known and currently into "
"moderation process."
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."
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."
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."
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."
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."
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"
msgstr "Ouvert"
#: agenda_culturel/views.py:981
#: agenda_culturel/views.py:1005
msgid "Non spam"
msgstr "Non spam"
#: agenda_culturel/views.py:1044
#: agenda_culturel/views.py:1131
msgid "Spam has been successfully deleted."
msgstr "Le spam a été supprimé avec succès"
#: agenda_culturel/views.py:1061
#: agenda_culturel/views.py:1148
msgid "Search"
msgstr "Rechercher"
#: agenda_culturel/views.py:1247
#: agenda_culturel/views.py:1340
msgid "The import has been run successfully."
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."
msgstr "L'import a été annulé"
#: agenda_culturel/views.py:1340
#: agenda_culturel/views.py:1433
msgid "The recurrent import has been successfully modified."
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."
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."
msgstr "L'import a été lancé"
#: agenda_culturel/views.py:1411
#: agenda_culturel/views.py:1504
msgid "Imports has been launched."
msgstr "Les imports ont été lancés"
#: agenda_culturel/views.py:1482
#: agenda_culturel/views.py:1575
msgid "Update successfully completed."
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."
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."
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:1617
#: agenda_culturel/views.py:1683 agenda_culturel/views.py:1692
#: agenda_culturel/views.py:1710
msgid ""
"The selected item is no longer included in the list of duplicates. Someone "
"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 "
"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"
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."
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."
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."
msgstr "L'événement a été marqué dupliqué avec succès."
#: agenda_culturel/views.py:1709
#: agenda_culturel/views.py:1802
msgid ""
"The event has been successfully flagged as a duplicate. The moderation team "
"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 "
"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."
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."
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."
msgstr ""
"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."
msgstr ""
"Les règles ont été appliquées avec succès et {} événements ont été "
"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."
msgstr ""
"Les règles ont été appliquées avec succès et aucun événement n'a été "
"catégorisé"
#: agenda_culturel/views.py:1846
#: agenda_culturel/views.py:1939
msgid ""
"The rules were successfully applied and 1 event with default category was "
"categorised."
@ -1069,7 +1085,7 @@ msgstr ""
"Les règles ont été appliquées avec succès et 1 événement avec catégorie par "
"défaut a été catégorisé"
#: agenda_culturel/views.py:1853
#: agenda_culturel/views.py:1946
msgid ""
"The rules were successfully applied and {} events with default category were "
"categorised."
@ -1077,46 +1093,46 @@ msgstr ""
"Les règles ont été appliquées avec succès et {} événements avec catégorie "
"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."
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:2126
#: agenda_culturel/views.py:2122 agenda_culturel/views.py:2184
#: agenda_culturel/views.py:2222
msgid "{} events have been updated."
msgstr "{} événements ont été mis à jour."
#: agenda_culturel/views.py:2029 agenda_culturel/views.py:2090
#: agenda_culturel/views.py:2129
#: agenda_culturel/views.py:2125 agenda_culturel/views.py:2186
#: agenda_culturel/views.py:2225
msgid "1 event has been updated."
msgstr "1 événement a été mis à jour"
#: agenda_culturel/views.py:2031 agenda_culturel/views.py:2092
#: agenda_culturel/views.py:2131
#: agenda_culturel/views.py:2127 agenda_culturel/views.py:2188
#: agenda_culturel/views.py:2227
msgid "No events have been modified."
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."
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."
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."
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."
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."
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."
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>
{% endif %}
{% if daily_modifications %}
<article>
<div class="slide-buttons">
<a href="{% url 'activite' %}" role="button">Voir l'historique {% picto_from_name "chevron-right" %}</a>
</div>
<h2>Activité des derniers jours</h2>
{% include "agenda_culturel/recent-activity-inc.html" with modifications=daily_modifications %}
</article>
{% endif %}
{% include 'agenda_culturel/paginator_filter.html' %}
</header>

View File

@ -37,7 +37,7 @@
<div id="boutons-fixes">
<ul>
{% 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 rechercher-bouton %}<li class="rechercher-bouton"><a href="{% url 'event_search' %}" aria-label="Rechercher">{% picto_from_name "search" %}</a></li>{% endblock %}
</ul>
@ -47,7 +47,7 @@
<input class="menu-btn" type="checkbox" id="menu-btn" />
<label class="menu-icon" for="menu-btn">{% picto_from_name "menu" %}</label>
<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 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>
@ -120,10 +120,10 @@
</div>
<div>
{% 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>
{% 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 %}
</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>
</div>
<h1>Importations récurrentes {% if status %}<em>{{ status }}</em>{% endif %}</h1>
{% if status %}
<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 %}
{% include "agenda_culturel/rimports-info-inc.html" with all=0 %}
</header>
<table role="grid">

View File

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

View File

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

View File

@ -3,10 +3,11 @@
{% load tag_extra %}
{% load event_extra %}
<header>{{ event.category | small_cat_recurrent:event.has_recurrences }}
{{ event|picto_status }}
<a href="{{ event.get_absolute_url }}">
{% if event.title_hl %}{{ event.title_hl | safe }}{% else %}{{ event.title }}{% endif %}</a></p>
<header><h3>{{ event.category | small_cat_recurrent:event.has_recurrences }}
{{ event|picto_status }} <a href="{{ event.get_absolute_url }}">
{% if event.title_hl %}{{ event.title_hl | safe }}{% else %}{{ event.title }}{% endif %}</a>
{{ event|picto_visibility:user.is_authenticated }}
</h3>
<p class="subentry-search">{% picto_from_name "calendar" %}
{% 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 %}

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>
{{ event.category | small_cat_recurrent:event.has_recurrences }}
<h3>{{ event.category | small_cat_recurrent:event.has_recurrences }}
{{ event|picto_status }}
<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" %}
{% include "agenda_culturel/event-location-inc.html" with event=event %}
<p>{% picto_from_name "calendar" %}

View File

@ -11,7 +11,7 @@
class="close"
data-target="event-{{ event.id }}"
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>
{% picto_from_name "map-pin" %}

View File

@ -8,7 +8,7 @@
<header>
{% include "agenda_culturel/ephemeris-inc.html" with event=event filter=filter %}
{{ 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>
{% picto_from_name "calendar" %}
{% 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:
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
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("tags/add", TagCreateView.as_view(), name="add_tag"),
path("moderation/", moderation, name="moderation"),
path("administration/", administration, name="administration"),
path("activite/", activite, name="activite"),
path(
"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
)
representative = django_filters.MultipleChoiceFilter(
label=_("Representative version"),
choices=[(True, _("Yes")), (False, _("Non"))],
method="filter_by_representative",
widget=forms.CheckboxSelectMultiple)
import_sources = django_filters.ModelChoiceFilter(
label="Importé depuis",
label=_("Imported from"),
method="filter_by_source",
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
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:
model = Event
fields = ["status"]
@ -1014,6 +1033,45 @@ def activite(request):
{"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/")
@permission_required("agenda_culturel.view_event")
@ -1024,12 +1082,7 @@ def moderation(request):
paginator = PaginatorFilter(filter, 10, request)
page = request.GET.get("page")
daily_modifications = []
if not page or page == 1:
days = [date.today()]
for i in range(0, 2):
days.append(days[-1] + timedelta(days=-1))
daily_modifications = Event.get_count_modifications([(d, 1) for d in days])
try:
response = paginator.page(page)
except PageNotAnInteger:
@ -1040,7 +1093,7 @@ def moderation(request):
return render(
request,
"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
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:
filter = SearchEventFilter(
request.GET,
queryset=get_event_qs(request).order_by("-start_day"),
queryset=qs,
request=request,
)
else:
filter = SimpleSearchEventFilter(
request.GET,
queryset=get_event_qs(request).order_by("-start_day"),
queryset=qs,
request=request,
)
if 'q' in request.GET:
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']))
paginator = PaginatorFilter(filter, 10, request)