vysledkovka | Optimalizace pristupu k DB
This commit is contained in:
		
							parent
							
								
									f443a8cd2e
								
							
						
					
					
						commit
						3504d5788e
					
				
					 2 changed files with 30 additions and 18 deletions
				
			
		|  | @ -522,7 +522,7 @@ def spravne_novinky(request): | ||||||
| 	user = request.user | 	user = request.user | ||||||
| 	# Využíváme líné vyhodnocování QuerySetů | 	# Využíváme líné vyhodnocování QuerySetů | ||||||
| 	qs = Novinky.objects.all() | 	qs = Novinky.objects.all() | ||||||
| 	if not user.je_org: | 	if not user.je_org(): | ||||||
| 		qs = qs.filter(zverejneno=True) | 		qs = qs.filter(zverejneno=True) | ||||||
| 	return qs.order_by('-datum') | 	return qs.order_by('-datum') | ||||||
| 
 | 
 | ||||||
|  | @ -644,29 +644,25 @@ class RocnikView(generic.DetailView): | ||||||
| 	def get_object(self, queryset=None): | 	def get_object(self, queryset=None): | ||||||
| 		if queryset is None: | 		if queryset is None: | ||||||
| 			queryset = self.get_queryset() | 			queryset = self.get_queryset() | ||||||
| 		rocnik_arg = self.kwargs.get('rocnik') |  | ||||||
| 		queryset = queryset.filter(rocnik=rocnik_arg) |  | ||||||
| 
 | 
 | ||||||
| 		try: | 		return get_object_or_404(queryset,rocnik=self.kwargs.get('rocnik')) | ||||||
| 			obj = queryset.get() |  | ||||||
| 		except queryset.model.DoesNotExist: |  | ||||||
| 			raise Http404(_("No %(verbose_name)s found matching the query") % |  | ||||||
| 						{'verbose_name': queryset.model._meta.verbose_name}) |  | ||||||
| 		return obj |  | ||||||
| 
 | 
 | ||||||
| 	def get_context_data(self, **kwargs): | 	def get_context_data(self, **kwargs): | ||||||
|  | 		start = time.time() | ||||||
| 		context = super(RocnikView, self).get_context_data(**kwargs) | 		context = super(RocnikView, self).get_context_data(**kwargs) | ||||||
| 
 | 
 | ||||||
| 		# vysledkovka = True zajistí vykreslení, | 		# vysledkovka = True zajistí vykreslení, | ||||||
| 		# zkontrolovat, kdy se má a nemá vykreslovat | 		# zkontrolovat, kdy se má a nemá vykreslovat | ||||||
| 		context['vysledkovka'] = True | 		context['vysledkovka'] = True | ||||||
|  | 		if self.request.user.je_org(): | ||||||
| 			context['cisla_s_neverejnymi'] = cisla_rocniku(context["rocnik"], jen_verejne=False) | 			context['cisla_s_neverejnymi'] = cisla_rocniku(context["rocnik"], jen_verejne=False) | ||||||
|  | 			context['radky_vysledkovky_s_neverejnymi'] = vysledkovka_rocniku(context["rocnik"], jen_verejne=False) | ||||||
|  | 			context['hlavni_problemy_v_rocniku_s_neverejnymi'] = hlavni_problemy_rocniku(context["rocnik"], jen_verejne=False) | ||||||
| 		context['cisla'] = cisla_rocniku(context["rocnik"]) | 		context['cisla'] = cisla_rocniku(context["rocnik"]) | ||||||
| 		context['radky_vysledkovky'] = vysledkovka_rocniku(context["rocnik"]) | 		context['radky_vysledkovky'] = vysledkovka_rocniku(context["rocnik"]) | ||||||
| 		context['radky_vysledkovky_s_neverejnymi'] = vysledkovka_rocniku( |  | ||||||
| 			context["rocnik"], jen_verejne=False) |  | ||||||
| 		context['hlavni_problemy_v_rocniku'] = hlavni_problemy_rocniku(context["rocnik"]) | 		context['hlavni_problemy_v_rocniku'] = hlavni_problemy_rocniku(context["rocnik"]) | ||||||
| 		context['hlavni_problemy_v_rocniku_s_neverejnymi'] = hlavni_problemy_rocniku(context["rocnik"], jen_verejne=False) | 		end = time.time() | ||||||
|  | 		print("Kontext:", end-start) | ||||||
| 
 | 
 | ||||||
| 		return context | 		return context | ||||||
| 
 | 
 | ||||||
