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 %}
-
-
+
+ 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.
-
-
- 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.
-
-
-
-
{% 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(