From 787a570117e3c8373487cb7bf32aeb7adcb57b8d Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Wed, 23 Apr 2025 23:02:35 +0200 Subject: [PATCH] =?UTF-8?q?Logika=20pro=20=C3=BA=C4=8Dastnick=C3=A9=20gale?= =?UTF-8?q?rie=20ve=20views?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- galerie/views.py | 126 ++++++++++++++++++++++------------------------- 1 file changed, 58 insertions(+), 68 deletions(-) diff --git a/galerie/views.py b/galerie/views.py index 0e20055d..b1e720ca 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -1,6 +1,6 @@ import random -from django.http import HttpResponse, Http404 +from django.http import HttpResponse, Http404, HttpRequest from django.shortcuts import render, HttpResponseRedirect, get_object_or_404 from django.template import RequestContext from datetime import datetime @@ -12,23 +12,27 @@ from galerie.models import Obrazek, Galerie, VZDY, ORG, UCASTNIK, NIKDY from soustredeni.models import Soustredeni from galerie.forms import KomentarForm, NewGalerieForm -def zobrazit(galerie, request): +import logging +logger = logging.getLogger(__name__) + +def galerie_ke_zobrazeni(soustredeni: Soustredeni, request: HttpRequest) -> tuple[int]: + if request.user.is_superuser: return (VZDY, ORG, UCASTNIK, NIKDY) + if request.user.je_org: return (VZDY, ORG, UCASTNIK) + if request.user.is_anonymous: return (VZDY,) + if (resitel := resitel_uzivatele(request.user)) is not None: + if resitel.soustredeni_set.contains(soustredeni): + return (VZDY, UCASTNIK) + else: + return (VZDY,) + logger.warning("Nepodařilo se zjistit, jaké galerie se mají zobrazit!") + return (VZDY,) + + +def zobrazit(galerie: Galerie, request: HttpRequest) -> bool: soustredeni = top_galerie(galerie).soustredeni - # Superuživatelům úplně všechny galerie. - if request.user.is_superuser: return True + return galerie.zobrazit in galerie_ke_zobrazeni(soustredeni, request) - if galerie.zobrazit == VZDY: return True - if galerie.zobrazit == NIKDY: return False - if galerie.zobrazit == ORG and request.user.je_org: return True - if galerie.zobrazit == UCASTNIK: - if request.user.je_org: - return True - resitel = resitel_uzivatele(request.user) - if resitel is not None and resitel.soustredeni_set.contains(soustredeni): - return True - return False - -def dovolit_upravy_popisku(galerie, request): +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) @@ -45,20 +49,19 @@ def cesta_od_korene(g): def nahled(request, pk, soustredeni): """Zobrazeni nahledu vsech fotek ve skupine.""" galerie = get_object_or_404(Galerie, pk=pk) + soustredeni = top_galerie(galerie).soustredeni + # FIXME: přepsat model a použít přímo dolů… podgalerie = Galerie.objects.filter(galerie_up = galerie).order_by('poradi') - if not request.user.je_org: - podgalerie = podgalerie.filter(zobrazit__lt=1) + podgalerie = podgalerie.filter(zobrazit__in=galerie_ke_zobrazeni(soustredeni, request)) - obrazky = Obrazek.objects.filter(galerie = galerie).order_by('poradi', 'nazev') + obrazky = galerie.obrazek_set.all().order_by('poradi', 'nazev') ma_se_zobrazit = zobrazit(galerie, request) if not ma_se_zobrazit: raise Http404("Galerie sice existuje, ale my se tváříme, že ne :-D") sourozenci = [] if galerie.galerie_up: - sourozenci = galerie.galerie_up.galerie_set.all().order_by('poradi') - if not request.user.je_org: - sourozenci = sourozenci.filter(zobrazit__lt=1) + sourozenci = galerie.galerie_up.galerie_set.filter(zobrazit__in=galerie_ke_zobrazeni(soustredeni, request)).order_by('poradi') predchozi = None nasledujici = None @@ -77,7 +80,6 @@ def nahled(request, pk, soustredeni): {'galerie' : galerie, 'podgalerie' : podgalerie, 'obrazky' : obrazky, - 'upravy_popisku' : dovolit_upravy_popisku(galerie, request), 'cesta': cesta, 'sourozenci': sourozenci, 'predchozi': predchozi, @@ -93,10 +95,41 @@ def detail(request, pk, fotka, soustredeni): NAHLEDU = 1 galerie = get_object_or_404(Galerie, pk=pk) + soustredeni = top_galerie(galerie).soustredeni ma_se_zobrazit = zobrazit(galerie, request) if not ma_se_zobrazit: raise Http404("Obrázek neukážu!") obrazek = get_object_or_404(Obrazek, pk=fotka) + + # Pořadí není povinné. FIXME: `nazev` je zavádějící… Ale tohle je kanonické pořadí obrázků v galerii… obrazky = galerie.obrazek_set.all().order_by('poradi', 'nazev') + obrazky = list(obrazky) + index_obrazku = obrazky.index(obrazek) + # Podle mě se nemůže stát, že by volání výš selhalo, kdyžtak shodí web. (původně to byl explicitně ošetřený stav dávající 404) + predchozi_obrazky = list(reversed(obrazky[:index_obrazku])) + nasledujici_obrazky = obrazky[index_obrazku+1:] + # Může jich být hodně… + predchozi_obrazky = predchozi_obrazky[:NAHLEDU] + nasledujici_obrazky = nasledujici_obrazky[:NAHLEDU] + # Předchozí obrázky chceme v normálním pořadí + predchozi_obrazky = list(reversed(predchozi_obrazky)) + + if galerie.galerie_up is not None: + sousedni_galerie = Galerie.objects.filter(galerie_up=galerie.galerie_up, zobrazit__in=galerie_ke_zobrazeni(soustredeni, request)).order_by('poradi') + sousedni_galerie = list(sousedni_galerie) + # Teoreticky se můžeme dívat na galerie.poradi, ale jednak už tenhle pattern stejně je výš a druhak je galerií málo, takže pomalost nevadí. + index_galerie = sousedni_galerie.index(galerie) + predchozi_galerie = sousedni_galerie[index_galerie-1] if index_galerie > 0 else None + nasledujici_galerie = sousedni_galerie[index_galerie+1] if index_galerie < len(sousedni_galerie) - 1 else None + else: + predchozi_galerie = None + nasledujici_galerie = None + + # Pokud je obrázků dost, tak další galerii nepotřebujeme + # (jo, mohli jsme si ušetřit práci, ale takhle je kód imho přehlednější a za pár ušetřených dotazů do DB to nestojí) + if len(predchozi_obrazky) >= NAHLEDU: + predchozi_galerie = None + if len(nasledujici_obrazky) >= NAHLEDU: + nasledujici_galerie = None # vytvoreni a obslouzeni formulare if request.method == 'POST': @@ -106,49 +139,6 @@ def detail(request, pk, fotka, soustredeni): obrazek.save() else: form = KomentarForm({'komentar': obrazek.popis}) - - # Poradi aktualniho obrazku v galerii/stitku. - for i in range(len(obrazky)): - if obrazky[i] == obrazek: - poradi = i - break - else: - # Obrazek neni v galerii/stitku. - raise Http404("„Obrázek není v galerii/štítku“, ať už to znamená cokoliv…") - - - # Nacteni okolnich obrazku a galerii - # TODO vyjmout zjisteni predchozich a nasledujicich galerii - # a udelat z toho funkci, ktera se pouzije u nahledu - predchozi_galerie = None - nasledujici_galerie = None - obrazky_dalsi = obrazky[poradi+1:poradi+NAHLEDU+1] - if (poradi+1) > NAHLEDU: - obrazky_predchozi = obrazky[poradi-NAHLEDU:poradi] - else: - obrazky_predchozi = obrazky[0:poradi] - if galerie.poradi > 1: - predchozi_galerie = Galerie.objects.\ - filter(galerie_up=galerie.galerie_up).\ - filter(poradi=(galerie.poradi-1)) - if predchozi_galerie: - predchozi_galerie = predchozi_galerie[0] - else: - predchozi_galerie = None - if (poradi+1) == len(obrazky): # Tohle je poslední obrázek - if (galerie.poradi is not None - and galerie.galerie_up is not None): - nasledujici_galerie = Galerie.objects.\ - filter(galerie_up=galerie.galerie_up).\ - filter(poradi=(galerie.poradi+1)) - else: - nasledujici_galerie = None - if nasledujici_galerie: - nasledujici_galerie = nasledujici_galerie[0] - else: - nasledujici_galerie = None - - # Preskalovani obrazku do vybraneho prostoru. vyska = obrazek.obrazek_stredni.height @@ -167,8 +157,8 @@ def detail(request, pk, fotka, soustredeni): 'obrazek' : obrazek, 'vyska' : vyska, 'sirka' : sirka, - 'obrazky_predchozi' : obrazky_predchozi, - 'obrazky_dalsi' : obrazky_dalsi, + 'obrazky_predchozi' : predchozi_obrazky, + 'obrazky_dalsi' : nasledujici_obrazky, 'upravy_popisku' : dovolit_upravy_popisku(galerie, request), 'form' : form, 'cesta': cesta_od_korene(galerie),