Logika pro účastnické galerie ve views
This commit is contained in:
parent
b744e844dd
commit
787a570117
1 changed files with 58 additions and 68 deletions
126
galerie/views.py
126
galerie/views.py
|
@ -1,6 +1,6 @@
|
||||||
import random
|
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.shortcuts import render, HttpResponseRedirect, get_object_or_404
|
||||||
from django.template import RequestContext
|
from django.template import RequestContext
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
@ -12,23 +12,27 @@ from galerie.models import Obrazek, Galerie, VZDY, ORG, UCASTNIK, NIKDY
|
||||||
from soustredeni.models import Soustredeni
|
from soustredeni.models import Soustredeni
|
||||||
from galerie.forms import KomentarForm, NewGalerieForm
|
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
|
soustredeni = top_galerie(galerie).soustredeni
|
||||||
# Superuživatelům úplně všechny galerie.
|
return galerie.zobrazit in galerie_ke_zobrazeni(soustredeni, request)
|
||||||
if request.user.is_superuser: return True
|
|
||||||
|
|
||||||
if galerie.zobrazit == VZDY: return True
|
def dovolit_upravy_popisku(galerie: Galerie, request: HttpRequest) -> bool:
|
||||||
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):
|
|
||||||
# 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, NIKDY)
|
||||||
|
|
||||||
|
@ -45,20 +49,19 @@ def cesta_od_korene(g):
|
||||||
def nahled(request, pk, soustredeni):
|
def nahled(request, pk, soustredeni):
|
||||||
"""Zobrazeni nahledu vsech fotek ve skupine."""
|
"""Zobrazeni nahledu vsech fotek ve skupine."""
|
||||||
galerie = get_object_or_404(Galerie, pk=pk)
|
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 = Galerie.objects.filter(galerie_up = galerie).order_by('poradi')
|
||||||
if not request.user.je_org:
|
podgalerie = podgalerie.filter(zobrazit__in=galerie_ke_zobrazeni(soustredeni, request))
|
||||||
podgalerie = podgalerie.filter(zobrazit__lt=1)
|
|
||||||
|
|
||||||
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)
|
ma_se_zobrazit = zobrazit(galerie, request)
|
||||||
if not ma_se_zobrazit: raise Http404("Galerie sice existuje, ale my se tváříme, že ne :-D")
|
if not ma_se_zobrazit: raise Http404("Galerie sice existuje, ale my se tváříme, že ne :-D")
|
||||||
|
|
||||||
sourozenci = []
|
sourozenci = []
|
||||||
if galerie.galerie_up:
|
if galerie.galerie_up:
|
||||||
sourozenci = galerie.galerie_up.galerie_set.all().order_by('poradi')
|
sourozenci = galerie.galerie_up.galerie_set.filter(zobrazit__in=galerie_ke_zobrazeni(soustredeni, request)).order_by('poradi')
|
||||||
if not request.user.je_org:
|
|
||||||
sourozenci = sourozenci.filter(zobrazit__lt=1)
|
|
||||||
|
|
||||||
predchozi = None
|
predchozi = None
|
||||||
nasledujici = None
|
nasledujici = None
|
||||||
|
@ -77,7 +80,6 @@ def nahled(request, pk, soustredeni):
|
||||||
{'galerie' : galerie,
|
{'galerie' : galerie,
|
||||||
'podgalerie' : podgalerie,
|
'podgalerie' : podgalerie,
|
||||||
'obrazky' : obrazky,
|
'obrazky' : obrazky,
|
||||||
'upravy_popisku' : dovolit_upravy_popisku(galerie, request),
|
|
||||||
'cesta': cesta,
|
'cesta': cesta,
|
||||||
'sourozenci': sourozenci,
|
'sourozenci': sourozenci,
|
||||||
'predchozi': predchozi,
|
'predchozi': predchozi,
|
||||||
|
@ -93,10 +95,41 @@ def detail(request, pk, fotka, soustredeni):
|
||||||
NAHLEDU = 1
|
NAHLEDU = 1
|
||||||
|
|
||||||
galerie = get_object_or_404(Galerie, pk=pk)
|
galerie = get_object_or_404(Galerie, pk=pk)
|
||||||
|
soustredeni = top_galerie(galerie).soustredeni
|
||||||
ma_se_zobrazit = zobrazit(galerie, request)
|
ma_se_zobrazit = zobrazit(galerie, request)
|
||||||
if not ma_se_zobrazit: raise Http404("Obrázek neukážu!")
|
if not ma_se_zobrazit: raise Http404("Obrázek neukážu!")
|
||||||
obrazek = get_object_or_404(Obrazek, pk=fotka)
|
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 = 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
|
# vytvoreni a obslouzeni formulare
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
|
@ -106,49 +139,6 @@ def detail(request, pk, fotka, soustredeni):
|
||||||
obrazek.save()
|
obrazek.save()
|
||||||
else:
|
else:
|
||||||
form = KomentarForm({'komentar': obrazek.popis})
|
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.
|
# Preskalovani obrazku do vybraneho prostoru.
|
||||||
vyska = obrazek.obrazek_stredni.height
|
vyska = obrazek.obrazek_stredni.height
|
||||||
|
@ -167,8 +157,8 @@ def detail(request, pk, fotka, soustredeni):
|
||||||
'obrazek' : obrazek,
|
'obrazek' : obrazek,
|
||||||
'vyska' : vyska,
|
'vyska' : vyska,
|
||||||
'sirka' : sirka,
|
'sirka' : sirka,
|
||||||
'obrazky_predchozi' : obrazky_predchozi,
|
'obrazky_predchozi' : predchozi_obrazky,
|
||||||
'obrazky_dalsi' : obrazky_dalsi,
|
'obrazky_dalsi' : nasledujici_obrazky,
|
||||||
'upravy_popisku' : dovolit_upravy_popisku(galerie, request),
|
'upravy_popisku' : dovolit_upravy_popisku(galerie, request),
|
||||||
'form' : form,
|
'form' : form,
|
||||||
'cesta': cesta_od_korene(galerie),
|
'cesta': cesta_od_korene(galerie),
|
||||||
|
|
Loading…
Reference in a new issue