From 84ce4b0d7d1a4012e27c560bcba7173519826f2d Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Fri, 27 Dec 2024 00:09:17 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20de=20la=20gestion=20des=20i?= =?UTF-8?q?mages:=20-=20t=C3=A9l=C3=A9chargement=20des=20images=20si=20ell?= =?UTF-8?q?es=20sont=20manquantes=20-=20utilisation=20d'un=20nom=20de=20fi?= =?UTF-8?q?chier=20local=20pour=20=C3=A9viter=20les=20collisions=20-=20mis?= =?UTF-8?q?e=20=C3=A0=20jour=20des=20images=20lors=20de=20la=20mise=20?= =?UTF-8?q?=C3=A0=20jour=20d'un=20=C3=A9v=C3=A9nement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/agenda_culturel/models.py | 21 ++++++++++++++++++--- src/agenda_culturel/views.py | 4 ++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index 7ab160b..c6071c5 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -13,6 +13,8 @@ from django.core.cache import cache from django.core.cache.utils import make_template_fragment_key from django.contrib.auth.models import User, AnonymousUser import emoji +from django.core.files.storage import default_storage +import uuid import hashlib import urllib.request @@ -935,19 +937,28 @@ class Event(models.Model): def is_representative(self): return self.other_versions is None or self.other_versions.representative == self + def download_missing_image(self): + if self.local_image and not default_storage.exists(self.local_image.name): + logger.warning("on dl") + self.download_image() + self.save(update_fields=["local_image"]) + def download_image(self): # first download file a = urlparse(self.image) basename = os.path.basename(a.path) + ext = basename.split('.')[-1] + filename = "%s.%s" % (uuid.uuid4(), ext) + try: tmpfile, _ = urllib.request.urlretrieve(self.image) except: return None # if the download is ok, then create the corresponding file object - self.local_image = File(name=basename, file=open(tmpfile, "rb")) + self.local_image = File(name=filename, file=open(tmpfile, "rb")) def add_pending_organisers(self, organisers): self.pending_organisers = organisers @@ -1114,7 +1125,7 @@ class Event(models.Model): self.update_recurrence_dtstartend() # if the image is defined but not locally downloaded - if self.image and not self.local_image: + if self.image and (not self.local_image or not default_storage.exists(self.local_image.name)): self.download_image() # remove "/" from tags @@ -1170,7 +1181,6 @@ class Event(models.Model): for is_auth in [False, True]: key = make_template_fragment_key("event_body", [is_auth, self]) cache.delete(key) - logger.warning("on passe par le save") # then if its a clone, update the representative if clone: @@ -1564,9 +1574,14 @@ class Event(models.Model): same_imported.other_versions.representative = None same_imported.other_versions.save() # we only update local information if it's a pure import and has no moderated_date + new_image = same_imported.image != event.image same_imported.update(event, pure and same_imported.moderated_date is None) same_imported.set_in_importation_process() same_imported.prepare_save() + # fix missing or updated files + if same_imported.local_image and (not default_storage.exists(same_imported.local_image.name) or new_image): + same_imported.download_image() + same_imported.save(update_fields=["local_image"]) to_update.append(same_imported) else: # otherwise, the new event possibly a duplication of the remaining others. diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index 99f2052..6474766 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -496,6 +496,8 @@ class EventDetailView(UserPassesTestMixin, DetailView, ModelFormMixin): def get_object(self): o = super().get_object() + logger.warning(">>>> details") + o.download_missing_image() y = self.kwargs["year"] m = self.kwargs["month"] d = self.kwargs["day"] @@ -516,7 +518,6 @@ class EventDetailView(UserPassesTestMixin, DetailView, ModelFormMixin): return self.form_invalid(form) def form_valid(self, form): - logger.warning("on form valide") message = form.save(commit=False) message.user = self.request.user message.related_event = self.get_object() @@ -524,7 +525,6 @@ class EventDetailView(UserPassesTestMixin, DetailView, ModelFormMixin): message.spam = False message.closed = True message.save() - logger.warning("on save " + str(message)) return super().form_valid(form)