From 541ea5f73757445684ed7e67e9d2618761881ed7 Mon Sep 17 00:00:00 2001 From: LEdoian Date: Tue, 25 Nov 2025 03:02:44 +0000 Subject: [PATCH] =?UTF-8?q?WIP:=20refactoring,=20mo=C5=BEn=C3=A1=20to=20te?= =?UTF-8?q?=C4=8F=20nefunguje=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- galerie/admin.py | 11 ++++++----- galerie/forms.py | 2 +- galerie/models.py | 27 ++++++++++++++------------- galerie/utils.py | 6 +++++- galerie/views.py | 6 +++--- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/galerie/admin.py b/galerie/admin.py index 147bbbed..88d21215 100644 --- a/galerie/admin.py +++ b/galerie/admin.py @@ -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.http import HttpResponseRedirect from django import forms from django.db import models -# akction - 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) for galerie in queryset: galerie.zobrazit = VZDY @@ -18,7 +19,7 @@ def zverejnit_fotogalerii(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) for galerie in queryset: galerie.zobrazit = ORG diff --git a/galerie/forms.py b/galerie/forms.py index 81fffc8a..188f5817 100644 --- a/galerie/forms.py +++ b/galerie/forms.py @@ -1,8 +1,8 @@ from django import forms 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) class NewGalerieForm(forms.Form): nazev = forms.CharField(label = "Název galerie", max_length = 100) - #popis = forms.CharField(label = "Popis", required = False, max_length = 2000, widget = forms.Textarea) diff --git a/galerie/models.py b/galerie/models.py index 06602e02..f94ba34a 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -6,16 +6,17 @@ from imagekit.processors import ResizeToFit, Transpose import os from soustredeni.models import Soustredeni +from galerie.utils import top_galerie VZDY=0 ORG=1 -NIKDY=2 +# Pozor, diskontinuita, tady bylo `NIKDY` UCASTNIK=3 +# TODO: Enum! 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í @@ -34,8 +35,7 @@ def galerie_filename(self, filename): cislo_gal = gal.pk # najdi kořenovou galerii - while (gal.galerie_up): - gal = gal.galerie_up + gal = top_galerie(gal) # soustředění je v cestě jen pokud galerie pod nějaké patří cesta = ( @@ -49,29 +49,29 @@ def galerie_filename(self, filename): 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. 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): 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) + nazev = models.CharField('Jméno souboru', max_length=50, blank=True, null=True) # ~~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) 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})' + return f'Soubor {self.nazev} ({self.soubor.name})' class Meta: - verbose_name = 'Obrázek' - verbose_name_plural = 'Obrázky' + verbose_name = 'Soubor' + verbose_name_plural = 'Soubory' 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): # 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): - 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_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) zobrazit = models.IntegerField('Zobrazit?', default = ORG, choices = VIDITELNOST) galerie_up = models.ForeignKey('Galerie', blank = True, null = True, @@ -110,3 +110,4 @@ class Galerie(models.Model): class Meta: verbose_name = 'Galerie' verbose_name_plural = 'Galerie' + db_table = 'galerie_galerie' diff --git a/galerie/utils.py b/galerie/utils.py index 352e197b..e1e7a15d 100644 --- a/galerie/utils.py +++ b/galerie/utils.py @@ -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: while g.galerie_up is not None: diff --git a/galerie/views.py b/galerie/views.py index 5af33b5e..8468530c 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -8,7 +8,7 @@ from datetime import datetime from galerie.utils import top_galerie 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 galerie.forms import KomentarForm, NewGalerieForm @@ -16,7 +16,7 @@ import logging logger = logging.getLogger(__name__) 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.is_anonymous: 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: # 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):