WIP: refactoring, možná to teď nefunguje…

This commit is contained in:
LEdoian 2025-11-25 03:02:44 +00:00
parent d45b970f77
commit 541ea5f737
5 changed files with 29 additions and 23 deletions

View file

@ -1,13 +1,14 @@
from galerie.models import Soubor, Galerie, VZDY, ORG, NIKDY, UCASTNIK from galerie.models import Soubor, Galerie, VZDY, ORG, UCASTNIK
from django.contrib import admin from django.contrib import admin
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django import forms from django import forms
from django.db import models from django.db import models
# akction
def zverejnit_fotogalerii(modeladmin, request, queryset): def zverejnit_fotogalerii(modeladmin, request, queryset):
'''zverejni vybranou fotogalerii i jeji vsechny podgalerie''' '''zveřejní vybranou fotogalerii i její všechny podgalerie'''
# TODO: rozbíjí práva. Čistší je mít separátně práva (zobrazit:
# VŽDY/ÚČASTNÍKŮM/ORGŮM) a úpravy (bool), přičemž během úprav se zobrazuje
# jen orgům?
queryset = queryset.filter(zobrazit=ORG) queryset = queryset.filter(zobrazit=ORG)
for galerie in queryset: for galerie in queryset:
galerie.zobrazit = VZDY galerie.zobrazit = VZDY
@ -18,7 +19,7 @@ def zverejnit_fotogalerii(modeladmin, request, queryset):
def prepnout_fotogalerii_do_org_rezimu(modeladmin, request, queryset): def prepnout_fotogalerii_do_org_rezimu(modeladmin, request, queryset):
'''zneverjni vybranou fotogalerii i jeji vsechny podgalerie''' '''zneveřejni vybranou fotogalerii i její všechny podgalerie'''
queryset = queryset.filter(zobrazit=VZDY) queryset = queryset.filter(zobrazit=VZDY)
for galerie in queryset: for galerie in queryset:
galerie.zobrazit = ORG galerie.zobrazit = ORG

View file

@ -1,8 +1,8 @@
from django import forms from django import forms
class KomentarForm(forms.Form): class KomentarForm(forms.Form):
"""Formulář na přidání/úpravu popisku u souboru (obrázku)"""
komentar = forms.CharField(label = "Komentář:", max_length = 300, required=False) komentar = forms.CharField(label = "Komentář:", max_length = 300, required=False)
class NewGalerieForm(forms.Form): class NewGalerieForm(forms.Form):
nazev = forms.CharField(label = "Název galerie", max_length = 100) nazev = forms.CharField(label = "Název galerie", max_length = 100)
#popis = forms.CharField(label = "Popis", required = False, max_length = 2000, widget = forms.Textarea)

View file

