Ajout d'une tâche pour traiter les événements soumis
This commit is contained in:
		@@ -1,4 +1,5 @@
 | 
			
		||||
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.schedules import crontab
 | 
			
		||||
from celery.utils.log import get_task_logger
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Set the default Django settings module for the 'celery' program.
 | 
			
		||||
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")
 | 
			
		||||
 | 
			
		||||
logger = get_task_logger(__name__)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Using a string here means the worker doesn't have to serialize
 | 
			
		||||
# the configuration object to child processes.
 | 
			
		||||
# - namespace='CELERY' means all celery-related configuration keys
 | 
			
		||||
@@ -20,16 +25,15 @@ app.autodiscover_tasks()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.task(bind=True)
 | 
			
		||||
def debug_task(self):
 | 
			
		||||
    print(f"Request: {self.request!r}")
 | 
			
		||||
def create_event_from_submission(self, url):
 | 
			
		||||
    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 = {
 | 
			
		||||
    "delete_job_files": {
 | 
			
		||||
        "task": "test_periodic_task",
 | 
			
		||||
        # Every 1 minute for testing purposes
 | 
			
		||||
        "schedule": crontab(minute="*/1"),
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.conf.timezone = "UTC"
 | 
			
		||||
app.conf.timezone = "Europe/Paris"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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_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):
 | 
			
		||||
        return reverse("view_event", kwargs={"pk": self.pk, "extra": self.title})
 | 
			
		||||
@@ -45,4 +45,16 @@ class Event(models.Model):
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        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"),
 | 
			
		||||
    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("proposer", EventSubmissionFormView.as_view(), name="event_submission_form"),
 | 
			
		||||
    path("admin/", admin.site.urls),
 | 
			
		||||
    path("test_app/", include("test_app.urls")),
 | 
			
		||||
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
if settings.DEBUG:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,9 @@
 | 
			
		||||
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 django.utils import timezone
 | 
			
		||||
from enum import StrEnum
 | 
			
		||||
@@ -33,4 +37,20 @@ class EventDetailView(DetailView):
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        context = super().get_context_data(**kwargs)
 | 
			
		||||
        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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user