241 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			241 lines
		
	
	
	
		
			8.3 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'."""
 | |
| 	MAX_VYSKA = 900
 | |
| 	MAX_SIRKA = 900
 | |
| 	MAX_VYSKA_MALA = 100
 | |
| 	MAX_SIRKA_MALA = 200
 | |
| 	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.
 | |
| 	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('../../')
 | |
| 
 |