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

View file

@ -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)

View file

@ -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'

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:
while g.galerie_up is not None:

View file

@ -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):