diff --git a/src/agenda_culturel/db_importer.py b/src/agenda_culturel/db_importer.py index 505975a..f88477d 100644 --- a/src/agenda_culturel/db_importer.py +++ b/src/agenda_culturel/db_importer.py @@ -9,6 +9,7 @@ from django.core.files.storage import default_storage from django.utils.translation import gettext_lazy as _ import recurrence import recurrence.fields +from .models.constants import TITLE_ISSUE_DATE_IMPORTATION, TITLE_ISSUE_TIME_IMPORTATION from django.utils import timezone @@ -371,19 +372,9 @@ class DBImporterEvents: for w in warnings: if w == Extractor.Warning.NO_START_DATE: - event_structure["title"] += ( - " - " - + _("Warning") - + ": " - + _("the date has not been imported correctly.") - ) + event_structure["title"] += TITLE_ISSUE_DATE_IMPORTATION if w == Extractor.Warning.NO_START_TIME: - event_structure["title"] += ( - " - " - + _("Warning") - + ": " - + _("the time has not been imported correctly.") - ) + event_structure["title"] += TITLE_ISSUE_TIME_IMPORTATION if "category" in event_structure and event_structure["category"] is not None: try: diff --git a/src/agenda_culturel/forms.py b/src/agenda_culturel/forms.py index 5e93fe0..7cc9574 100644 --- a/src/agenda_culturel/forms.py +++ b/src/agenda_culturel/forms.py @@ -42,6 +42,12 @@ from .models import ( from .templatetags.event_extra import event_field_verbose_name, field_to_html from .templatetags.utils_extra import int_to_abc +from .models.constants import ( + TITLE_ISSUE_DATE_IMPORTATION, + TITLE_ISSUE_TIME_IMPORTATION, + PUBLICATION_ISSUE, +) + logger = logging.getLogger(__name__) @@ -446,7 +452,37 @@ class EventForm(GroupFormMixin, ModelForm): return list(set(self.cleaned_data.get("new_tags"))) def clean(self): - super().clean() + cleaned_data = super().clean() + + issues = Event.get_title_publication_issues(cleaned_data["title"]) + + if len(issues) > 0 and cleaned_data["status"] == Event.STATUS.PUBLISHED: + r_issues = [] + + for i in issues: + if i == PUBLICATION_ISSUE.DATE_IMPORTATION_IN_TITLE: + if cleaned_data.get("start_day") != self.instance.start_day: + cleaned_data["title"] = cleaned_data.get("title").replace( + TITLE_ISSUE_DATE_IMPORTATION, "" + ) + else: + r_issues.append(i) + elif i == PUBLICATION_ISSUE.TIME_IMPORTATION_IN_TITLE: + if cleaned_data.get("start_time") is not None: + cleaned_data["title"] = cleaned_data["title"].replace( + TITLE_ISSUE_TIME_IMPORTATION, "" + ) + else: + r_issues.append(i) + else: + r_issues.append(i) + + if len(r_issues) > 0: + raise ValidationError( + _( + "You can't publish an event without correcting the problems it contains ({})." + ).format(", ".join([str(r) for r in r_issues])) + ) if self.is_moderation_expert and self.cleaned_data.get("new_tags") is not None: self.cleaned_data["tags"] += self.cleaned_data.get("new_tags") diff --git a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po index fb8ce1a..e656c84 100644 --- a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po +++ b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: agenda_culturel\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-04-29 22:23+0200\n" +"POT-Creation-Date: 2025-05-01 22:16+0200\n" "PO-Revision-Date: 2023-10-29 14:16+0000\n" "Last-Translator: Jean-Marie Favreau \n" "Language-Team: Jean-Marie Favreau \n" @@ -90,27 +90,27 @@ msgstr "Après-midi" msgid "Evening" msgstr "Soir" -#: agenda_culturel/db_importer.py:198 +#: agenda_culturel/db_importer.py:199 msgid "Updated field(s): " msgstr "Champ(s) mis à jour: " -#: agenda_culturel/db_importer.py:202 +#: agenda_culturel/db_importer.py:203 msgid "Update" msgstr "Mise à jour" -#: agenda_culturel/db_importer.py:203 +#: agenda_culturel/db_importer.py:204 msgid "update process" msgstr "processus de mise à jour" -#: agenda_culturel/db_importer.py:272 +#: agenda_culturel/db_importer.py:273 msgid "Import" msgstr "Import" -#: agenda_culturel/db_importer.py:273 +#: agenda_culturel/db_importer.py:274 msgid "import process" msgstr "processus d'import" -#: agenda_culturel/db_importer.py:275 +#: agenda_culturel/db_importer.py:276 msgid "" "The duration of the event is a little too long for direct publication. " "Moderators can choose to publish it or not." @@ -118,33 +118,28 @@ msgstr "" "La durée de l'événement est un peu trop longue pour qu'il soit publié " "directement. Les modérateurs peuvent choisir de le publier ou non." -#: agenda_culturel/db_importer.py:376 agenda_culturel/db_importer.py:383 -#: agenda_culturel/models/message.py:20 -msgid "Warning" -msgstr "Attention" - -#: agenda_culturel/db_importer.py:378 agenda_culturel/db_importer.py:491 -msgid "the date has not been imported correctly." -msgstr "la date n'a pas été importée correctement." - -#: agenda_culturel/db_importer.py:385 agenda_culturel/db_importer.py:501 -msgid "the time has not been imported correctly." -msgstr "l'heure n'a pas été importée correctement." - -#: agenda_culturel/db_importer.py:473 +#: agenda_culturel/db_importer.py:464 msgid "during import process" msgstr "pendant le processus d'import" -#: agenda_culturel/db_importer.py:489 agenda_culturel/db_importer.py:499 -#: agenda_culturel/db_importer.py:509 agenda_culturel/db_importer.py:520 +#: agenda_culturel/db_importer.py:480 agenda_culturel/db_importer.py:490 +#: agenda_culturel/db_importer.py:500 agenda_culturel/db_importer.py:511 msgid "warning" msgstr "attention" -#: agenda_culturel/db_importer.py:511 +#: agenda_culturel/db_importer.py:482 agenda_culturel/models/constants.py:14 +msgid "the date has not been imported correctly." +msgstr "la date n'a pas été importée correctement." + +#: agenda_culturel/db_importer.py:492 agenda_culturel/models/constants.py:20 +msgid "the time has not been imported correctly." +msgstr "l'heure n'a pas été importée correctement." + +#: agenda_culturel/db_importer.py:502 msgid "the title has not been imported correctly." msgstr "le titre n'a pas été importé correctement." -#: agenda_culturel/db_importer.py:523 +#: agenda_culturel/db_importer.py:514 msgid "The import was unable to find an event in the page." msgstr "L'import a été incapable de trouver un événement dans la page." @@ -652,6 +647,18 @@ msgstr "Illustration (version de développement)" msgid "Site Configuration" msgstr "Configuration du site" +#: agenda_culturel/models/constants.py:5 agenda_culturel/models/message.py:20 +msgid "Warning" +msgstr "Attention" + +#: agenda_culturel/models/constants.py:29 +msgid "date import problem" +msgstr "problème de date pendant l'import" + +#: agenda_culturel/models/constants.py:30 +msgid "time import problem" +msgstr "problème d'heure pendant l'import" + #: agenda_culturel/models/event.py:48 msgid "Representative event" msgstr "Événement représentatif" @@ -1521,7 +1528,7 @@ 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/event_views.py:66 +#: agenda_culturel/views/event_views.py:67 msgid "" "The event cannot be updated because the import process is not available for " "the referenced sources." @@ -1529,22 +1536,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/event_views.py:79 +#: agenda_culturel/views/event_views.py:80 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/event_views.py:108 -#: agenda_culturel/views/moderation_views.py:38 +#: agenda_culturel/views/event_views.py:109 +#: agenda_culturel/views/moderation_views.py:39 msgid " A message has been sent to the person who proposed the event." msgstr " Un message a été envoyé à la personne qui a proposé l'événement." -#: agenda_culturel/views/event_views.py:112 +#: agenda_culturel/views/event_views.py:113 msgid "The event has been successfully modified." msgstr "L'événement a été modifié avec succès." -#: agenda_culturel/views/event_views.py:136 +#: agenda_culturel/views/event_views.py:154 +msgid "" +"You can't publish an event without correcting the problems it contains ({})." +msgstr "" +"Vous ne pouvez pas publiez un événement sans avoir corrigé les problèmes " +"qu'il contient ({})." + +#: agenda_culturel/views/event_views.py:169 msgid "" "Changes will be visible on a local copy of the event. The version identical " "to the imported source will be hidden." @@ -1552,15 +1566,15 @@ msgstr "" "Les modifications seront visibles sur une copie locale de l'événement. La " "version fidèle à la source importée sera masquée." -#: agenda_culturel/views/event_views.py:181 +#: agenda_culturel/views/event_views.py:214 msgid "The event has been successfully deleted." msgstr "L'événement a été supprimé avec succès." -#: agenda_culturel/views/event_views.py:261 +#: agenda_culturel/views/event_views.py:294 msgid "Comment" msgstr "Commentaire" -#: agenda_culturel/views/event_views.py:285 +#: agenda_culturel/views/event_views.py:318 msgid "" "The status has been successfully modified and a message has been sent to the " "person who proposed the event." @@ -1568,13 +1582,13 @@ msgstr "" "Le status a été modifié avec succès et un message a été envoyé à la personne " "qui a proposé l'événement." -#: agenda_culturel/views/event_views.py:289 +#: agenda_culturel/views/event_views.py:322 msgid "The status has been successfully modified." msgstr "Le status a été modifié avec succès." -#: agenda_culturel/views/event_views.py:319 -#: agenda_culturel/views/event_views.py:539 -#: agenda_culturel/views/event_views.py:608 +#: agenda_culturel/views/event_views.py:352 +#: agenda_culturel/views/event_views.py:572 +#: agenda_culturel/views/event_views.py:641 msgid "" "{} has not been submitted since its already known and currently into " "moderation process." @@ -1582,13 +1596,13 @@ msgstr "" "{} n'a pas été soumis car il est déjà connu et actuellement en cours de " "modération." -#: agenda_culturel/views/event_views.py:329 -#: agenda_culturel/views/event_views.py:530 -#: agenda_culturel/views/event_views.py:599 +#: agenda_culturel/views/event_views.py:362 +#: agenda_culturel/views/event_views.py:563 +#: agenda_culturel/views/event_views.py:632 msgid "{} has not been submitted since its already known: {}." msgstr "{} n'a pas été soumis car il est déjà connu: {}." -#: agenda_culturel/views/event_views.py:346 +#: agenda_culturel/views/event_views.py:379 msgid "" "This type of address is known to the calendar, so an automatic import is " "proposed." @@ -1596,7 +1610,7 @@ msgstr "" "Ce type d'adresse est connue du calendrier, alors un import automatique est " "proposé." -#: agenda_culturel/views/event_views.py:359 +#: agenda_culturel/views/event_views.py:392 msgid "" "This type of address is unknown to the agenda. As a logged-in user, you can " "still try to import the event, which may work if the page contains a google " @@ -1608,7 +1622,7 @@ msgstr "" "lorsque la page contient un lien google agenda par exemple. Dans le doute, " "privilégie une saisie manuelle." -#: agenda_culturel/views/event_views.py:370 +#: agenda_culturel/views/event_views.py:403 msgid "" "This type of address is unknown to the calendar, so we suggest that you " "enter the information for the event you wish to import, in addition to the " @@ -1618,11 +1632,11 @@ msgstr "" "informations de l'événement que tu souhaites importer, pour compléter " "l'adresse que tu nous as donnée." -#: agenda_culturel/views/event_views.py:405 +#: agenda_culturel/views/event_views.py:438 msgid "The event was created: {}." msgstr "L'événement a été créé: {}." -#: agenda_culturel/views/event_views.py:411 +#: agenda_culturel/views/event_views.py:444 msgid "" "The event has been submitted and will be published as soon as it has been " "validated by the moderation team." @@ -1630,20 +1644,20 @@ 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/event_views.py:425 +#: agenda_culturel/views/event_views.py:458 msgid "during the creation process" msgstr "pendant le processus d'import" -#: agenda_culturel/views/event_views.py:448 +#: agenda_culturel/views/event_views.py:481 msgid "A message has been sent to the person who proposed the initial event." msgstr "" "Un message a été envoyé à la personne qui a proposé l'événement initial." -#: agenda_culturel/views/event_views.py:551 +#: agenda_culturel/views/event_views.py:584 msgid "Integrating {} url(s) into our import process." msgstr "Intégration de {} url(s) dans notre processus d'import." -#: agenda_culturel/views/event_views.py:617 +#: agenda_culturel/views/event_views.py:650 msgid "Integrating {} into our import process." msgstr "Intégration de {} dans notre processus d'import." @@ -1723,10 +1737,72 @@ msgstr "Les propriétés du message de contact ont été modifié avec succès." msgid "Spam has been successfully deleted." msgstr "Le spam a été supprimé avec succès" -#: agenda_culturel/views/moderation_views.py:43 +#: agenda_culturel/views/moderation_views.py:44 msgid "The event {} has been moderated with success." msgstr "L'événement {} a été modéré avec succès." +#: agenda_culturel/views/moderation_views.py:152 +msgid "" +"There are several versions of this event, and you're moderating a version " +"that isn't the one being promoted. Most of the time, you don't need to do " +"this, just move on to the next one." +msgstr "" +"Cet événement existe en plusieurs versions, et vous êtes en train de modérer " +"une version qui n'est pas celle mise en avant. C'est la plupart du temps " +"inutile de le faire, vous pouvez passer au suivant." + +#: agenda_culturel/views/moderation_views.py:160 +msgid "" +"This event exists in several versions, and has no highlighted version. You " +"should correct this situation before moderating only the " +"selected event." +msgstr "" +"Cet événement existe en plusieurs versions, et n'a pas de version mise en " +"avant. Vous devriez corriger cette situation avant de " +"modérer uniquement l'événement retenu." + +#: agenda_culturel/views/moderation_views.py:173 +msgid "" +"This event is synchronized to a source, and has properties that prevent it " +"from being published as is ({}). We've redirected your moderation to event " +"editing to correct these problems before publication." +msgstr "" +"Cet événement est synchronisé sur une source, et comporte des propriétés " +"qui l'empêchent d'être publié en l'état ({}). On a redirigé ta modération " +"vers l'édition de l'événement afin de corriger ces problèmes avant " +"publication." + +#: agenda_culturel/views/moderation_views.py:185 +msgid "" +"The event is synchronized to a source and is not publishable as is ({}), " +"but there is local version that is publishable. You may " +"wish to modify the highlighted event." +msgstr "" +"L'événement est synchronisé sur une source et n'est pas publiable en l'état " +"({}), mais il existe une version locale qui est " +"publiable. Vous pourriez modifier l'événement mis en avant." + +#: agenda_culturel/views/moderation_views.py:192 +msgid "" +"The event is synchronized on a source and is not publishable as is ({}), " +"and the local version is not publishable ({}). You should " +"first fix it, then modify the event " +"displayed." +msgstr "" +"L'événement est synchronisé sur la source et n'est pas publiable en l'état " +"({}), et il la version locale n'est pas publiable ({}). " +"Vous devriez d'abord la corriger, puis modifier l'événement mis en avant." + +#: agenda_culturel/views/moderation_views.py:199 +msgid "" +"Simple moderation is not available as the event is not publishable in its " +"current state ({}). We therefore switch to editing mode." +msgstr "" +"La modération simple n'est pas disponible car l'événement n'est pas " +"publiable dans son état actuel ({}). Nous passons donc en mode édition." + #: agenda_culturel/views/organisations_views.py:78 msgid "The organisation has been successfully updated." msgstr "L'organisme a été modifié avec succès." diff --git a/src/agenda_culturel/models/event.py b/src/agenda_culturel/models/event.py index e127e62..6816c19 100644 --- a/src/agenda_culturel/models/event.py +++ b/src/agenda_culturel/models/event.py @@ -37,7 +37,11 @@ from ..models.utils import remove_accents from ..models.configuration import SiteConfiguration from ..calendar import CalendarDay from ..import_tasks.extractor import Extractor - +from .constants import ( + TITLE_ISSUE_DATE_IMPORTATION, + TITLE_ISSUE_TIME_IMPORTATION, + PUBLICATION_ISSUE, +) logger = logging.getLogger(__name__) @@ -1792,3 +1796,19 @@ class Event(models.Model): def get_count_modifications(when_list): return [Event.get_count_modification(w) for w in when_list] + + @classmethod + def get_title_publication_issues(cls, title): + result = [] + if TITLE_ISSUE_DATE_IMPORTATION in title: + result.append(PUBLICATION_ISSUE.DATE_IMPORTATION_IN_TITLE) + if TITLE_ISSUE_TIME_IMPORTATION in title: + result.append(PUBLICATION_ISSUE.TIME_IMPORTATION_IN_TITLE) + + return result + + def get_publication_issues(self): + return Event.get_title_publication_issues(self.title) + + def has_publication_issues(self): + return len(self.get_publication_issues()) > 0 diff --git a/src/agenda_culturel/templates/agenda_culturel/duplicate-diff-inc.html b/src/agenda_culturel/templates/agenda_culturel/duplicate-diff-inc.html index cfa8582..4912b27 100644 --- a/src/agenda_culturel/templates/agenda_culturel/duplicate-diff-inc.html +++ b/src/agenda_culturel/templates/agenda_culturel/duplicate-diff-inc.html @@ -43,8 +43,15 @@ {% endfor %}
  • État : - {% if e.pure_import %}version fidèle à la source importée{% endif %} - {% if e.local_version %}version modifiée localement{% endif %} + {% if e.pure_import %} + version fidèle à la source importée + {% else %} + {% if e.local_version %} + version modifiée localement + {% else %} + version créée localement + {% endif %} + {% endif %}
  • {% with e.get_import_messages as messages %} diff --git a/src/agenda_culturel/templates/agenda_culturel/edit-buttons-inc.html b/src/agenda_culturel/templates/agenda_culturel/edit-buttons-inc.html index 564100e..4f4ff9d 100644 --- a/src/agenda_culturel/templates/agenda_culturel/edit-buttons-inc.html +++ b/src/agenda_culturel/templates/agenda_culturel/edit-buttons-inc.html @@ -1,40 +1,44 @@ {% load utils_extra %} -{% if event.moderated_date %} - modérer de nouveau {% picto_from_name "check-square" %} -{% else %} - modérer {% picto_from_name "check-square" %} -{% endif %} -{% if event.pure_import %} - {% with event.get_local_version as local %} - {% if local %} - Voir la version locale {% picto_from_name "eye" %} +{% with event.has_publication_issues as pub_issues %} + {% if not pub_issues %} + {% if event.moderated_date %} + modérer de nouveau {% picto_from_name "check-square" %} {% else %} - {% if user.userprofile.is_moderation_expert %} - modifier & modérer {% picto_from_name "edit-3" %} - {% endif %} + modérer {% picto_from_name "check-square" %} {% endif %} - {% endwith %} -{% else %} - modifier & modérer {% picto_from_name "edit-3" %} -{% endif %} -{% if event.is_updateable %} - réimporter {% picto_from_name "download-cloud" %} -{% endif %} -{% if event.status == "draft" and details == 1 %} - publier {% picto_from_name "eye" %} -{% endif %} -{% if event.status == "trash" %} - {% if details == 1 %} - restaurer {% picto_from_name "eye" %} {% endif %} -{% else %} - supprimer {% picto_from_name "trash-2" %} -{% endif %} -{% if event.status == "trash" %} - supprimer définitivement {% picto_from_name "x-circle" %} -{% endif %} -{% if details == 1 %} - dupliquer {% picto_from_name "copy" %} -{% endif %} + {% if event.pure_import %} + {% with event.get_local_version as local %} + {% if local %} + Voir la version locale {% picto_from_name "eye" %} + {% else %} + {% if user.userprofile.is_moderation_expert %} + modifier & modérer {% picto_from_name "edit-3" %} + {% endif %} + {% endif %} + {% endwith %} + {% else %} + modifier & modérer {% picto_from_name "edit-3" %} + {% endif %} + {% if event.is_updateable %} + réimporter {% picto_from_name "download-cloud" %} + {% endif %} + {% if event.status == "draft" and details == 1 and not pub_issues %} + publier {% picto_from_name "eye" %} + {% endif %} + {% if event.status == "trash" %} + {% if details == 1 %} + restaurer {% picto_from_name "eye" %} + {% endif %} + {% else %} + supprimer {% picto_from_name "trash-2" %} + {% endif %} + {% if event.status == "trash" %} + supprimer définitivement {% picto_from_name "x-circle" %} + {% endif %} + {% if details == 1 %} + dupliquer {% picto_from_name "copy" %} + {% endif %} +{% endwith %} diff --git a/src/agenda_culturel/templates/agenda_culturel/event_form.html b/src/agenda_culturel/templates/agenda_culturel/event_form.html index 97f74d3..539e4dc 100644 --- a/src/agenda_culturel/templates/agenda_culturel/event_form.html +++ b/src/agenda_culturel/templates/agenda_culturel/event_form.html @@ -146,6 +146,15 @@ {% endif %} {% endif %} + {% if event.has_publication_issues %} +
    + Attention, l'événement n'est pas publiable en l'état : + {% for i in event.get_publication_issues %} + {{ i }} + {% if not forloop.last %},{% endif %} + {% endfor %} +
    + {% endif %} {% csrf_token %} {{ form.media }} {{ form }} diff --git a/src/agenda_culturel/urls.py b/src/agenda_culturel/urls.py index ec96d82..6fcb760 100644 --- a/src/agenda_culturel/urls.py +++ b/src/agenda_culturel/urls.py @@ -251,12 +251,12 @@ urlpatterns = [ EventUpdateForceView.as_view(), name="edit_event_force", ), - path( + path( # clone function used to create an independant copy "event//simple-clone/edit", EventCreateIndependantView.as_view(), name="simple_clone_edit", ), - path( + path( # clone function to have a local version of the event, thus modify it "event//clone/edit", EventCreateLocalView.as_view(), name="clone_edit", diff --git a/src/agenda_culturel/views/moderation_views.py b/src/agenda_culturel/views/moderation_views.py index 53a96c7..584e162 100644 --- a/src/agenda_culturel/views/moderation_views.py +++ b/src/agenda_culturel/views/moderation_views.py @@ -4,13 +4,14 @@ from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin from django.contrib.messages.views import SuccessMessageMixin from django.http import Http404, HttpResponseRedirect -from django.shortcuts import render +from django.shortcuts import render, redirect from django.urls import reverse_lazy from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django.views.generic import UpdateView from django.db.models import Q, F from django.utils.timezone import datetime +from django.contrib import messages from ..forms import EventModerateForm from ..models import Event @@ -106,6 +107,109 @@ class EventModerateView( else: return self.object.get_absolute_url() + def dispatch(self, request, *args, **kwargs): + self.object = self.get_object() + + msg = False + if ( + self.object.other_versions is not None + and self.object.other_versions.nb_duplicated() > 1 + ): + representative = self.object.other_versions.representative + if representative is not None: + if representative != self.object: + msg = True + messages.warning( + request, + mark_safe( + _( + "There are several versions of this event, and you're moderating a version that isn't the one being promoted. Most of the time, you don't need to do this, just move on to the next one." + ) + ), + ) + else: + msg = True + messages.warning( + request, + mark_safe( + _( + 'This event exists in several versions, and has no highlighted version. You should correct this situation before moderating only the selected event.' + ).format( + reverse_lazy( + "fix_duplicate", + kwargs={"pk": self.object.other_versions.pk}, + ) + ) + ), + ) + + issues = self.object.get_publication_issues() + print([str(i) for i in issues]) + if len(issues) > 0 and not msg: + if self.object.pure_import: + lv = self.object.get_local_version() + if lv is None: + messages.warning( + request, + mark_safe( + _( + "This event is synchronized to a source, and has properties that prevent it from being published as is ({}). We've redirected your moderation to event editing to correct these problems before publication." + ).format(", ".join([str(i) for i in issues])) + ), + ) + # clone edit + return redirect( + reverse_lazy("clone_edit", kwargs={"pk": self.object.pk}) + ) + else: + # msg is False, thus representative = self.object. Strange configuration. Anyway... + issues_lv = lv.get_publication_issues() + if len(issues_lv) == 0: + messages.warning( + request, + mark_safe( + _( + 'The event is synchronized to a source and is not publishable as is ({}), but there is local version that is publishable. You may wish to modify the highlighted event.' + ).format( + ", ".join([str(i) for i in issues]), + lv.get_absolute_url(), + reverse_lazy("fix_duplicate"), + kwargs={"pk": self.object.other_versions.pk}, + ) + ), + ) + else: + messages.warning( + request, + mark_safe( + _( + 'The event is synchronized on a source and is not publishable as is ({}), and the local version is not publishable ({}). You should first fix it, then modify the event displayed.' + ).format( + ", ".join([str(i) for i in issues]), + lv.get_absolute_url(), + ", ".join([str(i) for i in issues_lv]), + reverse_lazy("edit_event", kwargs={"pk": lv.pk}), + reverse_lazy( + "fix_duplicate", + kwargs={"pk": self.object.other_versions.pk}, + ), + ) + ), + ) + else: + messages.info( + request, + mark_safe( + _( + "Simple moderation is not available as the event is not publishable in its current state ({}). We therefore switch to editing mode." + ).format(", ".join([str(i) for i in issues])) + ), + ) + return redirect( + reverse_lazy("edit_event", kwargs={"pk": self.object.pk}) + ) + return super().dispatch(request, *args, **kwargs) + class EventModerateNextView(EventModerateView): def get_context_data(self, **kwargs):