102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
"""
|
|
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'<img src="{}" {} />', 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'<img src="{}" {} />', 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: ...
|