Amélioration de la gestion des images:

- téléchargement des images si elles sont manquantes
- utilisation d'un nom de fichier local pour éviter les collisions
- mise à jour des images lors de la mise à jour d'un événement
This commit is contained in:
Jean-Marie Favreau 2024-12-27 00:09:17 +01:00
parent 0d62660c2b
commit 84ce4b0d7d
2 changed files with 20 additions and 5 deletions

View File

@ -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.

View File

@ -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)