""" Naše typy objektů v galeriích. V databázi jsou všechny v jedné tabulce, protože se liší jen prezentací navenek. Všechny implementují ~~rozhraní~~ ABC `ZobrazitelnyBazmek`. Doporučené použití: TODO """ import abc from datetime import datetime from django.utils.safestring import mark_safe, SafeString from django.utils.html import format_html, format_html_join from imagekit import ImageSpec from imagekit.cachefiles import ImageCacheFile from imagekit.processors import ResizeToFit, Transpose HTML = str | SafeString from galerie.models import Obrazek as DbObrazek class ZobrazitelnyBazmek(abc.ABC): def __init__(self, db_objekt): self.db_objekt = db_objekt # zkratka self.soubor = db_objekt.soubor # Volá se z templatetagu @abc.abstractmethod def zobrazit(self, **kwargs) -> HTML: """To, co se zobrazí v galerii jako hlavní obrázek (při prohlížení konkrétního obrázku a jako tittulní obrázek u galerií, které nemají vlastní obrázky (kupř. Vávrovka 2015))""" ... @abc.abstractmethod def zmenseny_nahled(self, **kwargs) -> HTML: """Zmenšené obrázky v přehledu obrázků a pod hlavním obrázkem (předchozí/následující)""" ... @property #@abc.abstractmethod def cas_porizeni(self) -> datetime | None: # TODO: použít tohle na automatické řazení věcí. Má vytáhnout datum z metadat raise NotImplementedError("Prosím, naimplementuj hledání času vzniku v metadatech (nebo vrať None).") #TODO: nativní rozměry? ### Obrázky ### # Odpovídá původnímu chování (bo se mi nechce vymýšlet novoty… class ObrazekStredniSpec(ImageSpec): """Specifikace obrázku pro velké zobrazení""" processors = [ Transpose(Transpose.AUTO), # Rotuj podle dat v EXIFu ResizeToFit(900, 675, upscale=False), ] format = 'JPEG' options = {'quality': 95} # Proč tolik? class ObrazekMalySpec(ImageSpec): """Specifikace obrázku pro náhledy (pod hlavním obrázkem nebo v přehledu galerie)""" processors = [ Transpose(Transpose.AUTO), ResizeToFit(167, 167, upscale=False), ] format = 'JPEG' options = {'quality': 95} class Obrazek(ZobrazitelnyBazmek): """Obrázek pro zobrazení Použije některý z ImageSpec-ů jako popis transformace a ImageCacheFile pro uložení výsledného obrázku. Reference: https://django-imagekit.readthedocs.io/en/latest/#defining-specs-outside-of-models Reference: https://django-imagekit.readthedocs.io/en/latest/caching.html """ def zobrazit(self, **kwargs): # Jak se takový cachefile používá je potřeba vyčíst ze zdrojáků? file = ImageCacheFile(ObrazekStredniSpec(source=self.soubor)) file.generate() attrs = format_html_join(' ', r'{}="{}"', ((mark_safe(k), v) for k, v in kwargs.items())) html = format_html(r'', file.url, attrs) return html def zmenseny_nahled(self, **kwargs): file = ImageCacheFile(ObrazekMalySpec(source=self.soubor)) file.generate() attrs = format_html_join(' ', r'{}="{}"', ((mark_safe(k), v) for k, v in kwargs.items())) html = format_html(r'', file.url, attrs) return html class Video(ZobrazitelnyBazmek): ... class DummyBazmek(ZobrazitelnyBazmek): def zobrazit(self, **kwargs): return r'Tohle zobrazit neumím :-(' def zmenseny_nahled(self, **kwargs): return r'Tohle zobrazit neumím :-(' def tipniTyp(soubor) -> DbObrazek.Typ: ...