225 lines
7.9 KiB
Python
225 lines
7.9 KiB
Python
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'."""
|
|
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})
|
|
|
|
return render(request, 'galerie/Galerie.html',
|
|
{'galerie' : galerie,
|
|
'predchozi_galerie' : predchozi_galerie,
|
|
'nasledujici_galerie' : nasledujici_galerie,
|
|
'obrazek' : obrazek,
|
|
'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.soubor = 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('../../')
|
|
|