Ajout d'une tâche pour traiter les événements soumis
This commit is contained in:
parent
00df29ef4d
commit
380271b48d
@ -1,4 +1,5 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from .models import Event
|
from .models import Event, EventSubmissionForm
|
||||||
|
|
||||||
admin.site.register(Event)
|
admin.site.register(Event)
|
||||||
|
admin.site.register(EventSubmissionForm)
|
||||||
|
@ -2,6 +2,8 @@ import os
|
|||||||
|
|
||||||
from celery import Celery
|
from celery import Celery
|
||||||
from celery.schedules import crontab
|
from celery.schedules import crontab
|
||||||
|
from celery.utils.log import get_task_logger
|
||||||
|
|
||||||
|
|
||||||
# Set the default Django settings module for the 'celery' program.
|
# Set the default Django settings module for the 'celery' program.
|
||||||
APP_ENV = os.getenv("APP_ENV", "dev")
|
APP_ENV = os.getenv("APP_ENV", "dev")
|
||||||
@ -9,6 +11,9 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", f"agenda_culturel.settings.{APP_
|
|||||||
|
|
||||||
app = Celery("agenda_culturel")
|
app = Celery("agenda_culturel")
|
||||||
|
|
||||||
|
logger = get_task_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
# Using a string here means the worker doesn't have to serialize
|
# Using a string here means the worker doesn't have to serialize
|
||||||
# the configuration object to child processes.
|
# the configuration object to child processes.
|
||||||
# - namespace='CELERY' means all celery-related configuration keys
|
# - namespace='CELERY' means all celery-related configuration keys
|
||||||
@ -20,16 +25,15 @@ app.autodiscover_tasks()
|
|||||||
|
|
||||||
|
|
||||||
@app.task(bind=True)
|
@app.task(bind=True)
|
||||||
def debug_task(self):
|
def create_event_from_submission(self, url):
|
||||||
print(f"Request: {self.request!r}")
|
logger.info(f"{url=}")
|
||||||
|
try:
|
||||||
|
logger.info("About to create event from submission")
|
||||||
|
# TODO
|
||||||
|
except BadHeaderError:
|
||||||
|
logger.info("BadHeaderError")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
|
||||||
|
|
||||||
app.conf.beat_schedule = {
|
app.conf.timezone = "Europe/Paris"
|
||||||
"delete_job_files": {
|
|
||||||
"task": "test_periodic_task",
|
|
||||||
# Every 1 minute for testing purposes
|
|
||||||
"schedule": crontab(minute="*/1"),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
app.conf.timezone = "UTC"
|
|
||||||
|
11
src/agenda_culturel/forms.py
Normal file
11
src/agenda_culturel/forms.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from django.forms import ModelForm
|
||||||
|
from django.views.generic import FormView
|
||||||
|
|
||||||
|
from .models import EventSubmissionForm
|
||||||
|
|
||||||
|
|
||||||
|
class EventSubmissionModelForm(ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = EventSubmissionForm
|
||||||
|
fields = ["url"]
|
||||||
|
|
38
src/agenda_culturel/migrations/0001_initial.py
Normal file
38
src/agenda_culturel/migrations/0001_initial.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Generated by Django 4.2.1 on 2023-10-14 16:33
|
||||||
|
|
||||||
|
import django.contrib.postgres.fields
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Event',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created_date', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('modified_date', models.DateTimeField(auto_now=True)),
|
||||||
|
('title', models.CharField(help_text='Short title', max_length=512, verbose_name='Title')),
|
||||||
|
('status', models.CharField(choices=[('published', 'Published'), ('trash', 'Trash'), ('draft', 'Draft')], default='published', max_length=20, verbose_name='Status')),
|
||||||
|
('start_day', models.DateField(help_text='Day of the event', verbose_name='Day of the event')),
|
||||||
|
('start_time', models.TimeField(blank=True, help_text='Starting time', null=True, verbose_name='Starting time')),
|
||||||
|
('end_day', models.DateField(blank=True, help_text='End day of the event, only required if different from the start day.', null=True, verbose_name='End day of the event')),
|
||||||
|
('end_time', models.TimeField(blank=True, help_text='Final time', null=True, verbose_name='Final time')),
|
||||||
|
('location', models.CharField(help_text='Address of the event', max_length=512, verbose_name='Location')),
|
||||||
|
('description', models.TextField(blank=True, help_text='General description of the event', null=True, verbose_name='Description')),
|
||||||
|
('image', models.URLField(blank=True, help_text='URL of the illustration image', null=True, verbose_name='Illustration')),
|
||||||
|
('image_alt', models.CharField(blank=True, help_text='Alternative text used by screen readers for the image', max_length=512, null=True, verbose_name='Illustration description')),
|
||||||
|
('reference_urls', django.contrib.postgres.fields.ArrayField(base_field=models.URLField(), blank=True, help_text='List of all the urls where this event can be found.', null=True, size=None, verbose_name='URLs')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Event',
|
||||||
|
'verbose_name_plural': 'Events',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,31 @@
|
|||||||
|
# Generated by Django 4.2.1 on 2023-10-15 08:51
|
||||||
|
|
||||||
|
import django.contrib.postgres.fields
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('agenda_culturel', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='EventSubmissionForm',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('url', models.URLField(help_text='URL where this event can be found.', max_length=512, verbose_name='URL')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Event submission form',
|
||||||
|
'verbose_name_plural': 'Event submissions forms',
|
||||||
|
'db_table': 'eventsubmissionform',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='event',
|
||||||
|
name='reference_urls',
|
||||||
|
field=django.contrib.postgres.fields.ArrayField(base_field=models.URLField(max_length=512), blank=True, help_text='List of all the urls where this event can be found.', null=True, size=None, verbose_name='URLs'),
|
||||||
|
),
|
||||||
|
]
|
@ -35,7 +35,7 @@ class Event(models.Model):
|
|||||||
image = models.URLField(verbose_name=_('Illustration'), help_text=_("URL of the illustration image"), max_length=200, blank=True, null=True)
|
image = models.URLField(verbose_name=_('Illustration'), help_text=_("URL of the illustration image"), max_length=200, blank=True, null=True)
|
||||||
image_alt = models.CharField(verbose_name=_('Illustration description'), help_text=_('Alternative text used by screen readers for the image'), blank=True, null=True, max_length=512)
|
image_alt = models.CharField(verbose_name=_('Illustration description'), help_text=_('Alternative text used by screen readers for the image'), blank=True, null=True, max_length=512)
|
||||||
|
|
||||||
reference_urls = ArrayField(models.URLField(max_length=200), verbose_name=_('URLs'), help_text=_("List of all the urls where this event can be found."), blank=True, null=True)
|
reference_urls = ArrayField(models.URLField(max_length=512), verbose_name=_('URLs'), help_text=_("List of all the urls where this event can be found."), blank=True, null=True)
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse("view_event", kwargs={"pk": self.pk, "extra": self.title})
|
return reverse("view_event", kwargs={"pk": self.pk, "extra": self.title})
|
||||||
@ -45,4 +45,16 @@ class Event(models.Model):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('Event')
|
verbose_name = _('Event')
|
||||||
verbose_name_plural = _('Events')
|
verbose_name_plural = _('Events')
|
||||||
|
|
||||||
|
|
||||||
|
class EventSubmissionForm(models.Model):
|
||||||
|
url = models.URLField(max_length=512, verbose_name=_('URL'), help_text=_("URL where this event can be found."))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = "eventsubmissionform"
|
||||||
|
verbose_name = _("Event submission form")
|
||||||
|
verbose_name_plural = _("Event submissions forms")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.url
|
@ -0,0 +1,15 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Proposer un événement</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Formulaire de proposition d'événement</h2>
|
||||||
|
<form method="post" action="">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form.as_p }}
|
||||||
|
<input type="submit" value="Proposer un événement">
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -11,8 +11,10 @@ urlpatterns = [
|
|||||||
path("", EventListView.as_view(), name="home"),
|
path("", EventListView.as_view(), name="home"),
|
||||||
re_path(r'^(?P<mode>' + '|'.join([dm.value for dm in DisplayModes]) + ')/$', view_interval, name='view_interval'),
|
re_path(r'^(?P<mode>' + '|'.join([dm.value for dm in DisplayModes]) + ')/$', view_interval, name='view_interval'),
|
||||||
path("event/<pk>-<extra>", EventDetailView.as_view(), name="view_event"),
|
path("event/<pk>-<extra>", EventDetailView.as_view(), name="view_event"),
|
||||||
|
path("proposer", EventSubmissionFormView.as_view(), name="event_submission_form"),
|
||||||
path("admin/", admin.site.urls),
|
path("admin/", admin.site.urls),
|
||||||
path("test_app/", include("test_app.urls")),
|
path("test_app/", include("test_app.urls")),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.views.generic import ListView, DetailView
|
from django.views.generic import ListView, DetailView, FormView
|
||||||
|
|
||||||
|
from .forms import EventSubmissionModelForm
|
||||||
|
from .celery import create_event_from_submission
|
||||||
|
|
||||||
from .models import Event
|
from .models import Event
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from enum import StrEnum
|
from enum import StrEnum
|
||||||
@ -33,4 +37,20 @@ class EventDetailView(DetailView):
|
|||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
context["now"] = timezone.now()
|
context["now"] = timezone.now()
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
class EventSubmissionFormView(FormView):
|
||||||
|
form_class = EventSubmissionModelForm
|
||||||
|
template_name = "agenda_culturel/submission.html"
|
||||||
|
success_url = "/"
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
form.save()
|
||||||
|
self.create_event(form.cleaned_data)
|
||||||
|
|
||||||
|
return super().form_valid(form)
|
||||||
|
|
||||||
|
def create_event(self, valid_data):
|
||||||
|
url = valid_data["url"]
|
||||||
|
create_event_from_submission.delay(url)
|
||||||
|
Loading…
Reference in New Issue
Block a user