models: upravena funkce get_titul, nevyžaduje počet bodů a funkce vsechny_body na počítání bodů odjakživa
views: rozdělaná práce na zobrazování výsledkovky čísla
This commit is contained in:
		
							parent
							
								
									b440cb680a
								
							
						
					
					
						commit
						464cdc2910
					
				
					 2 changed files with 115 additions and 37 deletions
				
			
		|  | @ -284,8 +284,18 @@ class Resitel(SeminarModelBase): | |||
| 		else: | ||||
| 			return 'Z' + str(rozdil + 9) | ||||
| 
 | ||||
| 	def get_titul(self, celkove_body): | ||||
| 		"Vrati titul podle zadaneho poctu bodu." | ||||
| 	def vsechny_body(self): | ||||
| 		"Spočítá body odjakživa." | ||||
| 		vsechna_reseni = self.reseni_set.all() | ||||
| 		vsechna_hodnoceni = Hodnoceni.objects.filter( | ||||
| 			reseni__in=vsechna_reseni) | ||||
| 		return sum(h.body for h in list(vsechna_hodnoceni)) | ||||
| 
 | ||||
| 
 | ||||
| 	def get_titul(self): | ||||
| 		"Vrati titul" | ||||
| 		celkove_body = self.vsechny_body() | ||||
| 
 | ||||
| 		if celkove_body < 10: | ||||
| 			return '' | ||||
| 		elif celkove_body < 20: | ||||
|  | @ -1362,7 +1372,6 @@ class Novinky(models.Model): | |||
| 	datum = models.DateField(auto_now_add=True) | ||||
| 
 | ||||
| 	text = models.TextField('Text novinky', blank=True, null=True) | ||||
| 
 | ||||
| 	obrazek = models.ImageField('Obrázek', upload_to='image_novinky/%Y/%m/%d/', | ||||
| 			null=True, blank=True) | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										137
									
								
								seminar/views.py
									
									
									
									
									
								
							
							
						
						
									
										137
									
								
								seminar/views.py
									
									
									
									
									
								
							|  | @ -14,6 +14,7 @@ from django.contrib.auth import authenticate, login | |||
| from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Tema, Clanek | ||||
| #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | ||||
| from . import utils | ||||
| from .unicodecsv import UnicodeWriter | ||||
| from .forms import NameForm | ||||
| 
 | ||||
| from datetime import timedelta, date, datetime | ||||
|  | @ -34,7 +35,7 @@ import csv | |||
| def verejna_temata(rocnik): | ||||
| 	"""Vrací queryset zveřejněných témat v daném ročníku. | ||||
| 	""" | ||||
| 	return Tema.objects.filter(rocnik=rocnik).order_by('kod') #FIXME Ještě je potřeba zjistit, jestli je tematko verejne. | ||||
| 	return Problem.objects.filter(typ=Problem.TYP_TEMA, cislo_zadani__rocnik=rocnik, cislo_zadani__verejne_db=True).order_by('kod') | ||||
| 
 | ||||
| 
 | ||||
| def AktualniZadaniView(request): | ||||
|  | @ -377,39 +378,103 @@ class ProblemView(generic.DetailView): | |||
| 		return context | ||||
| 
 | ||||
| 
 | ||||
| class RadekVysledkovky(object): | ||||
| 	pass | ||||
| class VysledkyResitele(object): | ||||
| 	#resitel_jmeno = models.CharField('jméno řešitele', max_length=256) | ||||
| 	#resitel_prijmeni = CharField('příjmení', max_length=256) | ||||
| 
 | ||||
| #class CisloView(generic.DetailView): | ||||
| #	model = Cislo | ||||
| #	template_name = 'seminar/archiv/cislo.html' | ||||
| # | ||||
| #	# Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik) | ||||
| #	def get_object(self, queryset=None): | ||||
| #		if queryset is None: | ||||
| #			queryset = self.get_queryset() | ||||
| #		rocnik_arg = self.kwargs.get('rocnik') | ||||
| #		cislo_arg = self.kwargs.get('cislo') | ||||
| #		queryset = queryset.filter(rocnik__rocnik=rocnik_arg, cislo=cislo_arg) | ||||
| # | ||||
| #		try: | ||||
| #			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): | ||||
| #		context = super(CisloView, self).get_context_data(**kwargs) | ||||
| # | ||||
| #		vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = context['cislo']).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno') | ||||
| 	def __init__(self, jmeno, prijmeni): | ||||
| 		resitel_jmeno = jmeno | ||||
| 		resitel_prijmeni = prijmeni | ||||
| 		body = {} | ||||
| 
 | ||||
