diff --git a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po index 219934c..179caa3 100644 --- a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po +++ b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po @@ -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 , 2023. -# +# #, fuzzy msgid "" msgstr "" "Project-Id-Version: agenda_culturel\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-11 22:18+0100\n" +"POT-Creation-Date: 2024-11-13 23:18+0100\n" "PO-Revision-Date: 2023-10-29 14:16+0000\n" "Last-Translator: Jean-Marie Favreau \n" "Language-Team: Jean-Marie Favreau \n" @@ -17,243 +17,243 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: agenda_culturel/calendar.py:147 +#: agenda_culturel/calendar.py:151 msgid "All day today" msgstr "Aujourd'hui toute la journée" -#: agenda_culturel/calendar.py:148 +#: agenda_culturel/calendar.py:152 msgid "This morning" msgstr "Ce matin" -#: agenda_culturel/calendar.py:148 +#: agenda_culturel/calendar.py:152 msgid "This noon" msgstr "Ce midi" -#: agenda_culturel/calendar.py:148 +#: agenda_culturel/calendar.py:152 msgid "This afternoon" msgstr "Cet après-midi" -#: agenda_culturel/calendar.py:148 +#: agenda_culturel/calendar.py:152 msgid "This evening" msgstr "Ce soir" -#: agenda_culturel/calendar.py:150 +#: agenda_culturel/calendar.py:154 msgid "Tomorrow" msgstr "Demain" -#: agenda_culturel/calendar.py:151 +#: agenda_culturel/calendar.py:155 msgid "All day tomorrow" msgstr "Toute la journée de demain" -#: agenda_culturel/calendar.py:152 agenda_culturel/calendar.py:156 +#: agenda_culturel/calendar.py:156 agenda_culturel/calendar.py:160 #, python-format msgid "%s morning" msgstr "%s matin" -#: agenda_culturel/calendar.py:152 agenda_culturel/calendar.py:156 +#: agenda_culturel/calendar.py:156 agenda_culturel/calendar.py:160 #, python-format msgid "%s noon" msgstr "%s midi" -#: agenda_culturel/calendar.py:152 agenda_culturel/calendar.py:156 +#: agenda_culturel/calendar.py:156 agenda_culturel/calendar.py:160 #, python-format msgid "%s afternoon" msgstr "%s après-midi" -#: agenda_culturel/calendar.py:152 agenda_culturel/calendar.py:156 +#: agenda_culturel/calendar.py:156 agenda_culturel/calendar.py:160 #, python-format msgid "%s evening" msgstr "%s soir" -#: agenda_culturel/calendar.py:155 +#: agenda_culturel/calendar.py:159 #, python-format msgid "All day %s" msgstr "Toute la journée de %s" -#: agenda_culturel/calendar.py:157 +#: agenda_culturel/calendar.py:161 msgid "All day" msgstr "Toute la journée" -#: agenda_culturel/calendar.py:158 +#: agenda_culturel/calendar.py:162 msgid "Morning" msgstr "Matin" -#: agenda_culturel/calendar.py:158 +#: agenda_culturel/calendar.py:162 msgid "Noon" msgstr "Midi" -#: agenda_culturel/calendar.py:158 +#: agenda_culturel/calendar.py:162 msgid "Afternoon" msgstr "Après-midi" -#: agenda_culturel/calendar.py:158 +#: agenda_culturel/calendar.py:162 msgid "Evening" 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:1592 agenda_culturel/models.py:1697 +#: agenda_culturel/forms.py:45 agenda_culturel/models.py:166 +#: agenda_culturel/models.py:204 agenda_culturel/models.py:491 +#: agenda_culturel/models.py:1638 agenda_culturel/models.py:1743 msgid "Category" msgstr "Catégorie" -#: agenda_culturel/forms.py:50 +#: agenda_culturel/forms.py:48 msgid "Optional. If you dont specify a category, well find it for you." msgstr "" "Facultatif. Si tu ne donnes pas la catégorie, on s'occupe de la trouver." -#: agenda_culturel/forms.py:132 +#: agenda_culturel/forms.py:130 msgid "The end date must be after the start date." msgstr "La date de fin doit être après la date de début." -#: agenda_culturel/forms.py:148 +#: agenda_culturel/forms.py:146 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:170 +#: agenda_culturel/forms.py:168 msgid "JSON in the format expected for the import." msgstr "JSON dans le format attendu pour l'import" -#: agenda_culturel/forms.py:190 +#: agenda_culturel/forms.py:188 msgid " (locally modified version)" msgstr " (version modifiée localement)" -#: agenda_culturel/forms.py:193 +#: agenda_culturel/forms.py:192 msgid " (synchronized on import version)" msgstr " (version synchronisée sur l'import)" -#: agenda_culturel/forms.py:197 +#: agenda_culturel/forms.py:196 msgid "Select {} as representative version." msgstr "Sélectionner {} comme version représentative" -#: agenda_culturel/forms.py:206 +#: agenda_culturel/forms.py:205 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:213 +#: agenda_culturel/forms.py:212 msgid " Warning: a version is already locally modified." msgstr " Attention: une version a déjà été modifiée localement." -#: agenda_culturel/forms.py:218 +#: agenda_culturel/forms.py:217 msgid "Create a new version by merging (interactive mode)." msgstr "Créer une nouvelle version par fusion (mode interactif)." -#: agenda_culturel/forms.py:225 +#: agenda_culturel/forms.py:224 msgid "Make {} independent." msgstr "Rendre {} indépendant." -#: agenda_culturel/forms.py:227 +#: agenda_culturel/forms.py:226 msgid "Make all versions independent." msgstr "Rendre toutes les versions indépendantes." -#: agenda_culturel/forms.py:283 +#: agenda_culturel/forms.py:282 msgid "Value of the selected version" msgstr "Valeur de la version sélectionnée" -#: agenda_culturel/forms.py:285 agenda_culturel/forms.py:289 +#: agenda_culturel/forms.py:284 agenda_culturel/forms.py:288 msgid "Value of version {}" msgstr "Valeur de la version {}" -#: agenda_culturel/forms.py:476 +#: agenda_culturel/forms.py:435 msgid "Apply category {} to the event {}" msgstr "Appliquer la catégorie {} à l'événement {}" -#: agenda_culturel/forms.py:491 agenda_culturel/models.py:370 -#: agenda_culturel/models.py:1749 +#: agenda_culturel/forms.py:450 agenda_culturel/models.py:415 +#: agenda_culturel/models.py:1795 msgid "Place" msgstr "Lieu" -#: agenda_culturel/forms.py:493 +#: agenda_culturel/forms.py:452 msgid "Create a missing place" msgstr "Créer un lieu manquant" -#: agenda_culturel/forms.py:503 +#: agenda_culturel/forms.py:462 msgid "Add \"{}\" to the aliases of the place" msgstr "Ajouter « {} » aux alias du lieu" -#: agenda_culturel/forms.py:530 +#: agenda_culturel/forms.py:489 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 " "événements correspondants dont la place est manquante." -#: 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:1464 -#: agenda_culturel/models.py:1538 +#: agenda_culturel/models.py:50 agenda_culturel/models.py:95 +#: agenda_culturel/models.py:173 agenda_culturel/models.py:377 +#: agenda_culturel/models.py:394 agenda_culturel/models.py:1510 +#: agenda_culturel/models.py:1584 msgid "Name" msgstr "Nom" -#: agenda_culturel/models.py:50 agenda_culturel/models.py:94 +#: agenda_culturel/models.py:51 agenda_culturel/models.py:95 msgid "Category name" msgstr "Nom de la catégorie" -#: agenda_culturel/models.py:55 +#: agenda_culturel/models.py:56 msgid "Content" msgstr "Contenu" -#: agenda_culturel/models.py:55 +#: agenda_culturel/models.py:56 msgid "Text as shown to the visitors" msgstr "Texte tel que présenté aux visiteureuses" -#: agenda_culturel/models.py:59 +#: agenda_culturel/models.py:60 msgid "URL path" msgstr "Chemin URL" -#: agenda_culturel/models.py:60 +#: agenda_culturel/models.py:61 msgid "URL path where the content is included." msgstr "Chemin URL où le contenu est présent." -#: agenda_culturel/models.py:64 +#: agenda_culturel/models.py:65 msgid "Static content" msgstr "Contenu statique" -#: agenda_culturel/models.py:65 +#: agenda_culturel/models.py:66 msgid "Static contents" msgstr "Contenus statiques" -#: agenda_culturel/models.py:98 +#: agenda_culturel/models.py:99 msgid "Color" msgstr "Couleur" -#: agenda_culturel/models.py:99 +#: agenda_culturel/models.py:100 msgid "Color used as background for the category" msgstr "Couleur utilisée comme fond de la catégorie" -#: agenda_culturel/models.py:105 +#: agenda_culturel/models.py:106 msgid "Pictogram" msgstr "Pictogramme" -#: agenda_culturel/models.py:106 +#: agenda_culturel/models.py:107 msgid "Pictogram of the category (svg format)" msgstr "Pictogramme de la catégorie (format svg)" -#: agenda_culturel/models.py:113 +#: agenda_culturel/models.py:114 msgid "Position for ordering categories" msgstr "Position pour ordonner les catégories" -#: agenda_culturel/models.py:166 +#: agenda_culturel/models.py:167 msgid "Categories" msgstr "Catégories" -#: agenda_culturel/models.py:172 +#: agenda_culturel/models.py:173 msgid "Tag name" msgstr "Nom de l'étiquette" -#: agenda_culturel/models.py:177 agenda_culturel/models.py:499 +#: agenda_culturel/models.py:178 agenda_culturel/models.py:544 msgid "Description" msgstr "Description" -#: agenda_culturel/models.py:178 +#: agenda_culturel/models.py:179 msgid "Description of the tag" msgstr "Description de l'étiquette" -#: agenda_culturel/models.py:184 +#: agenda_culturel/models.py:185 msgid "Principal" msgstr "Principal" -#: agenda_culturel/models.py:185 +#: agenda_culturel/models.py:186 msgid "" "This tag is highlighted as a main tag for visitors, particularly in the " "filter." @@ -261,69 +261,93 @@ msgstr "" "Cette étiquette est mise en avant comme étiquette principale pour les " "visiteurs, en particulier dans le filtre." +#: agenda_culturel/models.py:191 +msgid "In excluded suggestions" +msgstr "Dans les suggestions d'exclusion" + #: agenda_culturel/models.py:192 +msgid "This tag will be part of the excluded suggestions." +msgstr "Cette étiquette fera partie des suggestions d'exclusion." + +#: agenda_culturel/models.py:197 +msgid "In included suggestions" +msgstr "Dans les suggestions d'inclusion." + +#: agenda_culturel/models.py:198 +msgid "This tag will be part of the included suggestions." +msgstr "Cette étiquette fera partie des suggestions d'inclusion." + +#: agenda_culturel/models.py:205 msgid "This tags corresponds to a sub-category of the given category" msgstr "" "Cette étiquette correspond à une sous-catégorie de la catégorie donnée." -#: agenda_culturel/models.py:208 +#: agenda_culturel/models.py:241 +msgid "Suggestions" +msgstr "Suggestions" + +#: agenda_culturel/models.py:242 +msgid "Others" +msgstr "Autres" + +#: agenda_culturel/models.py:253 msgid "Representative event" msgstr "Événement représentatif" -#: agenda_culturel/models.py:209 +#: agenda_culturel/models.py:254 msgid "This event is the representative event of the duplicated events group" msgstr "" "Cet événement est l'événement représentatif du groupe d'événements dupliqués." -#: agenda_culturel/models.py:216 agenda_culturel/models.py:217 +#: agenda_culturel/models.py:261 agenda_culturel/models.py:262 msgid "Duplicated events" msgstr "Événements dupliqués" -#: agenda_culturel/models.py:332 +#: agenda_culturel/models.py:377 msgid "Name of the location" msgstr "Nom de la position" -#: agenda_culturel/models.py:335 +#: agenda_culturel/models.py:380 msgid "Main" msgstr "Principale" -#: agenda_culturel/models.py:336 +#: agenda_culturel/models.py:381 msgid "This location is one of the main locations (shown first)." msgstr "Cette position est une position principale (affichée en premier)." -#: agenda_culturel/models.py:341 +#: agenda_culturel/models.py:386 msgid "Reference location" msgstr "Position de référence" -#: agenda_culturel/models.py:342 +#: agenda_culturel/models.py:387 msgid "Reference locations" msgstr "Positions de référence" -#: agenda_culturel/models.py:349 +#: agenda_culturel/models.py:394 msgid "Name of the place" msgstr "Nom du lieu" -#: agenda_culturel/models.py:351 +#: agenda_culturel/models.py:396 msgid "Address" msgstr "Adresse" -#: agenda_culturel/models.py:352 +#: agenda_culturel/models.py:397 msgid "Address of this place (without city name)" msgstr "Adresse de ce lieu (sans le nom de la ville)" -#: agenda_culturel/models.py:356 +#: agenda_culturel/models.py:401 msgid "City" msgstr "Ville" -#: agenda_culturel/models.py:356 +#: agenda_culturel/models.py:401 msgid "City name" msgstr "Nom de la ville" -#: agenda_culturel/models.py:361 +#: agenda_culturel/models.py:406 msgid "Alternative names" msgstr "Noms alternatifs" -#: agenda_culturel/models.py:363 +#: agenda_culturel/models.py:408 msgid "" "Alternative names or addresses used to match a place with the free-form " "location of an event." @@ -331,77 +355,77 @@ msgstr "" "Noms et adresses alternatives qui seront utilisées pour associer une adresse " "avec la localisation en forme libre d'un événement" -#: agenda_culturel/models.py:371 +#: agenda_culturel/models.py:416 msgid "Places" msgstr "Lieux" -#: agenda_culturel/models.py:424 agenda_culturel/models.py:1579 +#: agenda_culturel/models.py:469 agenda_culturel/models.py:1625 msgid "Published" msgstr "Publié" -#: agenda_culturel/models.py:425 +#: agenda_culturel/models.py:470 msgid "Draft" msgstr "Brouillon" -#: agenda_culturel/models.py:426 +#: agenda_culturel/models.py:471 msgid "Trash" msgstr "Corbeille" -#: agenda_culturel/models.py:437 +#: agenda_culturel/models.py:482 msgid "Title" msgstr "Titre" -#: agenda_culturel/models.py:437 +#: agenda_culturel/models.py:482 msgid "Short title" msgstr "Titre court" -#: agenda_culturel/models.py:441 agenda_culturel/models.py:1665 +#: agenda_culturel/models.py:486 agenda_culturel/models.py:1711 msgid "Status" msgstr "Status" -#: agenda_culturel/models.py:447 +#: agenda_culturel/models.py:492 msgid "Category of the event" msgstr "Catégorie de l'événement" -#: agenda_culturel/models.py:454 +#: agenda_culturel/models.py:499 msgid "Day of the event" msgstr "Date de l'événement" -#: agenda_culturel/models.py:457 agenda_culturel/models.py:458 +#: agenda_culturel/models.py:502 agenda_culturel/models.py:503 msgid "Starting time" msgstr "Heure de début" -#: agenda_culturel/models.py:464 +#: agenda_culturel/models.py:509 msgid "End day of the event" msgstr "Fin de l'événement" -#: agenda_culturel/models.py:466 +#: agenda_culturel/models.py:511 msgid "End day of the event, only required if different from the start day." msgstr "" "Date de fin de l'événement, uniquement nécessaire s'il est différent du " "premier jour de l'événement" -#: agenda_culturel/models.py:472 +#: agenda_culturel/models.py:517 msgid "Final time" msgstr "Heure de fin" -#: agenda_culturel/models.py:476 +#: agenda_culturel/models.py:521 msgid "Recurrence" msgstr "Récurrence" -#: agenda_culturel/models.py:481 agenda_culturel/models.py:1584 +#: agenda_culturel/models.py:526 agenda_culturel/models.py:1630 msgid "Location" msgstr "Localisation" -#: agenda_culturel/models.py:482 +#: agenda_culturel/models.py:527 msgid "Address of the event" msgstr "Adresse de l'événement" -#: agenda_culturel/models.py:488 +#: agenda_culturel/models.py:533 msgid "Location (free form)" msgstr "Localisation (forme libre)" -#: agenda_culturel/models.py:490 +#: agenda_culturel/models.py:535 msgid "" "Address of the event in case its not available in the already known places " "(free form)" @@ -409,211 +433,211 @@ msgstr "" "Addresse d'un événement si elle n'est pas déjà présente dans la liste des " "lieux disponible (forme libre)" -#: agenda_culturel/models.py:500 +#: agenda_culturel/models.py:545 msgid "General description of the event" msgstr "Description générale de l'événement" -#: agenda_culturel/models.py:506 +#: agenda_culturel/models.py:551 msgid "Illustration (local image)" msgstr "Illustration (image locale)" -#: agenda_culturel/models.py:507 +#: agenda_culturel/models.py:552 msgid "Illustration image stored in the agenda server" msgstr "Image d'illustration stockée sur le serveur de l'agenda" -#: agenda_culturel/models.py:514 +#: agenda_culturel/models.py:559 msgid "Illustration" msgstr "Illustration" -#: agenda_culturel/models.py:515 +#: agenda_culturel/models.py:560 msgid "URL of the illustration image" msgstr "URL de l'image illustrative" -#: agenda_culturel/models.py:521 +#: agenda_culturel/models.py:566 msgid "Illustration description" msgstr "Description de l'illustration" -#: agenda_culturel/models.py:522 +#: agenda_culturel/models.py:567 msgid "Alternative text used by screen readers for the image" msgstr "Texte alternatif utiliser par les lecteurs d'écrans pour l'image" -#: agenda_culturel/models.py:530 +#: agenda_culturel/models.py:575 msgid "Importation source" msgstr "Source d'importation" -#: agenda_culturel/models.py:531 +#: agenda_culturel/models.py:576 msgid "Importation source used to detect removed entries." msgstr "Source d'importation utilisée pour détecter les éléments supprimés/" -#: agenda_culturel/models.py:537 +#: agenda_culturel/models.py:582 msgid "UUIDs" msgstr "UUIDs" -#: agenda_culturel/models.py:538 +#: agenda_culturel/models.py:583 msgid "UUIDs from import to detect duplicated entries." msgstr "UUIDs utilisés pendant l'import pour détecter les entrées dupliquées" -#: agenda_culturel/models.py:544 +#: agenda_culturel/models.py:589 msgid "URLs" msgstr "URLs" -#: agenda_culturel/models.py:545 +#: agenda_culturel/models.py:590 msgid "List of all the urls where this event can be found." msgstr "Liste de toutes les urls où l'événement peut être trouvé." -#: agenda_culturel/models.py:552 +#: agenda_culturel/models.py:597 msgid "Tags" msgstr "Étiquettes" -#: agenda_culturel/models.py:553 +#: agenda_culturel/models.py:598 msgid "A list of tags that describe the event." msgstr "Une liste d'étiquettes décrivant l'événement" -#: agenda_culturel/models.py:560 +#: agenda_culturel/models.py:605 msgid "Other versions" msgstr "" -#: agenda_culturel/models.py:625 +#: agenda_culturel/models.py:670 msgid "Event" msgstr "Événement" -#: agenda_culturel/models.py:626 +#: agenda_culturel/models.py:671 msgid "Events" msgstr "Événements" -#: agenda_culturel/models.py:1455 +#: agenda_culturel/models.py:1501 msgid "Contact message" msgstr "Message de contact" -#: agenda_culturel/models.py:1456 +#: agenda_culturel/models.py:1502 msgid "Contact messages" msgstr "Messages de contact" -#: agenda_culturel/models.py:1459 +#: agenda_culturel/models.py:1505 msgid "Subject" msgstr "Sujet" -#: agenda_culturel/models.py:1460 +#: agenda_culturel/models.py:1506 msgid "The subject of your message" msgstr "Sujet de votre message" -#: agenda_culturel/models.py:1465 +#: agenda_culturel/models.py:1511 msgid "Your name" msgstr "Votre nom" -#: agenda_culturel/models.py:1471 +#: agenda_culturel/models.py:1517 msgid "Email address" msgstr "Adresse email" -#: agenda_culturel/models.py:1472 +#: agenda_culturel/models.py:1518 msgid "Your email address" msgstr "Votre adresse email" -#: agenda_culturel/models.py:1477 +#: agenda_culturel/models.py:1523 msgid "Message" msgstr "Message" -#: agenda_culturel/models.py:1477 +#: agenda_culturel/models.py:1523 msgid "Your message" msgstr "Votre message" -#: agenda_culturel/models.py:1482 agenda_culturel/views.py:1005 +#: agenda_culturel/models.py:1528 agenda_culturel/views.py:966 msgid "Spam" msgstr "Spam" -#: agenda_culturel/models.py:1483 +#: agenda_culturel/models.py:1529 msgid "This message is a spam." msgstr "Ce message est un spam." -#: agenda_culturel/models.py:1488 agenda_culturel/views.py:1000 +#: agenda_culturel/models.py:1534 agenda_culturel/views.py:961 msgid "Closed" msgstr "Fermé" -#: agenda_culturel/models.py:1490 +#: agenda_culturel/models.py:1536 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:1495 +#: agenda_culturel/models.py:1541 msgid "Comments" msgstr "Commentaires" -#: agenda_culturel/models.py:1496 +#: agenda_culturel/models.py:1542 msgid "Comments on the message from the moderation team" msgstr "Commentaires sur ce message par l'équipe de modération" -#: agenda_culturel/models.py:1508 agenda_culturel/models.py:1645 +#: agenda_culturel/models.py:1554 agenda_culturel/models.py:1691 msgid "Recurrent import" msgstr "Import récurrent" -#: agenda_culturel/models.py:1509 +#: agenda_culturel/models.py:1555 msgid "Recurrent imports" msgstr "Imports récurrents" -#: agenda_culturel/models.py:1513 +#: agenda_culturel/models.py:1559 msgid "ical" msgstr "ical" -#: agenda_culturel/models.py:1514 +#: agenda_culturel/models.py:1560 msgid "ical no busy" msgstr "ical sans busy" -#: agenda_culturel/models.py:1515 +#: agenda_culturel/models.py:1561 msgid "ical no VC" msgstr "ical sans VC" -#: agenda_culturel/models.py:1516 +#: agenda_culturel/models.py:1562 msgid "lacoope.org" msgstr "lacoope.org" -#: agenda_culturel/models.py:1517 +#: agenda_culturel/models.py:1563 msgid "la comédie" msgstr "la comédie" -#: agenda_culturel/models.py:1518 +#: agenda_culturel/models.py:1564 msgid "le fotomat" msgstr "le fotomat" -#: agenda_culturel/models.py:1519 +#: agenda_culturel/models.py:1565 msgid "la puce à l'oreille" msgstr "la puce à loreille" -#: agenda_culturel/models.py:1520 +#: agenda_culturel/models.py:1566 msgid "Plugin wordpress MEC" msgstr "Plugin wordpress MEC" -#: agenda_culturel/models.py:1521 +#: agenda_culturel/models.py:1567 msgid "Événements d'une page FB" msgstr "Événements d'une page FB" -#: agenda_culturel/models.py:1522 +#: agenda_culturel/models.py:1568 msgid "la cour des 3 coquins" msgstr "la cour des 3 coquins" -#: agenda_culturel/models.py:1523 +#: agenda_culturel/models.py:1569 msgid "Arachnée concert" msgstr "Arachnée concert" -#: agenda_culturel/models.py:1526 +#: agenda_culturel/models.py:1572 msgid "simple" msgstr "simple" -#: agenda_culturel/models.py:1527 +#: agenda_culturel/models.py:1573 msgid "Headless Chromium" msgstr "chromium sans interface" -#: agenda_culturel/models.py:1528 +#: agenda_culturel/models.py:1574 msgid "Headless Chromium (pause)" msgstr "chromium sans interface (pause)" -#: agenda_culturel/models.py:1533 +#: agenda_culturel/models.py:1579 msgid "daily" msgstr "chaque jour" -#: agenda_culturel/models.py:1535 +#: agenda_culturel/models.py:1581 msgid "weekly" msgstr "chaque semaine" -#: agenda_culturel/models.py:1540 +#: agenda_culturel/models.py:1586 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 +645,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:1547 +#: agenda_culturel/models.py:1593 msgid "Processor" msgstr "Processeur" -#: agenda_culturel/models.py:1550 +#: agenda_culturel/models.py:1596 msgid "Downloader" msgstr "Téléchargeur" -#: agenda_culturel/models.py:1557 +#: agenda_culturel/models.py:1603 msgid "Import recurrence" msgstr "Récurrence d'import" -#: agenda_culturel/models.py:1564 +#: agenda_culturel/models.py:1610 msgid "Source" msgstr "Source" -#: agenda_culturel/models.py:1565 +#: agenda_culturel/models.py:1611 msgid "URL of the source document" msgstr "URL du document source" -#: agenda_culturel/models.py:1569 +#: agenda_culturel/models.py:1615 msgid "Browsable url" msgstr "URL navigable" -#: agenda_culturel/models.py:1571 +#: agenda_culturel/models.py:1617 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:1580 +#: agenda_culturel/models.py:1626 msgid "Status of each imported event (published or draft)" msgstr "Status de chaque événement importé (publié ou brouillon)" -#: agenda_culturel/models.py:1585 +#: agenda_culturel/models.py:1631 msgid "Address for each imported event" msgstr "Adresse de chaque événement importé" -#: agenda_culturel/models.py:1593 +#: agenda_culturel/models.py:1639 msgid "Category of each imported event" msgstr "Catégorie de chaque événement importé" -#: agenda_culturel/models.py:1601 +#: agenda_culturel/models.py:1647 msgid "Tags for each imported event" msgstr "Étiquettes de chaque événement importé" -#: agenda_culturel/models.py:1602 +#: agenda_culturel/models.py:1648 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:1631 +#: agenda_culturel/models.py:1677 msgid "Running" msgstr "En cours" -#: agenda_culturel/models.py:1632 +#: agenda_culturel/models.py:1678 msgid "Canceled" msgstr "Annulé" -#: agenda_culturel/models.py:1633 +#: agenda_culturel/models.py:1679 msgid "Success" msgstr "Succès" -#: agenda_culturel/models.py:1634 +#: agenda_culturel/models.py:1680 msgid "Failed" msgstr "Erreur" -#: agenda_culturel/models.py:1637 +#: agenda_culturel/models.py:1683 msgid "Batch importation" msgstr "Importation par lot" -#: agenda_culturel/models.py:1638 +#: agenda_culturel/models.py:1684 msgid "Batch importations" msgstr "Importations par lot" -#: agenda_culturel/models.py:1646 +#: agenda_culturel/models.py:1692 msgid "Reference to the recurrent import processing" msgstr "Référence du processus d'import récurrent" -#: agenda_culturel/models.py:1654 +#: agenda_culturel/models.py:1700 msgid "URL (if not recurrent import)" msgstr "URL (si pas d'import récurrent)" -#: agenda_culturel/models.py:1656 +#: agenda_culturel/models.py:1702 msgid "Source URL if no RecurrentImport is associated." msgstr "URL source si aucun import récurrent n'est associé" -#: agenda_culturel/models.py:1669 +#: agenda_culturel/models.py:1715 msgid "Error message" msgstr "Votre message" -#: agenda_culturel/models.py:1673 +#: agenda_culturel/models.py:1719 msgid "Number of collected events" msgstr "Nombre d'événements collectés" -#: agenda_culturel/models.py:1676 +#: agenda_culturel/models.py:1722 msgid "Number of imported events" msgstr "Nombre d'événements importés" -#: agenda_culturel/models.py:1679 +#: agenda_culturel/models.py:1725 msgid "Number of updated events" msgstr "Nombre d'événements mis à jour" -#: agenda_culturel/models.py:1682 +#: agenda_culturel/models.py:1728 msgid "Number of removed events" msgstr "Nombre d'événements supprimés" -#: agenda_culturel/models.py:1690 +#: agenda_culturel/models.py:1736 msgid "Weight" msgstr "Poids" -#: agenda_culturel/models.py:1691 +#: agenda_culturel/models.py:1737 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:1698 +#: agenda_culturel/models.py:1744 msgid "Category applied to the event" msgstr "Catégorie appliquée à l'événement" -#: agenda_culturel/models.py:1703 +#: agenda_culturel/models.py:1749 msgid "Contained in the title" msgstr "Contenu dans le titre" -#: agenda_culturel/models.py:1704 +#: agenda_culturel/models.py:1750 msgid "Text contained in the event title" msgstr "Texte contenu dans le titre de l'événement" -#: agenda_culturel/models.py:1710 +#: agenda_culturel/models.py:1756 msgid "Exact title extract" msgstr "Extrait exact du titre" -#: agenda_culturel/models.py:1712 +#: agenda_culturel/models.py:1758 msgid "" "If checked, the extract will be searched for in the title using the exact " "form (capitals, accents)." @@ -757,19 +781,19 @@ msgstr "" "Si coché, l'extrait sera recherché dans le titre en utilisant la forme " "exacte (majuscules, accents)" -#: agenda_culturel/models.py:1718 +#: agenda_culturel/models.py:1764 msgid "Contained in the description" msgstr "Contenu dans la description" -#: agenda_culturel/models.py:1719 +#: agenda_culturel/models.py:1765 msgid "Text contained in the description" msgstr "Texte contenu dans la description" -#: agenda_culturel/models.py:1725 +#: agenda_culturel/models.py:1771 msgid "Exact description extract" msgstr "Extrait exact de description" -#: agenda_culturel/models.py:1727 +#: agenda_culturel/models.py:1773 msgid "" "If checked, the extract will be searched for in the description using the " "exact form (capitals, accents)." @@ -777,19 +801,19 @@ msgstr "" "Si coché, l'extrait sera recherché dans la description en utilisant la forme " "exacte (majuscules, accents)" -#: agenda_culturel/models.py:1733 +#: agenda_culturel/models.py:1779 msgid "Contained in the location" msgstr "Contenu dans la localisation" -#: agenda_culturel/models.py:1734 +#: agenda_culturel/models.py:1780 msgid "Text contained in the event location" msgstr "Texte contenu dans la localisation de l'événement" -#: agenda_culturel/models.py:1740 +#: agenda_culturel/models.py:1786 msgid "Exact location extract" msgstr "Extrait exact de localisation" -#: agenda_culturel/models.py:1742 +#: agenda_culturel/models.py:1788 msgid "" "If checked, the extract will be searched for in the location using the exact " "form (capitals, accents)." @@ -797,60 +821,18 @@ msgstr "" "Si coché, l'extrait sera recherché dans la localisation en utilisant la " "forme exacte (majuscules, accents)" -#: agenda_culturel/models.py:1750 +#: agenda_culturel/models.py:1796 msgid "Location from place" msgstr "Localisation depuis le lieu" -#: agenda_culturel/models.py:1759 +#: agenda_culturel/models.py:1805 msgid "Categorisation rule" msgstr "Règle de catégorisation" -#: agenda_culturel/models.py:1760 +#: agenda_culturel/models.py:1806 msgid "Categorisation rules" msgstr "Règles de catégorisation" -#: agenda_culturel/models.py:1831 agenda_culturel/models.py:1863 -msgid "Question" -msgstr "Question" - -#: 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:1838 -msgid "Moderation question" -msgstr "Question de modération" - -#: agenda_culturel/models.py:1839 -msgid "Moderation questions" -msgstr "Questions de modération" - -#: agenda_culturel/models.py:1864 -msgid "Associated question from moderation" -msgstr "Question associée pour la modération" - -#: agenda_culturel/models.py:1869 -msgid "Answer" -msgstr "Réponse" - -#: agenda_culturel/models.py:1876 -msgid "Adds tags" -msgstr "Ajoute les étiquettes" - -#: 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:1883 -msgid "Removes tags" -msgstr "Retire les étiquettes" - -#: 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." - #: agenda_culturel/settings/base.py:150 msgid "English" msgstr "anglais" @@ -859,27 +841,31 @@ msgstr "anglais" msgid "French" msgstr "français" -#: agenda_culturel/views.py:137 +#: agenda_culturel/views.py:132 msgid "Recurrent import name" msgstr "Nome de l'import récurrent" -#: agenda_culturel/views.py:138 +#: agenda_culturel/views.py:133 msgid "Add another" msgstr "Ajouter un autre" -#: agenda_culturel/views.py:139 +#: agenda_culturel/views.py:134 msgid "Browse..." msgstr "Naviguer..." -#: agenda_culturel/views.py:140 +#: agenda_culturel/views.py:135 msgid "No file selected." msgstr "Pas de fichier sélectionné." -#: agenda_culturel/views.py:545 +#: agenda_culturel/views.py:167 +msgid "Select a location" +msgstr "Choisir une localité" + +#: agenda_culturel/views.py:530 msgid "The static content has been successfully updated." msgstr "Le contenu statique a été modifié avec succès." -#: agenda_culturel/views.py:553 +#: agenda_culturel/views.py:538 msgid "" "The event cannot be updated because the import process is not available for " "the referenced sources." @@ -887,29 +873,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:556 +#: agenda_culturel/views.py:541 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:566 agenda_culturel/views.py:640 +#: agenda_culturel/views.py:551 msgid "The event has been successfully modified." msgstr "L'événement a été modifié avec succès." -#: agenda_culturel/views.py:609 +#: agenda_culturel/views.py:594 msgid "The event has been successfully deleted." msgstr "L'événement a été supprimé avec succès" -#: agenda_culturel/views.py:665 +#: agenda_culturel/views.py:626 msgid "The status has been successfully modified." msgstr "Le status a été modifié avec succès." -#: agenda_culturel/views.py:701 +#: agenda_culturel/views.py:662 msgid "The event was created: {}." msgstr "L'événement a été créé: {}." -#: agenda_culturel/views.py:703 agenda_culturel/views.py:717 +#: agenda_culturel/views.py:664 agenda_culturel/views.py:678 msgid "" "The event has been submitted and will be published as soon as it has been " "validated by the moderation team." @@ -917,110 +903,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:711 +#: agenda_culturel/views.py:672 msgid "The event is saved." msgstr "L'événement est enregistré." -#: agenda_culturel/views.py:803 agenda_culturel/views.py:855 +#: agenda_culturel/views.py:764 agenda_culturel/views.py:816 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:808 agenda_culturel/views.py:861 +#: agenda_culturel/views.py:769 agenda_culturel/views.py:822 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:818 +#: agenda_culturel/views.py:779 msgid "Integrating {} url(s) into our import process." msgstr "Intégration de {} url(s) dans notre processus d'import." -#: agenda_culturel/views.py:868 +#: agenda_culturel/views.py:829 msgid "Integrating {} into our import process." msgstr "Intégration de {} dans notre processus d'import." -#: agenda_culturel/views.py:921 +#: agenda_culturel/views.py:882 msgid "Representative version" msgstr "Version représentative" -#: agenda_culturel/views.py:922 +#: agenda_culturel/views.py:883 msgid "Yes" msgstr "Oui" -#: agenda_culturel/views.py:922 +#: agenda_culturel/views.py:883 msgid "Non" msgstr "Non" -#: agenda_culturel/views.py:927 +#: agenda_culturel/views.py:888 msgid "Imported from" msgstr "Importé depuis" -#: agenda_culturel/views.py:960 +#: agenda_culturel/views.py:921 msgid "Your message has been sent successfully." msgstr "Votre message a été envoyé avec succès." -#: agenda_culturel/views.py:970 +#: agenda_culturel/views.py:931 msgid "The contact message has been successfully deleted." msgstr "Le message de contact a été supprimé avec succès." -#: agenda_culturel/views.py:984 +#: agenda_culturel/views.py:945 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:1000 +#: agenda_culturel/views.py:961 msgid "Open" msgstr "Ouvert" -#: agenda_culturel/views.py:1005 +#: agenda_culturel/views.py:966 msgid "Non spam" msgstr "Non spam" -#: agenda_culturel/views.py:1131 +#: agenda_culturel/views.py:1097 msgid "Spam has been successfully deleted." msgstr "Le spam a été supprimé avec succès" -#: agenda_culturel/views.py:1148 +#: agenda_culturel/views.py:1114 msgid "Search" msgstr "Rechercher" -#: agenda_culturel/views.py:1340 +#: agenda_culturel/views.py:1306 msgid "The import has been run successfully." msgstr "L'import a été lancé avec succès" -#: agenda_culturel/views.py:1359 +#: agenda_culturel/views.py:1325 msgid "The import has been canceled." msgstr "L'import a été annulé" -#: agenda_culturel/views.py:1433 +#: agenda_culturel/views.py:1399 msgid "The recurrent import has been successfully modified." msgstr "L'import récurrent a été modifié avec succès." -#: agenda_culturel/views.py:1442 +#: agenda_culturel/views.py:1408 msgid "The recurrent import has been successfully deleted." msgstr "L'import récurrent a été supprimé avec succès" -#: agenda_culturel/views.py:1482 +#: agenda_culturel/views.py:1448 msgid "The import has been launched." msgstr "L'import a été lancé" -#: agenda_culturel/views.py:1504 +#: agenda_culturel/views.py:1470 msgid "Imports has been launched." msgstr "Les imports ont été lancés" -#: agenda_culturel/views.py:1575 +#: agenda_culturel/views.py:1541 msgid "Update successfully completed." msgstr "Mise à jour réalisée avec succès." -#: agenda_culturel/views.py:1633 +#: agenda_culturel/views.py:1599 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:1669 +#: agenda_culturel/views.py:1635 msgid "Events have been marked as unduplicated." msgstr "Les événements ont été marqués comme non dupliqués." -#: agenda_culturel/views.py:1683 agenda_culturel/views.py:1692 -#: agenda_culturel/views.py:1710 +#: agenda_culturel/views.py:1649 agenda_culturel/views.py:1658 +#: agenda_culturel/views.py:1676 msgid "" "The selected item is no longer included in the list of duplicates. Someone " "else has probably modified the list in the meantime." @@ -1028,23 +1014,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:1686 +#: agenda_culturel/views.py:1652 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:1701 +#: agenda_culturel/views.py:1667 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:1745 +#: agenda_culturel/views.py:1711 msgid "Cleaning up duplicates: {} item(s) fixed." msgstr "Nettoyage des dupliqués: {} élément(s) corrigé(s)." -#: agenda_culturel/views.py:1794 +#: agenda_culturel/views.py:1760 msgid "The event was successfully duplicated." msgstr "L'événement a été marqué dupliqué avec succès." -#: agenda_culturel/views.py:1802 +#: agenda_culturel/views.py:1768 msgid "" "The event has been successfully flagged as a duplicate. The moderation team " "will deal with your suggestion shortly." @@ -1052,32 +1038,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:1855 +#: agenda_culturel/views.py:1821 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:1864 +#: agenda_culturel/views.py:1830 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:1886 +#: agenda_culturel/views.py:1852 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:1893 +#: agenda_culturel/views.py:1859 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:1900 agenda_culturel/views.py:1953 +#: agenda_culturel/views.py:1866 agenda_culturel/views.py:1919 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:1939 +#: agenda_culturel/views.py:1905 msgid "" "The rules were successfully applied and 1 event with default category was " "categorised." @@ -1085,7 +1071,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:1946 +#: agenda_culturel/views.py:1912 msgid "" "The rules were successfully applied and {} events with default category were " "categorised." @@ -1093,76 +1079,41 @@ 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: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:2122 agenda_culturel/views.py:2184 -#: agenda_culturel/views.py:2222 +#: agenda_culturel/views.py:2001 agenda_culturel/views.py:2063 +#: agenda_culturel/views.py:2101 msgid "{} events have been updated." msgstr "{} événements ont été mis à jour." -#: agenda_culturel/views.py:2125 agenda_culturel/views.py:2186 -#: agenda_culturel/views.py:2225 +#: agenda_culturel/views.py:2004 agenda_culturel/views.py:2065 +#: agenda_culturel/views.py:2104 msgid "1 event has been updated." msgstr "1 événement a été mis à jour" -#: agenda_culturel/views.py:2127 agenda_culturel/views.py:2188 -#: agenda_culturel/views.py:2227 +#: agenda_culturel/views.py:2006 agenda_culturel/views.py:2067 +#: agenda_culturel/views.py:2106 msgid "No events have been modified." msgstr "Aucun événement n'a été modifié." -#: agenda_culturel/views.py:2136 +#: agenda_culturel/views.py:2015 msgid "The place has been successfully updated." msgstr "Le lieu a été modifié avec succès." -#: agenda_culturel/views.py:2145 +#: agenda_culturel/views.py:2024 msgid "The place has been successfully created." msgstr "Le lieu a été créé avec succès." -#: agenda_culturel/views.py:2210 +#: agenda_culturel/views.py:2089 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:2214 +#: agenda_culturel/views.py:2093 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:2270 +#: agenda_culturel/views.py:2149 msgid "The tag has been successfully updated." msgstr "L'étiquette a été modifiée avec succès." -#: agenda_culturel/views.py:2277 +#: agenda_culturel/views.py:2156 msgid "The tag has been successfully created." msgstr "L'étiquette a été créée avec succès." - -#~ msgid "" -#~ "These inputs represent the same event, and {} is selected as the " -#~ "representative version." -#~ msgstr "" -#~ "Ces entrées représentent le même événement, et on sélectionne {} comme la " -#~ "version représentative." - -#~ msgid "" -#~ "These entries represent the same event, and a new one is created by " -#~ "merging them." -#~ msgstr "" -#~ "Ces entrées représentent le même événement, et on en créé une nouvelle en " -#~ "les fusionnant." - -#~ msgid "event {} is different from the others, we make it independent" -#~ msgstr "L'événement {} est différent des autres, on le rend indépendant." - -#~ msgid "These events are all different, so we make them independent." -#~ msgstr "Les événements sont tous différents, on les rend indépendants." - -#~ msgid "" -#~ "Please note that this event has not been modified since it was last " -#~ "updated by import. If you modify any information from this import, the " -#~ "event will be desynchronized with the source, and will need to be merged " -#~ "with each future automatic import." -#~ msgstr "" -#~ "Attention, cet événement n'a pas été modifié depuis sa dernière mise à " -#~ "jour par importation. Si vous modifiez une information issue de cet " -#~ "import, l'événement sera désynchronisé d'avec la source, et nécessitera " -#~ "une fusion à chaque import automatique futurs." diff --git a/src/agenda_culturel/migrations/0110_tag_in_excluded_suggestions_and_more.py b/src/agenda_culturel/migrations/0110_tag_in_excluded_suggestions_and_more.py new file mode 100644 index 0000000..e2a6958 --- /dev/null +++ b/src/agenda_culturel/migrations/0110_tag_in_excluded_suggestions_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.9 on 2024-11-13 17:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('agenda_culturel', '0109_delete_moderationanswer_delete_moderationquestion'), + ] + + operations = [ + migrations.AddField( + model_name='tag', + name='in_excluded_suggestions', + field=models.BooleanField(default=False, help_text='This tag will be part of the excluded suggestions.', verbose_name='In excluded suggestions'), + ), + migrations.AddField( + model_name='tag', + name='in_included_suggestions', + field=models.BooleanField(default=False, help_text='This tag will be part of the included suggestions.', verbose_name='In included suggestions'), + ), + ] diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index 2c45e32..ab76de5 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -1,4 +1,5 @@ from django.db import models, connection +from django.core.exceptions import FieldDoesNotExist from django_better_admin_arrayfield.models.fields import ArrayField from django.utils.translation import gettext_lazy as _ from django.utils.safestring import mark_safe @@ -186,6 +187,18 @@ class Tag(models.Model): default=True, ) + in_excluded_suggestions = models.BooleanField( + verbose_name=_("In excluded suggestions"), + help_text=_("This tag will be part of the excluded suggestions."), + default=False, + ) + + in_included_suggestions = models.BooleanField( + verbose_name=_("In included suggestions"), + help_text=_("This tag will be part of the included suggestions."), + default=False, + ) + category = models.ForeignKey( Category, verbose_name=_("Category"), @@ -199,6 +212,42 @@ class Tag(models.Model): def get_absolute_url(self): return reverse("view_tag", kwargs={"t": self.name}) + def get_tag_groups(nb_suggestions=10, exclude=False, include=False): + free_tags = Event.get_all_tags(False) + + obj_tags = Tag.objects + + try: + if exclude: + obj_tags = obj_tags.filter(Q(in_excluded_suggestions=True)) + if include: + obj_tags = obj_tags.filter(Q(in_included_suggestions=True)|Q(principal=True)) + except FieldDoesNotExist: + pass + + if not exclude and not include: + obj_tags = obj_tags.filter(principal=True) + + obj_tags = obj_tags.values_list("name", flat=True) + + if len(obj_tags) > nb_suggestions: + nb_suggestions = len(obj_tags) + + tags = [{"tag": t["tag"], "count": 1000000 if t["tag"] in obj_tags else t["count"]} for t in free_tags] + + tags.sort(key=lambda x: -x["count"]) + + tags1 = tags[0:nb_suggestions] + tags1.sort(key=lambda x: remove_accents(x["tag"]).lower()) + tags2 = tags[nb_suggestions:] + tags2.sort(key=lambda x: remove_accents(x["tag"]).lower()) + + result = ((_('Suggestions'), [(t["tag"], t["tag"]) for t in tags1]), + (_('Others'), [(t["tag"], t["tag"]) for t in tags2])) + + return result + + class DuplicatedEvents(models.Model): @@ -626,14 +675,17 @@ class Event(models.Model): verbose_name_plural = _("Events") permissions = [("set_duplicated_event", "Can set an event as duplicated")] - def get_all_tags(): + def get_all_tags(sort=True): cursor = connection.cursor() raw_query = """ select unnest(subquery_alias.tags) as distinct_tags, count(*) as tags_group_by_count from (select tags from agenda_culturel_event) as subquery_alias group by distinct_tags; """ cursor.execute(raw_query) - return [{"tag": row[0], "count": row[1]} for row in cursor] + result = [{"tag": row[0], "count": row[1]} for row in cursor] + if sort: + result.sort(key=lambda x: remove_accents(x["tag"].lower())) + return result def is_draft(self): return self.status == Event.STATUS.DRAFT diff --git a/src/agenda_culturel/static/style.scss b/src/agenda_culturel/static/style.scss index ec918c6..bcf8a71 100644 --- a/src/agenda_culturel/static/style.scss +++ b/src/agenda_culturel/static/style.scss @@ -1252,15 +1252,31 @@ img.preview { } } .choices__list--dropdown { - display: none; + font-size: 80%; + display: block; will-change: display; + background: var(--background-color); + padding: 0.4em; + border-radius: 0.2em; + box-shadow: 0 -1px 0 rgba(115, 130, 140, 0.2); position: relative; max-height: 300px; overflow: auto; -webkit-overflow-scrolling: touch; will-change: scroll-position; } - .choices__list--dropdown.is-active { + .choices__list--dropdown .choices__group, + .choices__list--dropdown .choices__item { + display: none; + } + + .choices__list--dropdown .choices__item.visible, + .choices__list--dropdown.is-active .choices__item { + display: inline-block; + } + + .choices__list--dropdown .choices__group.visible, + .choices__list--dropdown.is-active .choices__group { display: block; } } diff --git a/src/agenda_culturel/templates/agenda_culturel/filter-inc.html b/src/agenda_culturel/templates/agenda_culturel/filter-inc.html index b897be5..7d7d025 100644 --- a/src/agenda_culturel/templates/agenda_culturel/filter-inc.html +++ b/src/agenda_culturel/templates/agenda_culturel/filter-inc.html @@ -20,7 +20,7 @@ {{ t | tag_button:"true" }} {% endfor %} {% for t in filter.get_exclude_tags %} - {{ t | tag_button_strike }} + {{ t | tag_button_strike:"true" }} {% endfor %} {% for s in filter.get_status_names %} {{ s }} @@ -74,6 +74,23 @@ {% if noarticle == 0 %} diff --git a/src/agenda_culturel/templates/agenda_culturel/tag.html b/src/agenda_culturel/templates/agenda_culturel/tag.html index 036587d..9eb9137 100644 --- a/src/agenda_culturel/templates/agenda_culturel/tag.html +++ b/src/agenda_culturel/templates/agenda_culturel/tag.html @@ -26,11 +26,23 @@ {% endif %} {% else %} {% if perms.agenda_culturel.add_tag %} - Renseigner l'étiquette + Renseigner l'étiquette {% endif %} {% endif %} -

