From 5a7cc080c700fd86547cc245fff0e907b71acdd8 Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau <j-marie.favreau@uca.fr> Date: Thu, 5 Dec 2024 20:52:50 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20du=20m=C3=A9canisme=20de=20?= =?UTF-8?q?mod=C3=A9ration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #236 --- src/agenda_culturel/forms.py | 3 ++ src/agenda_culturel/static/style.scss | 5 ++ .../agenda_culturel/event_form_moderate.html | 54 +++++++++---------- .../single-event/event-single-inc.html | 21 ++++++-- src/agenda_culturel/urls.py | 4 +- src/agenda_culturel/views.py | 40 +++++++++----- 6 files changed, 80 insertions(+), 47 deletions(-) diff --git a/src/agenda_culturel/forms.py b/src/agenda_culturel/forms.py index 16569d1..443a11d 100644 --- a/src/agenda_culturel/forms.py +++ b/src/agenda_culturel/forms.py @@ -367,6 +367,9 @@ class EventModerateForm(ModelForm): "exact_location", "tags" ] + widgets = { + "status": RadioSelect + } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/src/agenda_culturel/static/style.scss b/src/agenda_culturel/static/style.scss index 38fe13a..160ab9d 100644 --- a/src/agenda_culturel/static/style.scss +++ b/src/agenda_culturel/static/style.scss @@ -1465,6 +1465,11 @@ form.messages div, form.moderation-events { overflow-y: auto; } +#moderate-form #id_status { + display: grid; + grid-template-columns: repeat(3, 1fr); +} + label.required::after { content: ' *'; color: red; diff --git a/src/agenda_culturel/templates/agenda_culturel/event_form_moderate.html b/src/agenda_culturel/templates/agenda_culturel/event_form_moderate.html index 13aae3c..3352163 100644 --- a/src/agenda_culturel/templates/agenda_culturel/event_form_moderate.html +++ b/src/agenda_culturel/templates/agenda_culturel/event_form_moderate.html @@ -33,27 +33,35 @@ </p> </header> -<form method="post" enctype="multipart/form-data">{% csrf_token %} +<form method="post" enctype="multipart/form-data" id="moderate-form">{% csrf_token %} <div class="grid moderate-preview"> - {% include "agenda_culturel/single-event/event-single-inc.html" with event=event noedit=1 %} + <div> + {% include "agenda_culturel/single-event/event-single-inc.html" with event=event onlyedit=1 %} + + {% with event.get_concurrent_events as concurrent_events %} + {% if concurrent_events %} + <article> + <header> + <h2>En même temps</h2> + <p class="remarque">{% if concurrent_events|length > 1 %}Plusieurs événements se déroulent en même temps.{% else %}Un autre événement se déroule en même temps.{% endif %}</p> + </header> + <ul> + {% for e in concurrent_events %} + <li> + {{ e.category|circle_cat }} {% if e.start_time %}{{ e.start_time }}{% else %}<em>toute la journée</em>{% endif %} <a href="{{ e.get_absolute_url }}">{{ e.title }}</a> + </li> + {% endfor %} + </ul> + </article> + {% endif %} + {% endwith %} + + </div> <article> <header> - <div class="slide-buttons"> - {% with event.get_local_version as local %} - {% if local %} - {% if event != local %} - <input type="submit" value="Enregistrer et éditer la version locale" name="save_and_edit_local"> - {% else %} - <input type="submit" value="Enregistrer et éditer" name="save_and_edit"> - {% endif %} - {% else %} - <input type="submit" value="Enregistrer et créer une version locale" name="save_and_create_local"> - {% endif %} - {% endwith %} - </div> <h2>Modification des méta-informations</h2> {% if event.moderated_date %} @@ -69,23 +77,13 @@ </div> <div class="grid buttons"> {% if pred %} - <a href="{% url 'moderate_event' pred %}" role="button">🠄 Revenir au précédent</a> + <a href="{% url 'moderate_event' pred %}" class="secondary" role="button">< Revenir au précédent</a> {% else %} <a href="{% if request.META.HTTP_REFERER %}{{ request.META.HTTP_REFERER }}{% else %}{{ object.get_absolute_url }}{% endif %}" role="button" class="secondary">Annuler</a> {% endif %} <input type="submit" value="Enregistrer" name="save"> - {% with event.get_local_version as local %} - {% if local %} - {% if local == event %} - <input type="submit" value="Enregistrer et éditer la version locale" name="save_and_edit_local"> - {% else %} - <input type="submit" value="Enregistrer et éditer" name="save_and_edit"> - {% endif %} - {% else %} - <input type="submit" value="Enregistrer et créer une version locale" name="save_and_create_local"> - {% endif %} - {% endwith %} - <input type="submit" value="Enregistrer et passer au suivant 🠆" name="save_and_next"> + <input type="submit" value="Enregistrer et passer au suivant >" name="save_and_next"> + <a href="{% url 'moderate_event_next' event.pk %}" class="secondary" role="button">Passer au suivant sans enregistrer ></a> </div> </form> </article> diff --git a/src/agenda_culturel/templates/agenda_culturel/single-event/event-single-inc.html b/src/agenda_culturel/templates/agenda_culturel/single-event/event-single-inc.html index 0b5c657..8eb5f74 100644 --- a/src/agenda_culturel/templates/agenda_culturel/single-event/event-single-inc.html +++ b/src/agenda_culturel/templates/agenda_culturel/single-event/event-single-inc.html @@ -134,9 +134,24 @@ {% include "agenda_culturel/event-date-info-inc.html" %} </div> <div class="buttons"> - <a href="{% url 'export_event_ical' event.start_day.year event.start_day.month event.start_day.day event.id %}" role="button">Exporter ical {% picto_from_name "calendar" %}</a> - {% if perms.agenda_culturel.change_event and not noedit %} - {% include "agenda_culturel/edit-buttons-inc.html" with event=event with_clone=1 %} + {% if onlyedit %} + {% if event.pure_import %} + {% with event.get_local_version as local %} + {% if local %} + <a href="{{ local.get_absolute_url }}" role="button">voir la version locale {% picto_from_name "eye" %}</a> + {% else %} + <a href="{% url 'clone_edit' event.id %}" role="button">créer une copie locale {% picto_from_name "plus-circle" %}</a> + {% endif %} + {% endwith %} + {% else %} + <a href="{% url 'edit_event' event.id %}" role="button">modifier {% picto_from_name "edit-3" %}</a> + {% endif %} + + {% else %} + <a href="{% url 'export_event_ical' event.start_day.year event.start_day.month event.start_day.day event.id %}" role="button">Exporter ical {% picto_from_name "calendar" %}</a> + {% if perms.agenda_culturel.change_event and not noedit %} + {% include "agenda_culturel/edit-buttons-inc.html" with event=event with_clone=1 %} + {% endif %} {% endif %} </div> </footer> diff --git a/src/agenda_culturel/urls.py b/src/agenda_culturel/urls.py index d6f266c..fd84eff 100644 --- a/src/agenda_culturel/urls.py +++ b/src/agenda_culturel/urls.py @@ -35,8 +35,8 @@ urlpatterns = [ ), path("event/<int:pk>/edit", EventUpdateView.as_view(), name="edit_event"), path("event/<int:pk>/moderate", EventModerateView.as_view(), name="moderate_event"), - path("event/<int:pk>/moderate-next", EventModerateView.as_view(), name="moderate_event_next"), - path("event/<int:pk>/moderate-next/error", error_next_event, name="error_next_event"), + path("event/<int:pk>/moderate/after/<int:pred>", EventModerateView.as_view(), name="moderate_event_step"), + path("event/<int:pk>/moderate-next", moderate_event_next, name="moderate_event_next"), path("moderate", EventModerateView.as_view(), name="moderate"), path("event/<int:pk>/simple-clone/edit", EventUpdateView.as_view(), name="simple_clone_edit"), path("event/<int:pk>/clone/edit", EventUpdateView.as_view(), name="clone_edit"), diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index a888639..5022f28 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -356,15 +356,18 @@ class EventModerateView( permission_required = "agenda_culturel.change_event" template_name = "agenda_culturel/event_form_moderate.html" form_class = EventModerateForm - success_message = _("The event has been successfully moderated.") + + def get_success_message(self, cleaned_data): + return mark_safe(_('The event <a href="{}">{}</a> has been moderated with success.').format(self.object.get_absolute_url(), self.object.title)) + def is_moderate_next(self): - return "moderate-next" in self.request.path.split('/') + return "after" in self.request.path.split('/') def is_starting_moderation(self): return not "pk" in self.kwargs - def get_next_event(self, start_day, start_time): + def get_next_event(start_day, start_time): # select non moderated events qs = Event.objects.filter(moderated_date__isnull=True) @@ -391,19 +394,15 @@ class EventModerateView( def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) if self.is_moderate_next(): - context['pred'] = self.kwargs["pk"] + context['pred'] = self.kwargs["pred"] return context def get_object(self, queryset=None): if self.is_starting_moderation(): now = datetime.now() - return self.get_next_event(now.date(), now.time()) + return EventModerateView.get_next_event(now.date(), now.time()) else: - result = super().get_object(queryset) - if self.is_moderate_next(): - return self.get_next_event(result.start_day, result.start_time) - else: - return result + return super().get_object(queryset) def post(self, request, *args, **kwargs): try: @@ -421,10 +420,6 @@ class EventModerateView( def get_success_url(self): if 'save_and_next' in self.request.POST: return reverse_lazy("moderate_event_next", args=[self.object.pk]) - elif 'save_and_create_local' in self.request.POST: - return reverse_lazy("clone_edit", args=[self.object.pk]) - elif 'save_and_edit' in self.request.POST: - return reverse_lazy("edit_event", args=[self.object.pk]) elif 'save_and_edit_local' in self.request.POST: return reverse_lazy("edit_event", args=[self.object.get_local_version().pk]) else: @@ -443,6 +438,23 @@ def error_next_event(request, pk): {"pk": pk, "object": obj}, ) +@login_required(login_url="/accounts/login/") +@permission_required("agenda_culturel.change_event") +def moderate_event_next(request, pk): + # current event + obj = Event.objects.filter(pk=pk).first() + start_day = obj.start_day + start_time = obj.start_time + + next_obj = EventModerateView.get_next_event(start_day, start_time) + if next_obj is None: + return render( + request, + "agenda_culturel/event_next_error_message.html", + {"pk": pk, "object": obj}, + ) + else: + return HttpResponseRedirect(reverse_lazy("moderate_event_step", args=[next_obj.pk, obj.pk])) class EventDeleteView(