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 | ||||
| 
 | ||||
| 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), | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky