From b9c63219bba09ff566fa40e0e2914d63932f602a Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Thu, 15 Aug 2024 15:54:44 +0200 Subject: [PATCH] =?UTF-8?q?On=20s=C3=A9pare=20import=20et=20renseignement?= =?UTF-8?q?=20=C3=A0=20la=20main=20des=20=C3=A9v=C3=A9nements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/agenda_culturel/forms.py | 8 +++ src/agenda_culturel/static/style.scss | 5 +- .../templates/agenda_culturel/event_form.html | 20 +++++++- .../agenda_culturel/event_import.html | 34 +++++++++++++ .../templates/agenda_culturel/import.html | 27 +++------- src/agenda_culturel/urls.py | 4 +- src/agenda_culturel/views.py | 49 +++++++++++++++++-- 7 files changed, 119 insertions(+), 28 deletions(-) create mode 100644 src/agenda_culturel/templates/agenda_culturel/event_import.html diff --git a/src/agenda_culturel/forms.py b/src/agenda_culturel/forms.py index eb53964..d3bd6c9 100644 --- a/src/agenda_culturel/forms.py +++ b/src/agenda_culturel/forms.py @@ -23,6 +23,7 @@ from .models import ( ModerationAnswer, ModerationQuestion, Place, + Category, ) from django.utils.translation import gettext_lazy as _ from string import ascii_uppercase as auc @@ -39,6 +40,13 @@ logger = logging.getLogger(__name__) class URLSubmissionForm(Form): url = URLField(max_length=512) + category = ModelChoiceField( + label=_("Category"), + queryset=Category.objects.all().order_by("name"), + empty_label=_("Unknown"), + required=False, + ) + class DynamicArrayWidgetURLs(DynamicArrayWidget): diff --git a/src/agenda_culturel/static/style.scss b/src/agenda_culturel/static/style.scss index c8296b9..d4dde76 100644 --- a/src/agenda_culturel/static/style.scss +++ b/src/agenda_culturel/static/style.scss @@ -18,6 +18,9 @@ $enable-responsive-typography: true; [role="button"] { margin: 0.1em 0; } +[role="button"].large { + width: 100%; +} :root { --spacing: 0.4rem; @@ -442,7 +445,7 @@ $yellow-900: #616918 !default; background-size: $iconsize auto; padding-left: calc(var(--form-element-spacing-vertical) * 2 + #{$iconsize}); } -.message.danger { +.message.danger, .message.error { --background-color: #{$red-50}; --icon: var(--icon-invalid); --color: #{$red-900}; diff --git a/src/agenda_culturel/templates/agenda_culturel/event_form.html b/src/agenda_culturel/templates/agenda_culturel/event_form.html index 3fdd95f..adfecf3 100644 --- a/src/agenda_culturel/templates/agenda_culturel/event_form.html +++ b/src/agenda_culturel/templates/agenda_culturel/event_form.html @@ -2,7 +2,17 @@ {% load static %} -{% block title %}Modifier {{ object.title }}{% endblock %} +{% block title %} +{% if object %} +Édition de l'événement {{ object.title }} ({{ object.start_day }}) +{% else %} + {% if from_import %} + Ajuster l'événement importé + {% else %} + Ajouter un événement + {% endif %} +{% endif %} +{% endblock %} {% block entete_header %} @@ -21,6 +31,7 @@ {% endblock %} +{% block fluid %}{% endblock %} {% block content %} @@ -32,7 +43,12 @@ {% if object %}

Édition de l'événement {{ object.title }} ({{ object.start_day }})

{% else %} -

Édition de l'événement importé

+ {% if from_import %} +

Ajuster l'événement importé

+ {% else %} +

Ajouter un événement

+

Si l'événement est déjà décrit en ligne (par exemple sur Facebook), vous pouvez tenter un import automatique.

+ {% endif %} {% endif %} diff --git a/src/agenda_culturel/templates/agenda_culturel/event_import.html b/src/agenda_culturel/templates/agenda_culturel/event_import.html new file mode 100644 index 0000000..26bd6a2 --- /dev/null +++ b/src/agenda_culturel/templates/agenda_culturel/event_import.html @@ -0,0 +1,34 @@ +{% extends "agenda_culturel/page.html" %} + +{% block title %}Ajouter un événement{% endblock %} + +{% load cat_extra %} + + +{% block entete_header %} + {% css_categories %} +{% endblock %} + +{% block fluid %}{% endblock %} + + +{% block content %} +
+
+

Ajouter un événement

+ {% url 'event_import' as local_url %} + {% include "agenda_culturel/static_content.html" with name="import_proxy" url_path=local_url %} +
+ +

On peut importer automatiquement un événement depuis d'autres sites internet (principalement depuis Facebook pour + l'instant), à partir de l'adresse (url) de la page de l'événement. +

+ Importer depuis une url + +

