from django.db import models #from django.db.models import Q from imagekit.models import ImageSpecField from imagekit.processors import ResizeToFit, Transpose import os from soustredeni.models import Soustredeni VZDY=0 ORG=1 NIKDY=2 UCASTNIK=3 VIDITELNOST = ( (VZDY, 'Vždy'), (ORG, 'Organizátorům'), (UCASTNIK, 'Účastníkům a orgům'), (NIKDY, 'Nikdy'), ) # tyhle funkce jsou tady jen kvůli starým migracím, které se na ně odkazují # až se ty migrace někdy squashnou, tak by mělo být možné funkce smazat def obrazek_filename_maly(): pass def obrazek_filename_stredni(): pass def obrazek_filename(): pass def obrazek_filename_velky(): pass def galerie_filename(self, filename): gal = self.galerie cislo_gal = gal.pk # najdi kořenovou galerii while (gal.galerie_up): gal = gal.galerie_up # soustředění je v cestě jen pokud galerie pod nějaké patří cesta = ( ['Galerie'] + (["soustredeni_{}".format(gal.soustredeni.pk)] if gal.soustredeni else []) + ["galerie_{}".format(cislo_gal), self.nazev] ) return os.path.join(*cesta) # Technicky misnomer: takový `Obrazek` může být i videjko a výhledově i něco dalšího… class Obrazek(models.Model): # „originál“ (modulo max. velikost uploadu na web FIXME!) soubor = models.FileField(upload_to=galerie_filename, help_text = "Lze vložit libovolně velký obrázek. Ideální je, aby alespoň jeden rozměr měl alespoň 500px.") class Typ(models.TextChoices): OBRAZEK = 'obrazek', 'Obrázek' VIDEO = 'video', 'Video' NEVIM = 'nevim', 'Neznámý typ' typ = models.CharField('Typ', max_length=16, blank=False, null=False, choices=Typ.choices, default=Typ.NEVIM) # Filename by default; slouží k řazení nazev = models.CharField('Název', max_length=50, blank=True, null=True) # ~~Rádoby~~ vtipný popisek od orgů popis = models.TextField('Popis', blank=True, null=True) datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add=True) galerie = models.ForeignKey('Galerie', blank=True, null=True, on_delete=models.CASCADE) # Primární klíč k řazení pro overridování řazení podle názvu poradi = models.IntegerField('Pořadí', blank=True, null=True) def __str__(self): return f'Obrázek {self.nazev} ({self.soubor.name})' class Meta: verbose_name = 'Obrázek' verbose_name_plural = 'Obrázky' ordering = ['nazev'] #FIXME: zohlednit pořadí a asi i příslušnost ke galerii def save(self, *args, **kwargs): # obrázek potřebuje název, protože se z něj generuje cesta pro jeho uložení # (a pak se podle něj taky řadí) if self.nazev is None: self.nazev = os.path.basename(self.soubor.name) super(Obrazek, self).save(*args, **kwargs) def jako_bazmek(self): """ Hlavní metoda pro dělání `galerie.typy.ZobrazitelnyBazmek` z DB objektů """ import galerie.typy as typy # pozor, cyklí! match self.typ: case self.Typ.OBRAZEK: return typy.Obrazek(self) case self.Typ.VIDEO: return typy.Video(self) case self.Typ.NEVIM: return typy.DummyBazmek(self) case _: raise ValueError("Neznámý typ obrázku, bug v kódu!") class Galerie(models.Model): nazev = models.CharField('Název', max_length=100) datum_vytvoreni = models.DateTimeField('Datum vytvoření', auto_now_add = True) datum_zmeny = models.DateTimeField('Datum poslední změny', auto_now = True) popis = models.TextField('Popis', blank = True, null = True) titulni_obrazek = models.ForeignKey(Obrazek, blank = True, null = True, related_name = "+", on_delete = models.SET_NULL) zobrazit = models.IntegerField('Zobrazit?', default = ORG, choices = VIDITELNOST) galerie_up = models.ForeignKey('Galerie', blank = True, null = True, on_delete=models.PROTECT) soustredeni = models.ForeignKey(Soustredeni, blank = True, null = True, on_delete=models.PROTECT) poradi = models.IntegerField('Pořadí', blank = True, null = False, default = 0) def __str__(self): return self.nazev class Meta: verbose_name = 'Galerie' verbose_name_plural = 'Galerie'