From 88695313c13c439485d2c2dd3cda1fb18bdc96cf Mon Sep 17 00:00:00 2001 From: LEdoian Date: Mon, 19 May 2025 01:54:27 +0200 Subject: [PATCH] =?UTF-8?q?WIP=20sort=C3=ADtko=20galeri=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit potřebuji otestovat na testwebu :-) --- galerie/models.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/galerie/models.py b/galerie/models.py index 44c1120e..8ca6125a 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -100,3 +100,32 @@ class Galerie(models.Model): class Meta: verbose_name = 'Galerie' verbose_name_plural = 'Galerie' + + # TODO: patří to spíš sem, nebo do nějakých utils? + def setrid_galerii_podle_exifu(self): + """Setřídí galerii podle data v EXIF tazích. + + Velmi experimentální, zatím pro použití jen webařem v shellu (důvod: + EXIF se trochu blbě parsuje, není jasné, jestli se má použít DateTime, + DateTimeOriginal nebo DateTimeDigitized, EXIF nemusí mít informace o + časové zóně a tenhle kód časovou zónu ignoruje, vůbec nezachovává + pořadí).""" + + from PIL import Image, ExifTags, UnidentifiedImageError + from datetime import datetime + EXIF_DATETIME_FMT = "%Y:%m:%d %H:%M:%S" + + self.obrazek_set.update(poradi=None) + for obrazek in self.obrazek_set.all(): + try: + obr = Image.open(obr) + except UnidentifiedImageError as e: + raise ValueError from e + + exif = obr.getexif() # Pokud tam není, tak si Pillow podle zdrojáků vyhaluzí prázdný. + date_str = exif.get(ExifTags.DateTime, None) or exif.get(ExifTags.DateTimeOriginal, None) or exif.get(ExifTags.DateTimeDigitized, None) + if date_str is None: continue + dt = datetime.strptime(date_str, EXIF_DATETIME_FMT) + poradi = int(dt.strftime("1%d%H%M%S")) + obrazek.poradi = poradi + obrazek.save()