| 	def body_za_cislo(self): | ||||
| 		return sum(body.values()) | ||||
| 
 | ||||
| class CisloView(generic.DetailView): | ||||
| 	model = Cislo | ||||
| 	template_name = 'seminar/archiv/cislo.html' | ||||
| 
 | ||||
|        # Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik) | ||||
| 	def get_object(self, queryset=None): | ||||
| 		if queryset is None: | ||||
| 			queryset = self.get_queryset() | ||||
| 		rocnik_arg = self.kwargs.get('rocnik') | ||||
| 		cislo_arg = self.kwargs.get('cislo') | ||||
| 		queryset = queryset.filter(rocnik__rocnik=rocnik_arg, cislo=cislo_arg) | ||||
| 
 | ||||
| 		try: | ||||
| 			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 | ||||
| 
 | ||||
| 	# spočítá součet bodů získaných daným řešitelem za zadaný problém a všechny jeho podproblémy | ||||
| 	def __soucet_resitele_problemu(problem, resitel, soucet): | ||||
| 		# FIXME: správně je nadproblem_(typ problemu), ale to by bylo potřeba nějak  | ||||
| 		# zjistit, jaký typ nodu to vlastně je a aplikovat to ve volání funkce | ||||
| 	 | ||||
| 		# sečteme body za daný problém přes všechna řešení daného problému  | ||||
| 		# od daného řešitele | ||||
| 		reseni_resitele = problem.hodnoceni_set.filter(reseni_resitele__contains=resitel) | ||||
| 		for r in reseni_resitele: | ||||
| 			soucet += r.body | ||||
| 
 | ||||
| 		for p in problem.nadproblem_set:  | ||||
| 		# i přes jméno by to měla být množina jeho podproblémů | ||||
| 			soucet += __soucet_resitele_problemu(p, resitel, soucet) | ||||
| 		return soucet | ||||
| 
 | ||||
| 
 | ||||
| 	def vysledky_resitele_problemu(problem, resitel, cislo): | ||||
| 		return __soucet_resitele_problemu(problem, resitel, 0)	 | ||||
| 		 | ||||
| 
 | ||||
| 	def get_context_data(self, **kwargs): | ||||
| 		context = super(CisloView, self).get_context_data(**kwargs) | ||||
| 
 | ||||
| 		## TODO upravit dle nového modelu | ||||
| 		cislo = context['cislo'] | ||||
| 		hodnoceni = cislo.hodnoceni_set	# hodnocení, která se vážou k danému číslu | ||||
| 		 | ||||
| 		reseni = [h.reseni for h in hodnoceni] | ||||
| 		problemy = [h.problem for h in hodnoceni] | ||||
| 		problemy_set = set(problemy)	# chceme každý problém unikátně, | ||||
| 		problemy = (list(problemy_set)) # převedení na množinu a zpět to zaručí | ||||
| 
 | ||||
| 		# hlavní problémy čísla  | ||||
| 		# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) | ||||
| 		hlavni_problemy = [] | ||||
| 		for p in problemy: | ||||
| 			while not(p.nadproblem == None): | ||||
| 				p = nadproblem | ||||
| 			hlavni_problemy.append(p) | ||||
| 
 | ||||
| 		# zunikátnění | ||||
| 		hlavni_problemy_set = set(hlavni_problemy) | ||||
| 		hlavni_problemy = list(hlavni_problemy_set) | ||||
| 
 | ||||
| 		## TODO dostat pro tyto problémy součet v daném čísle pro daného řešitele | ||||
| 		## TODO možná chytřeji vybírat aktivní řešitele | ||||
| 		## chceme letos něco poslal | ||||
| 		aktivni_resitele = Resitel.objects.filter( | ||||
| 				rok_maturity__gte=context['rocnik'].druhy_rok()) | ||||
| 				#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik) | ||||
| 		udaje_vysledkovky = {} | ||||
| 		for ar in aktivni_resitele: | ||||
| 			vr = VysledkyResitele(ar.jmeno, ar.prijmeni) | ||||
| 			for h in hlavni_problemy: | ||||
| 				vr.body[h.id] = vysledky_resitele_problemu(h, ar, cislo) | ||||
| 
 | ||||