Si l'événement n'est pas disponible en ligne, ou si l'import ne fonctionne pas, on peut + ajouter un événement en utilisant un formulaire complet. +

+ Remplir le formulaire d'événement + +
+{% endblock %} \ No newline at end of file diff --git a/src/agenda_culturel/templates/agenda_culturel/import.html b/src/agenda_culturel/templates/agenda_culturel/import.html index 433c99e..92318fb 100644 --- a/src/agenda_culturel/templates/agenda_culturel/import.html +++ b/src/agenda_culturel/templates/agenda_culturel/import.html @@ -23,17 +23,11 @@ {% block content %} -

Ajouter un événement

-
-
-{% url 'event_import_form' as local_url %} -{% include "agenda_culturel/static_content.html" with name="import" url_path=local_url %} -
-
-

Ajout automatique

-

Si l'événement est déjà en ligne sur un autre site internet, on essaye de l'importer...

+

Importer un événement

+ {% url 'event_import_form' as local_url %} + {% include "agenda_culturel/static_content.html" with name="import" url_path=local_url %}
@@ -42,22 +36,13 @@ {{ form.as_p }}
+ +

Si l'import automatique ne marche pas, ou si l'événement n'est pas en ligne, vous pouvez + tout de même ajouter l'événement en le décrivant sur la page d'ajout d'événement.

Veuillez patienter, lien en cours d'importation...
-
-
-

Ajout manuel

-

Si l'import automatique ne marche pas, ou si l'événement n'est pas en ligne, vous pouvez l'ajouter en remplissant le - formulaire ci-dessous.

-
- -
{% csrf_token %} - {{ form_event.as_p }} - -
-
{% endblock %} diff --git a/src/agenda_culturel/urls.py b/src/agenda_culturel/urls.py index dc3c1c1..c550fa1 100644 --- a/src/agenda_culturel/urls.py +++ b/src/agenda_culturel/urls.py @@ -37,7 +37,9 @@ urlpatterns = [ name="set_duplicate", ), path("event//moderate", EventModerateView.as_view(), name="moderate_event"), - path("ajouter", import_from_url, name="add_event"), + path("ajouter", import_event_proxy, name="add_event"), + path("ajouter/url", import_from_url, name="add_event_url"), + path("ajouter/details", EventCreateView.as_view(), name="add_event_details"), path("admin/", admin.site.urls), path("accounts/", include("django.contrib.auth.urls")), path("test_app/", include("test_app.urls")), diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index 9944191..aae17cc 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -518,13 +518,45 @@ def change_status_event(request, pk, status): {"status": status, "event": event, "cancel_url": cancel_url}, ) +def import_event_proxy(request): + return render(request, "agenda_culturel/event_import.html") + +class EventCreateView(SuccessMessageMixin, CreateView): + model = Event + success_url = reverse_lazy("home") + success_message = _("The event has been submitted and will be published as soon as it has been validated by the moderation team.") + form_class = EventForm + + +def import_from_details(request): + form = EventForm(request.POST, is_authenticated=request.user.is_authenticated) + if form.is_valid(): + new_event = form.save() + if request.user.is_authenticated: + messages.success(request, _("The event is saved.")) + return HttpResponseRedirect(new_event.get_absolute_url()) + else: + messages.success( + request, + _( + "The event has been submitted and will be published as soon as it has been validated by the moderation team." + ), + ) + return HttpResponseRedirect(reverse("home")) + else: + return render( + request, "agenda_culturel/event_form.html", context={"form": form} + ) + def import_from_url(request): import logging logging.getLogger(__name__) + # if a form has been sent and contains an event if request.method == "POST" and "title" in request.POST: + # the result of this form is checked form = EventForm(request.POST, is_authenticated=request.user.is_authenticated) if form.is_valid(): new_event = form.save() @@ -555,20 +587,25 @@ def import_from_url(request): form_event = EventForm(initial=initial) + # if the form has been sent if request.method == "POST": form = URLSubmissionForm(request.POST) + # if the form is valid if form.is_valid(): + # the url is cleaned cd = form.cleaned_data url = cd.get("url") url = Extractor.clean_url(url) + # we check if the url is known existing = Event.objects.filter(uuids__contains=[url]) - + # if it's unknown if len(existing) == 0: event = None - + # we import it + logger.warning('on url2event') u2e = URL2Events(ChromiumHeadlessDownloader(), single_event=True) events_structure = u2e.process( url, published=request.user.is_authenticated @@ -582,6 +619,12 @@ def import_from_url(request): events_structure["events"][0], events_structure["header"]["url"], ) + + # add a category if the user selected one + if event.category is None or event.category == Category.get_default_category(): + if cd.get("category") is not None: + event.category = cd.get("category") + # TODO: use celery to import the other events if event is not None: @@ -599,7 +642,7 @@ def import_from_url(request): return render( request, "agenda_culturel/event_form.html", - context={"form": form}, + context={"form": form, "from_import": True}, ) else: form = EventForm(