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:
		@@ -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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user