| 		vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = context['cislo']).\ | ||||
| 			order_by('-body', 'resitel__prijmeni', 'resitel__jmeno') | ||||
| #		reseni = Reseni.objects.filter(cislo_body = context['cislo']).select_related("resitel") | ||||
| # | ||||
| #		# typy úloh, které se mají zobrazovat u čísla, tj. těch, které byly v čísle skutečně zadány | ||||
| 
 | ||||
| 		# typy úloh, které se mají zobrazovat u čísla, tj. těch, které byly  | ||||
| 		# v čísle skutečně zadány | ||||
| #		typy_skutecne_zadanych = [Problem.TYP_ULOHA, Problem.TYP_SERIAL, Problem.TYP_ORG_CLANEK] | ||||
| #		v_cisle_zadane = Problem.objects.filter(cislo_zadani=context['cislo']).filter(typ__in=typy_skutecne_zadanych).order_by('kod') | ||||
| # | ||||
| 
 | ||||
| #		resene_problemy = Problem.objects.filter(cislo_reseni=context['cislo']).filter(typ__in=typy_skutecne_zadanych).order_by('cislo_zadani__cislo', 'kod') | ||||
| # | ||||
| #		poradi_typu = { | ||||
|  | @ -465,7 +530,11 @@ class ArchivTemataView(generic.ListView): | |||
| 
 | ||||
| ### Generovani vysledkovky | ||||
| 
 | ||||
| #class CisloVysledkovkaView(CisloView): | ||||
| #class CisloVysledkovkaView(CisloView):i | ||||
| #	poradi | titul. jmeno prijmeni | ulohy | za cislo | celkem | odjakziva | ||||
| # | ||||
| # | ||||
| # | ||||
| #	model = Cislo | ||||
| #	template_name = 'seminar/archiv/cislo_vysledkovka.tex' | ||||
| #	#content_type = 'application/x-tex; charset=UTF8' | ||||
|  | @ -628,10 +697,10 @@ def soustredeniUcastniciExportView(request,soustredeni): | |||
| 	response = HttpResponse(content_type='text/csv') | ||||
| 	response['Content-Disposition'] = 'attachment; filename="ucastnici.csv"' | ||||
| 
 | ||||
| 	writer = csv.writer(response) | ||||
| 	writer = UnicodeWriter(response) | ||||
| 	writer.writerow(["jmeno", "prijmeni", "rok_maturity", "telefon", "email", "ulice", "mesto", "psc","stat"]) | ||||
| 	for u in ucastnici: | ||||
| 		writer.writerow([u.osoba.jmeno, u.osoba.prijmeni, str(u.rok_maturity), u.osoba.telefon, u.osoba.email, u.osoba.ulice, u.osoba.mesto, u.osoba.psc, u.osoba.stat.name]) | ||||
| 		writer.writerow([u.jmeno, u.prijmeni, str(u.rok_maturity), u.telefon, u.email, u.ulice, u.mesto, u.psc, u.stat.name]) | ||||
| 	return response | ||||
| 
 | ||||
| 
 | ||||
|  | @ -641,7 +710,7 @@ def soustredeniUcastniciExportView(request,soustredeni): | |||
| class ClankyResitelView(generic.ListView): | ||||
| 	model = Problem | ||||
| 	template_name = 'seminar/clanky/resitelske_clanky.html' | ||||
| 	queryset = Clanek.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo__rocnik').order_by('-cislo__rocnik__rocnik', 'kod') | ||||
| 	queryset = Clanek.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo_zadani__rocnik').order_by('-cislo_zadani__rocnik__rocnik', 'kod') | ||||
| 
 | ||||
| # FIXME: pokud chceme orgoclanky, tak nejak zavest do modelu a podle toho odkomentovat a upravit | ||||
| #class ClankyOrganizatorView(generic.ListView)<F12>: | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Anet
						Anet