|  | @ -689,7 +685,7 @@ class ProblemView(generic.DetailView): | ||||||
| 	def get_context_data(self, **kwargs): | 	def get_context_data(self, **kwargs): | ||||||
| 		context = super().get_context_data(**kwargs) | 		context = super().get_context_data(**kwargs) | ||||||
| 		# Musí se používat context['object'], protože nevíme, jestli dostaneme úložku, téma, článek, .... a tyhle věci vyrábějí různé klíče. | 		# Musí se používat context['object'], protože nevíme, jestli dostaneme úložku, téma, článek, .... a tyhle věci vyrábějí různé klíče. | ||||||
| 		if not context['object'].verejne() and not self.request.user.je_org: | 		if not context['object'].verejne() and not self.request.user.je_org(): | ||||||
| 			raise PermissionDenied() | 			raise PermissionDenied() | ||||||
| 		if isinstance(context['object'], Clanek): | 		if isinstance(context['object'], Clanek): | ||||||
| 			context['reseni'] = Reseni.objects.filter(problem=context['object']).select_related('resitel').order_by('resitel__prijmeni') | 			context['reseni'] = Reseni.objects.filter(problem=context['object']).select_related('resitel').order_by('resitel__prijmeni') | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| import seminar.models as m | import seminar.models as m | ||||||
| from django.db.models import Q, Sum, Count | from django.db.models import Q, Sum, Count | ||||||
| from seminar.utils import aktivniResitele, resi_v_rocniku, cisla_rocniku, hlavni_problemy_rocniku, hlavni_problem, hlavni_problemy_cisla, problemy_cisla, podproblemy_v_cislu | from seminar.utils import aktivniResitele, resi_v_rocniku, cisla_rocniku, hlavni_problemy_rocniku, hlavni_problem, hlavni_problemy_cisla, problemy_cisla, podproblemy_v_cislu | ||||||
|  | import time | ||||||
| ### Výsledky | ### Výsledky | ||||||
| 
 | 
 | ||||||
| def sloupec_s_poradim(setrizene_body): | def sloupec_s_poradim(setrizene_body): | ||||||
|  | @ -126,15 +127,16 @@ class RadekVysledkovkyRocniku(object): | ||||||
| 
 | 
 | ||||||
| def setrid_resitele_a_body(slov_resitel_body): | def setrid_resitele_a_body(slov_resitel_body): | ||||||
| 	setrizeni_resitele_id = [dvojice[0] for dvojice in slov_resitel_body] | 	setrizeni_resitele_id = [dvojice[0] for dvojice in slov_resitel_body] | ||||||
| 	setrizeni_resitele = [m.Resitel.objects.get(id=i) for i in setrizeni_resitele_id] |  | ||||||
| 	setrizene_body = [dvojice[1] for dvojice in slov_resitel_body] | 	setrizene_body = [dvojice[1] for dvojice in slov_resitel_body] | ||||||
| 	return setrizeni_resitele_id, setrizeni_resitele, setrizene_body | 	return setrizeni_resitele_id,  setrizene_body | ||||||
| 
 | 
 | ||||||
| def vysledkovka_rocniku(rocnik, jen_verejne=True): | def vysledkovka_rocniku(rocnik, jen_verejne=True): | ||||||
| 	""" Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve | 	""" Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve | ||||||
| 	formě vhodné pro šablonu "seminar/vysledkovka_rocniku.html" | 	formě vhodné pro šablonu "seminar/vysledkovka_rocniku.html" | ||||||
| 	""" | 	""" | ||||||
| 	 | 	 | ||||||
|  | 	start = time.time() | ||||||
|  | 
 | ||||||
| 	## TODO možná chytřeji vybírat aktivní řešitele | 	## TODO možná chytřeji vybírat aktivní řešitele | ||||||
| 	# aktivní řešitelé - chceme letos něco poslal, TODO později vyfiltrujeme ty, kdo mají  | 	# aktivní řešitelé - chceme letos něco poslal, TODO později vyfiltrujeme ty, kdo mají  | ||||||
| 	# u alespoň jedné hodnoty něco jiného než NULL | 	# u alespoň jedné hodnoty něco jiného než NULL | ||||||
|  | @ -150,7 +152,7 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): | ||||||
| 	resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele) | 	resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele) | ||||||
| 
 | 
 | ||||||
| 	# setřídíme řešitele podle počtu bodů a získáme seznam s body od nejvyšších po nenižší | 	# setřídíme řešitele podle počtu bodů a získáme seznam s body od nejvyšších po nenižší | ||||||
| 	setrizeni_resitele_id, setrizeni_resitele, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn) | 	setrizeni_resitele_id, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn) | ||||||
| 	poradi = sloupec_s_poradim(setrizene_body) | 	poradi = sloupec_s_poradim(setrizene_body) | ||||||
| 
 | 
 | ||||||
