mamweb/galerie/models.py
2025-05-05 02:13:27 +02:00

112 lines
3.9 KiB
Python

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.obrazek_velky.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'