Les événements {{ tag }}

+

Les événements {{ tag }}

+ {% if user.is_authenticated and object %} + {% if object.in_excluded_suggestions %} +

Cette étiquette fait partie des étiquettes suggérées pour l'exclusion.

+ {% endif %} + {% if object.in_included_suggestions %} +

Cette étiquette fait partie des étiquettes suggérées pour l'inclusion.

+ {% endif %} + {% if object.principal %} +

Cette étiquette fait partie des étiquettes principales mises en avant.

+ {% endif %} + {% endif %} + {% if object %} diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index d549552..4f6dbca 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -164,7 +164,7 @@ class EventFilter(django_filters.FilterSet): position = django_filters.ModelChoiceFilter( label="À proximité de", method="no_filter", - empty_label=_("Choisir une localité"), + empty_label=_("Select a location"), queryset=ReferenceLocation.objects.all().order_by("-main", "name__unaccent") ) @@ -178,7 +178,7 @@ class EventFilter(django_filters.FilterSet): exclude_tags = django_filters.MultipleChoiceFilter( label="Exclure les étiquettes", - choices=[(t["tag"], t["tag"]) for t in Event.get_all_tags()], + choices=[], lookup_expr="icontains", field_name="tags", exclude=True, @@ -187,7 +187,7 @@ class EventFilter(django_filters.FilterSet): tags = django_filters.MultipleChoiceFilter( label="Inclure les étiquettes", - choices=[(t["tag"], t["tag"]) for t in Event.get_all_tags()], + choices=[], lookup_expr="icontains", conjoined=True, field_name="tags", @@ -224,6 +224,8 @@ class EventFilter(django_filters.FilterSet): super().__init__(*args, **kwargs) if not kwargs["request"].user.is_authenticated: self.form.fields.pop("status") + self.form.fields["exclude_tags"].choices = Tag.get_tag_groups(exclude=True, nb_suggestions=0) + self.form.fields["tags"].choices = Tag.get_tag_groups(include=True) def filter_recurrences(self, queryset, name, value): # construct the full lookup expression @@ -396,7 +398,7 @@ class EventFilter(django_filters.FilterSet): return result def tag_exists(self, tag): - return tag in [t[0] for t in self.form.fields["tags"].choices] + return tag in [t[0] for g in self.form.fields["tags"].choices for t in g[1]] def set_default_values(request): if request.user.is_authenticated: @@ -2145,14 +2147,14 @@ class PlaceFromEventCreateView(PlaceCreateView): class TagUpdateView(PermissionRequiredMixin, SuccessMessageMixin, UpdateView): model = Tag permission_required = "agenda_culturel.change_tag" - fields = ["name", "description", "principal", "category"] + fields = ["name", "description", "principal", "category", "in_excluded_suggestions", "in_included_suggestions"] success_message = _("The tag has been successfully updated.") class TagCreateView(PermissionRequiredMixin, SuccessMessageMixin, CreateView): model = Tag permission_required = "agenda_culturel.add_tag" - fields = ["name", "description", "principal", "category"] + fields = ["name", "description", "principal", "category", "in_excluded_suggestions", "in_included_suggestions"] success_message = _("The tag has been successfully created.") def get_initial(self, *args, **kwargs):