| 	# získáme body odjakživa | 	# získáme body odjakživa | ||||||
|  | @ -159,6 +161,10 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): | ||||||
| 	# vytvoříme jednotlivé sloupce výsledkovky | 	# vytvoříme jednotlivé sloupce výsledkovky | ||||||
| 	radky_vysledkovky = [] | 	radky_vysledkovky = [] | ||||||
| 	i = 0 | 	i = 0 | ||||||
|  | 	setrizeni_resitele_dict = {} # Tento slovnik se vyrab | ||||||
|  | 	for r in m.Resitel.objects.filter(id__in=setrizeni_resitele_id).select_related('osoba'): | ||||||
|  | 		setrizeni_resitele_dict[r.id] = r | ||||||
|  | 	 | ||||||
| 	for ar_id in setrizeni_resitele_id: | 	for ar_id in setrizeni_resitele_id: | ||||||
| 		# seznam počtu bodů daného řešitele pro jednotlivá čísla | 		# seznam počtu bodů daného řešitele pro jednotlivá čísla | ||||||
| 		body_cisla_sezn = [] | 		body_cisla_sezn = [] | ||||||
|  | @ -168,7 +174,7 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): | ||||||
| 		# vytáhneme informace pro daného řešitele | 		# vytáhneme informace pro daného řešitele | ||||||
| 		radek = RadekVysledkovkyRocniku( | 		radek = RadekVysledkovkyRocniku( | ||||||
| 			poradi[i], # pořadí | 			poradi[i], # pořadí | ||||||
| 			m.Resitel.objects.get(id=ar_id), # řešitel (z id) | 			setrizeni_resitele_dict[ar_id], # řešitel (z id) | ||||||
| 			body_cisla_sezn, # seznam bodů za čísla | 			body_cisla_sezn, # seznam bodů za čísla | ||||||
| 			setrizene_body[i], # body za ročník (spočítané výše s pořadím) | 			setrizene_body[i], # body za ročník (spočítané výše s pořadím) | ||||||
| 			resitel_odjakzivabody_slov[ar_id], # body odjakživa | 			resitel_odjakzivabody_slov[ar_id], # body odjakživa | ||||||
|  | @ -176,7 +182,11 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): | ||||||
| 		radky_vysledkovky.append(radek) | 		radky_vysledkovky.append(radek) | ||||||
| 		i += 1 | 		i += 1 | ||||||
| 
 | 
 | ||||||
|  | 	end = time.time() | ||||||
|  | 	print("Vysledkovka rocniku",end-start) | ||||||
|  | 
 | ||||||
| 	return radky_vysledkovky | 	return radky_vysledkovky | ||||||
|  | 
 | ||||||
| class RadekVysledkovkyCisla(object): | class RadekVysledkovkyCisla(object): | ||||||
| 	"""Obsahuje věci, které se hodí vědět při konstruování výsledkovky. | 	"""Obsahuje věci, které se hodí vědět při konstruování výsledkovky. | ||||||
| 	Umožňuje snazší práci v templatu (lepší, než seznam).""" | 	Umožňuje snazší práci v templatu (lepší, než seznam).""" | ||||||
|  | @ -225,6 +235,9 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): | ||||||
| 	# TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé | 	# TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé | ||||||
| 	# pro každý hlavní problém zavedeme slovník s body za daný hlavní problém  | 	# pro každý hlavní problém zavedeme slovník s body za daný hlavní problém  | ||||||
| 	# pro jednotlivé řešitele (slovník slovníků hlavních problémů) | 	# pro jednotlivé řešitele (slovník slovníků hlavních problémů) | ||||||
|  | 
 | ||||||
|  | 	print("Scitam cislo",cislo) | ||||||
|  | 
 | ||||||
| 	if hlavni_problemy is None: | 	if hlavni_problemy is None: | ||||||
| 		hlavni_problemy = hlavni_problemy_cisla(cislo) | 		hlavni_problemy = hlavni_problemy_cisla(cislo) | ||||||
| 
 | 
 | ||||||
|  | @ -257,6 +270,7 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): | ||||||
| 	reseni_do_cisla = m.Reseni.objects.prefetch_related('problem', 'resitele',  | 	reseni_do_cisla = m.Reseni.objects.prefetch_related('problem', 'resitele',  | ||||||
| 				'hodnoceni_set').filter(hodnoceni__cislo_body=cislo) | 				'hodnoceni_set').filter(hodnoceni__cislo_body=cislo) | ||||||
| 	 | 	 | ||||||
|  | 	start = time.time()	 | ||||||
| 	# projdeme všechna řešení do čísla a přičteme body každému řešiteli do celkových | 	# projdeme všechna řešení do čísla a přičteme body každému řešiteli do celkových | ||||||
| 	# bodů i do bodů za problém | 	# bodů i do bodů za problém | ||||||
| 	for reseni in reseni_do_cisla: | 	for reseni in reseni_do_cisla: | ||||||
|  | @ -280,6 +294,8 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): | ||||||
| 						continue | 						continue | ||||||
| 					pricti_body(cislobody, resitel, body) | 					pricti_body(cislobody, resitel, body) | ||||||
| 					pricti_body(nadproblem_slovnik, resitel, body) | 					pricti_body(nadproblem_slovnik, resitel, body) | ||||||
|  | 	end = time.time() | ||||||
|  | 	print("for cykly:", end-start) | ||||||
| 	return hlavni_problemy_slovnik, cislobody | 	return hlavni_problemy_slovnik, cislobody | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue