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
	
	 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky