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 from galerie.utils import top_galerie VZDY=0 ORG=1 # Pozor, diskontinuita, tady bylo `NIKDY` UCASTNIK=3 # TODO: Enum! VIDITELNOST = ( (VZDY, 'Vždy'), (ORG, 'Organizátorům'), (UCASTNIK, 'Účastníkům a orgům'), ) # 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 gal = top_galerie(gal) # 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) class Soubor(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/soubor. 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('Jméno souboru', max_length=50, blank=True, null=True) # ~~Rádoby~~ vtipný popisek od orgů popis = models.TextField('Popisek', 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'Soubor {self.nazev} ({self.soubor.name})' class Meta: verbose_name = 'Soubor' verbose_name_plural = 'Soubory' db_table = 'galerie_obrazek' # FIXME: přejmenovat ordering = ['galerie', 'poradi', 'nazev'] 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().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 galerie', max_length=100, help_text='Např. "Soustředění Bratrouchov 2025" nebo "Pondělí", ukazuje se v cestičce') datum_vytvoreni = models.DateTimeField('Datum vytvoření', auto_now_add = True) datum_zmeny = models.DateTimeField('Datum poslední změny', auto_now = True) poznamka = models.TextField('neveřejná poznámka', blank = True, null = True) titulni_obrazek = models.ForeignKey(Soubor, 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' db_table = 'galerie_galerie'