import random 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 from galerie.utils import top_galerie from personalni.utils import resitel_uzivatele from galerie.models import Obrazek, Galerie, VZDY, ORG, UCASTNIK, NIKDY from soustredeni.models import Soustredeni from galerie.forms import KomentarForm, NewGalerieForm 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.je_org: return (VZDY, ORG, UCASTNIK) if request.user.is_anonymous: return (VZDY,) if soustredeni is None: 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 return galerie.zobrazit in galerie_ke_zobrazeni(soustredeni, 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) def cesta_od_korene(g): """Vrátí seznam galerií od kořene ke g""" cesta = [] while g is not None: cesta.append(g) g = g.galerie_up return reversed(cesta) 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') podgalerie = podgalerie.filter(zobrazit__in=galerie_ke_zobrazeni(soustredeni, request)) 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.filter(zobrazit__in=galerie_ke_zobrazeni(soustredeni, request)).order_by('poradi') predchozi = None nasledujici = None minuly = None for g in sourozenci: if g.pk == galerie.pk: predchozi = minuly if minuly is not None and minuly.pk == galerie.pk: nasledujici = g break minuly = g cesta = cesta_od_korene(galerie) return render(request, 'galerie/GalerieNahled.html', {'galerie' : galerie, 'podgalerie' : podgalerie, 'obrazky' : obrazky, 'cesta': cesta, 'sourozenci': sourozenci, 'predchozi': predchozi, 'nasledujici': nasledujici, }) def detail(request, pk, fotka, soustredeni): """Zobrazeni nahledu fotky s id 'fotka'.""" MAX_VYSKA = 900 MAX_SIRKA = 900 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': form = KomentarForm(request.POST) if form.is_valid(): obrazek.popis = form.cleaned_data['komentar'] obrazek.save() else: form = KomentarForm({'komentar': obrazek.popis}) # Preskalovani obrazku do vybraneho prostoru. # FIXME: do CSS! vyska = MAX_VYSKA sirka = MAX_SIRKA # vyska = obrazek.obrazek_stredni.height # sirka = obrazek.obrazek_stredni.width # if vyska > MAX_VYSKA: # sirka = sirka * MAX_VYSKA / vyska # vyska = MAX_VYSKA # if sirka > MAX_SIRKA: # vyska = vyska * MAX_SIRKA / sirka # sirka = MAX_SIRKA return render(request, 'galerie/Galerie.html', {'galerie' : galerie, 'predchozi_galerie' : predchozi_galerie, 'nasledujici_galerie' : nasledujici_galerie, 'obrazek' : obrazek, 'vyska' : vyska, 'sirka' : sirka, 'obrazky_predchozi' : predchozi_obrazky, 'obrazky_dalsi' : nasledujici_obrazky, 'upravy_popisku' : dovolit_upravy_popisku(galerie, request), 'form' : form, 'cesta': cesta_od_korene(galerie), }) def new_galerie(request, galerie, soustredeni): # zjistime k jakemu soustredeni se vaze nove vytvarena galerie soustredeni = get_object_or_404(Soustredeni, pk = soustredeni) # pokud je parametr galerie 0, pak jde o hlavni galerii # kdyz je nejaky jiny, pak je pk galerie pod kterou tu dalsi vytvarim if int(galerie) == 0: galerie_up = False galerie_text = "Hlavní fotogalerie soustředění" else: galerie_up = get_object_or_404(Galerie, pk = int(galerie)) galerie_text = "podgalerii ke galerii " + str(galerie_up) # obsluha formulare umoznujiciho multiple nahravani fotek if request.method == 'POST': form = NewGalerieForm(request.POST, request.FILES) if form.is_valid(): # vytvoreni nove galerie gal = Galerie() gal.nazev = form.cleaned_data['nazev'] #gal.popis = form.cleaned_data['popis'] # popis nepouzivame gal.zobrazit = ORG # galerie je v procesu vytvareni ''' pokud je to podgalerie pridej nadrazenou galerii a nadrazene soustredeni nechej volne, pokud je to hlavni galerie, tak nadrazena galerie neexistuje, ale v takovem pripade musi byt nadrazene soustredeni a ne jinak ''' if galerie_up: gal.galerie_up = galerie_up else: gal.soustredeni = soustredeni if gal.galerie_up: gal.poradi = int(len(gal.galerie_up.galerie_set.all())) + 1 gal.save() # zpracovani obrazku v galerii for obr in request.FILES.getlist('obr'): o = Obrazek() o.obrazek_velky = obr o.nazev = str(obr) o.galerie = gal o.save() # presmerovani na prave vzniklou galerii return HttpResponseRedirect('../../' + str(gal.pk)) else: form = NewGalerieForm() return render(request, 'galerie/GalerieNew.html', { 'form' : form, 'soustredeni' : soustredeni, 'galerie_text' : galerie_text, }) def plus_galerie(request, galerie, soustredeni, subgalerie): galerie = get_object_or_404(Galerie, pk=subgalerie) if galerie.poradi: galerie.poradi += 1 else: galerie.poradi = int(len(galerie.galerie_up.galerie_set.all())) galerie.save() return HttpResponseRedirect('../../') def minus_galerie(request, galerie, soustredeni, subgalerie): galerie = get_object_or_404(Galerie, pk=subgalerie) if galerie.poradi: galerie.poradi -= 1 else: galerie.poradi = 1 galerie.save() return HttpResponseRedirect('../../')