From 2418a8f12bf2396d1084f0b5fe76ed4cfdf44d0d Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Mon, 28 Apr 2025 14:52:21 +0200 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20des=20imports=20multiples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #417 --- src/agenda_culturel/celery.py | 55 ++++++++++++------- src/agenda_culturel/forms.py | 19 +++++++ .../batchimportation_form.html | 34 ++++++++++++ .../views/import_batch_views.py | 3 +- 4 files changed, 91 insertions(+), 20 deletions(-) diff --git a/src/agenda_culturel/celery.py b/src/agenda_culturel/celery.py index 77965a7..efff501 100644 --- a/src/agenda_culturel/celery.py +++ b/src/agenda_culturel/celery.py @@ -458,10 +458,24 @@ def import_events_from_url( from .db_importer import DBImporterEvents if isinstance(urls, list): - url = urls[0] - is_list = True + if len(urls) > 0 and isinstance(urls[0], list): + url = urls[0][0][0] + cat = urls[0][0][1] + tags = urls[0][0][2] + if isinstance(tags, str): + tags = [tags] + user_id = urls[1] + email = urls[2] + comments = urls[3] + is_tuple = True + is_list = False + else: + url = urls[0] + is_list = True + is_tuple = False else: is_list = False + is_tuple = False url = urls with memcache_chromium_lock(self.app.oid) as acquired: @@ -489,7 +503,8 @@ def import_events_from_url( try: ## create loader - u2e = URL2Events(ChromiumHeadlessDownloader(), single_event=True) + self.chromiumDownloader.pause = True + u2e = URL2Events(self.chromiumDownloader, single_event=True) # set default values values = {} if cat is not None: @@ -528,7 +543,11 @@ def import_events_from_url( logger.error(e) close_import_task(self.request.id, False, e, importer) - return urls[1:] if is_list else True + return ( + urls[1:] + if is_list + else [urls[0][1:], user_id, email, comments] if is_tuple else True + ) # if chromium is locked, we wait 30 seconds before retrying raise self.retry(countdown=30) @@ -538,22 +557,20 @@ def import_events_from_url( def import_events_from_urls( self, urls_cat_tags, user_id=None, email=None, comments=None ): - for ucat in urls_cat_tags: - if ucat is not None: - url = None - cat = None - tags = None - if isinstance(ucat, str): - url = ucat - elif isinstance(ucat, (list, tuple)): - url = ucat[0] - cat = ucat[1] - tags = ucat[2] - if url is not None: - import_events_from_url.delay( - url, cat, tags, user_id=user_id, email=email, comments=comments - ) + print("ça chaine baby") + # run tasks as a chain + tasks = chain( + ( + import_events_from_url.s( + [urls_cat_tags, user_id, email, comments], force=True + ) + if i == 0 + else import_events_from_url.s(force=True) + ) + for i in range(len(urls_cat_tags)) + ) + tasks.delay() @app.task(base=ChromiumTask, bind=True) diff --git a/src/agenda_culturel/forms.py b/src/agenda_culturel/forms.py index c8f3f60..5e93fe0 100644 --- a/src/agenda_culturel/forms.py +++ b/src/agenda_culturel/forms.py @@ -544,6 +544,25 @@ class BatchImportationForm(Form): required=True, ) + category = ModelChoiceField( + label=_("Category"), + queryset=Category.objects.all().order_by("name"), + help_text=_("Used only if data is html."), + initial=None, + required=False, + ) + tags = MultipleChoiceField( + label=_("Tags"), + initial=None, + choices=[], + help_text=_("Used only if data is html."), + required=False, + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["tags"].choices = Tag.get_tag_groups(all=True) + class FixDuplicates(Form): required_css_class = "required" diff --git a/src/agenda_culturel/templates/agenda_culturel/batchimportation_form.html b/src/agenda_culturel/templates/agenda_culturel/batchimportation_form.html index 76cec0d..8b7f891 100644 --- a/src/agenda_culturel/templates/agenda_culturel/batchimportation_form.html +++ b/src/agenda_culturel/templates/agenda_culturel/batchimportation_form.html @@ -22,6 +22,9 @@ d'événements, enregistrer le html de la page (clic droit, enregistrer sous), puis copier le contenu de ce fichier html ci-dessous. +

+ Les champs catégorie et étiquettes seront utilisés si on utilise le format html, pour catégoriser tous les événements qui seront importés. +

{% csrf_token %} {{ form.as_p }} @@ -30,4 +33,35 @@ {% include "agenda_culturel/side-nav.html" with current="manual-import" %} + + {% endblock %} diff --git a/src/agenda_culturel/views/import_batch_views.py b/src/agenda_culturel/views/import_batch_views.py index 9609fe1..eda99eb 100644 --- a/src/agenda_culturel/views/import_batch_views.py +++ b/src/agenda_culturel/views/import_batch_views.py @@ -97,7 +97,8 @@ def add_import(request): ) # then import events from url import_events_from_urls.delay( - urls, user_id=request.user.pk if request.user else None + [(u, form.data["category"], form.data["tags"]) for u in urls], + user_id=request.user.pk if request.user else None, ) messages.success( request,