@ -6,16 +6,17 @@ from imagekit.processors import ResizeToFit, Transpose
import os import os
from soustredeni.models import Soustredeni from soustredeni.models import Soustredeni
from galerie.utils import top_galerie
VZDY=0 VZDY=0
ORG=1 ORG=1
NIKDY=2 # Pozor, diskontinuita, tady bylo `NIKDY`
UCASTNIK=3 UCASTNIK=3
# TODO: Enum!
VIDITELNOST = ( VIDITELNOST = (
(VZDY, 'Vždy'), (VZDY, 'Vždy'),
(ORG, 'Organizátorům'), (ORG, 'Organizátorům'),
(UCASTNIK, 'Účastníkům a orgů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í # tyhle funkce jsou tady jen kvůli starým migracím, které se na ně odkazují
@ -34,8 +35,7 @@ def galerie_filename(self, filename):
cislo_gal = gal.pk cislo_gal = gal.pk
# najdi kořenovou galerii # najdi kořenovou galerii
while (gal.galerie_up): gal = top_galerie(gal)
gal = gal.galerie_up
# soustředění je v cestě jen pokud galerie pod nějaké patří # soustředění je v cestě jen pokud galerie pod nějaké patří
cesta = ( cesta = (
@ -49,29 +49,29 @@ def galerie_filename(self, filename):
class Soubor(models.Model): class Soubor(models.Model):
# „originál“ (modulo max. velikost uploadu na web FIXME!) # „originál“ (modulo max. velikost uploadu na web FIXME!)
soubor = models.FileField(upload_to=galerie_filename, 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.") 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): class Typ(models.TextChoices):
OBRAZEK = 'obrazek', 'Obrázek' OBRAZEK = 'obrazek', 'Obrázek'
VIDEO = 'video', 'Video' VIDEO = 'video', 'Video'
NEVIM = 'nevim', 'Neznámý typ' NEVIM = 'nevim', 'Neznámý typ'
typ = models.CharField('Typ', max_length=16, blank=False, null=False, choices=Typ.choices, default=Typ.NEVIM) typ = models.CharField('Typ', max_length=16, blank=False, null=False, choices=Typ.choices, default=Typ.NEVIM)
# Filename by default; slouží k řazení # Filename by default; slouží k řazení
nazev = models.CharField('Název', max_length=50, blank=True, null=True) nazev = models.CharField('Jméno souboru', max_length=50, blank=True, null=True)
# ~~Rádoby~~ vtipný popisek od orgů # ~~Rádoby~~ vtipný popisek od orgů
popis = models.TextField('Popis', blank=True, null=True) popis = models.TextField('Popisek', blank=True, null=True)
datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add=True) datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add=True)
galerie = models.ForeignKey('Galerie', blank=True, null=True, on_delete=models.CASCADE) galerie = models.ForeignKey('Galerie', blank=True, null=True, on_delete=models.CASCADE)
# Primární klíč k řazení pro overridování řazení podle názvu # Primární klíč k řazení pro overridování řazení podle názvu
poradi = models.IntegerField('Pořadí', blank=True, null=True) poradi = models.IntegerField('Pořadí', blank=True, null=True)
def __str__(self): def __str__(self):
return f'Obrázek {self.nazev} ({self.soubor.name})' return f'Soubor {self.nazev} ({self.soubor.name})'
class Meta: class Meta:
verbose_name = 'Obrázek' verbose_name = 'Soubor'
verbose_name_plural = 'Obrázky' verbose_name_plural = 'Soubory'
db_table = 'galerie_obrazek' # FIXME: přejmenovat db_table = 'galerie_obrazek' # FIXME: přejmenovat
ordering = ['nazev'] #FIXME: zohlednit pořadí a asi i příslušnost ke galerii ordering = ['galerie', 'poradi', 'nazev']
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# obrázek potřebuje název, protože se z něj generuje cesta pro jeho uložení # obrázek potřebuje název, protože se z něj generuje cesta pro jeho uložení
@ -93,10 +93,10 @@ class Soubor(models.Model):
class Galerie(models.Model): class Galerie(models.Model):
nazev = models.CharField('Název', max_length=100) 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_vytvoreni = models.DateTimeField('Datum vytvoření', auto_now_add = True)
datum_zmeny = models.DateTimeField('Datum poslední změny', auto_now = True) datum_zmeny = models.DateTimeField('Datum poslední změny', auto_now = True)
popis = models.TextField('Popis', blank = True, null = 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) titulni_obrazek = models.ForeignKey(Soubor, blank = True, null = True, related_name = "+", on_delete = models.SET_NULL)
zobrazit = models.IntegerField('Zobrazit?', default = ORG, choices = VIDITELNOST) zobrazit = models.IntegerField('Zobrazit?', default = ORG, choices = VIDITELNOST)
galerie_up = models.ForeignKey('Galerie', blank = True, null = True, galerie_up = models.ForeignKey('Galerie', blank = True, null = True,
@ -110,3 +110,4 @@ class Galerie(models.Model):
class Meta: class Meta:
verbose_name = 'Galerie' verbose_name = 'Galerie'
verbose_name_plural = 'Galerie' verbose_name_plural = 'Galerie'
db_table = 'galerie_galerie'

View file

@ -1,4 +1,8 @@
from galerie.models import Galerie from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from galerie.models import Galerie
# Miluju pythoní typing :-P
def top_galerie(g: Galerie) -> Galerie: def top_galerie(g: Galerie) -> Galerie:
while g.galerie_up is not None: while g.galerie_up is not None:

View file

@ -8,7 +8,7 @@ from datetime import datetime
from galerie.utils import top_galerie from galerie.utils import top_galerie
from personalni.utils import resitel_uzivatele from personalni.utils import resitel_uzivatele
from galerie.models import Soubor, Galerie, VZDY, ORG, UCASTNIK, NIKDY from galerie.models import Soubor, Galerie, VZDY, ORG, UCASTNIK
from soustredeni.models import Soustredeni from soustredeni.models import Soustredeni
from galerie.forms import KomentarForm, NewGalerieForm from galerie.forms import KomentarForm, NewGalerieForm
@ -16,7 +16,7 @@ import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def galerie_ke_zobrazeni(soustredeni: Soustredeni | None, request: HttpRequest) -> tuple[int]: def galerie_ke_zobrazeni(soustredeni: Soustredeni | None, request: HttpRequest) -> tuple[int]:
if request.user.is_superuser: return (VZDY, ORG, UCASTNIK, NIKDY) if request.user.is_superuser: return (VZDY, ORG, UCASTNIK)
if request.user.je_org: return (VZDY, ORG, UCASTNIK) if request.user.je_org: return (VZDY, ORG, UCASTNIK)
if request.user.is_anonymous: return (VZDY,) if request.user.is_anonymous: return (VZDY,)
if soustredeni is None: return (VZDY,) if soustredeni is None: return (VZDY,)
@ -35,7 +35,7 @@ def zobrazit(galerie: Galerie, request: HttpRequest) -> bool:
def dovolit_upravy_popisku(galerie: Galerie, request: HttpRequest) -> bool: def dovolit_upravy_popisku(galerie: Galerie, request: HttpRequest) -> bool:
# FIXME: Dočasné: úpravy jen když je to v org-only stavu. (Odpovídá předchozímu chování) # FIXME: Dočasné: úpravy jen když je to v org-only stavu. (Odpovídá předchozímu chování)
return request.user.je_org and galerie.zobrazit in (ORG, NIKDY) return request.user.je_org and galerie.zobrazit in (ORG,)
def cesta_od_korene(g): def cesta_od_korene(g):