diff --git a/src/agenda_culturel/celery.py b/src/agenda_culturel/celery.py index 244d3a3..247bf52 100644 --- a/src/agenda_culturel/celery.py +++ b/src/agenda_culturel/celery.py @@ -28,7 +28,7 @@ app.autodiscover_tasks() def close_import_task(taskid, success, error_message): from agenda_culturel.models import BatchImportation - task = BatchImportation.objects.get(pk=taskid) + task = BatchImportation.objects.get(celery_id=taskid) task.status = BatchImportation.STATUS.SUCCESS if success else BatchImportation.STATUS.FAILED fields = ["status"] if not success: @@ -38,33 +38,40 @@ def close_import_task(taskid, success, error_message): @app.task(bind=True) -def import_events_from_json(self, json, taskid): +def import_events_from_json(self, json): from agenda_culturel.models import Event + from .importation import EventsImporter - logger.info("Import events from json: {}".format(taskid)) + logger.info("Import events from json: {}".format(self.request.id)) - # TODO + importer = EventsImporter(self.request.id) - success = True - error_message = "" + success, error_message = importer.import_events(json) # finally, close task - close_import_task(taskid, success, error_message) + close_import_task(self.request.id, success, error_message) @app.task(bind=True) -def import_events_from_url(self, source, browsable_url, taskid): +def import_events_from_url(self, source, browsable_url): from agenda_culturel.models import Event + from .importation import EventsImporter - logger.info("Import events from url: {} {}".format(source, taskid)) + logger.info("Import events from url: {} {}".format(source, self.request.id)) + # first get json # TODO + # then import + # importer = EventsImporter(self.request.id) + # success, error_message = importer.import_events(json) + + success = True error_message = "" # finally, close task - close_import_task(taskid, success, error_message) + close_import_task(self.request.id, success, error_message) diff --git a/src/agenda_culturel/importation.py b/src/agenda_culturel/importation.py new file mode 100644 index 0000000..6b07b52 --- /dev/null +++ b/src/agenda_culturel/importation.py @@ -0,0 +1,30 @@ +from agenda_culturel.models import Event +import json + + +class EventsImporter: + + def __init__(self, celery_id): + self.celery_id = celery_id + + + def import_events(self, json_structure): + + try: + structure = json.loads(json_structure) + + self.url = structure["header"]["url"] + self.date = structure["header"]["date"] + except: + return (False, "JSON file is not correctly structured") + + # load events + for event in structure["events"]: + self.import_event(event) + + + def import_event(self, event): + pass + + + diff --git a/src/agenda_culturel/migrations/0014_batchimportation_celery_id.py b/src/agenda_culturel/migrations/0014_batchimportation_celery_id.py new file mode 100644 index 0000000..ade369d --- /dev/null +++ b/src/agenda_culturel/migrations/0014_batchimportation_celery_id.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2023-12-23 11:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('agenda_culturel', '0013_batchimportation_error_message_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='batchimportation', + name='celery_id', + field=models.CharField(default='', max_length=128), + ), + ] diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index ed00ef9..29c2adf 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -241,3 +241,5 @@ class BatchImportation(models.Model): nb_initial = models.PositiveIntegerField(verbose_name=_('Number of collected events'), default=0) nb_imported = models.PositiveIntegerField(verbose_name=_('Number of imported events'), default=0) + + celery_id = models.CharField(max_length=128, default="") diff --git a/src/agenda_culturel/templates/agenda_culturel/imports.html b/src/agenda_culturel/templates/agenda_culturel/imports.html index 6e39324..a894c2b 100644 --- a/src/agenda_culturel/templates/agenda_culturel/imports.html +++ b/src/agenda_culturel/templates/agenda_culturel/imports.html @@ -1,4 +1,4 @@ -{% extends "agenda_culturel/page.html" %} +!<{% extends "agenda_culturel/page.html" %} {% block title %}Importations par lot{% endblock %} @@ -30,7 +30,7 @@ {{ obj.id }} {{ obj.created_date }} - {{ obj.status }} + {{ obj.status }} {% if obj.status == "running" %}Annuler{% endif %} {% endfor %} diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index 62b0617..7025123 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -32,7 +32,7 @@ from django.contrib.messages.views import SuccessMessageMixin from .calendar import CalendarMonth, CalendarWeek from .extractors import ExtractorAllURLs -from .celery import import_events_from_json, import_events_from_url +from .celery import app as celery_app, import_events_from_json, import_events_from_url import unicodedata @@ -493,14 +493,18 @@ class BatchImportationCreateView(SuccessMessageMixin, LoginRequiredMixin, Create success_message = _('The import has been run successfully.') def form_valid(self, form): - response = super().form_valid(form) + # run import if "json" in form.data and form.data["json"] is not None and form.data["json"].strip() != "": - import_events_from_json.delay(form.data["json"], self.object.id) + result = import_events_from_json.delay(form.data["json"]) else: - import_events_from_url.delay(self.object.source, self.object.browsable_url, self.object.id) + result = import_events_from_url.delay(self.object.source, self.object.browsable_url) + + # update the object with celery_id + form.instance.celery_id = result.id + + return super().form_valid(form) - return response @login_required(login_url="/accounts/login/") @@ -508,7 +512,7 @@ def cancel_import(request, pk): import_process = get_object_or_404(BatchImportation, pk=pk) if request.method == 'POST': - # TODO cancel the celery import + celery_app.control.revoke(import_process.celery_id) import_process.status = BatchImportation.STATUS.CANCELED import_process.save(update_fields=["status"])