Merge branch 'data_migrations' of gimli.ms.mff.cuni.cz:/akce/mam/git/mamweb into data_migrations
This commit is contained in:
		
						commit
						0dc5442c99
					
				
					 3 changed files with 126 additions and 38 deletions
				
			
		|  | @ -284,8 +284,18 @@ class Resitel(SeminarModelBase): | ||||||
| 		else: | 		else: | ||||||
| 			return 'Z' + str(rozdil + 9) | 			return 'Z' + str(rozdil + 9) | ||||||
| 
 | 
 | ||||||
| 	def get_titul(self, celkove_body): | 	def vsechny_body(self): | ||||||
| 		"Vrati titul podle zadaneho poctu bodu." | 		"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: | 		if celkove_body < 10: | ||||||
| 			return '' | 			return '' | ||||||
| 		elif celkove_body < 20: | 		elif celkove_body < 20: | ||||||
|  | @ -1370,7 +1380,6 @@ class Novinky(models.Model): | ||||||
| 	datum = models.DateField(auto_now_add=True) | 	datum = models.DateField(auto_now_add=True) | ||||||
| 
 | 
 | ||||||
| 	text = models.TextField('Text novinky', blank=True, null=True) | 	text = models.TextField('Text novinky', blank=True, null=True) | ||||||
| 
 |  | ||||||
| 	obrazek = models.ImageField('Obrázek', upload_to='image_novinky/%Y/%m/%d/', | 	obrazek = models.ImageField('Obrázek', upload_to='image_novinky/%Y/%m/%d/', | ||||||
| 			null=True, blank=True) | 			null=True, blank=True) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -255,6 +255,8 @@ def gen_rocniky(last_rocnik, size): | ||||||
| def gen_konfery(size, rnd, organizatori, resitele, soustredeni): | def gen_konfery(size, rnd, organizatori, resitele, soustredeni): | ||||||
| 	konfery = [] | 	konfery = [] | ||||||
| 	for _ in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?) | 	for _ in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?) | ||||||
|  | 		# Anet: size je parametr udávající velikost testovacích dat a dá se pomocí ní škálovat,  | ||||||
|  | 		# kolik dat se nageneruje  | ||||||
| 		konfera = Konfera.objects.create( | 		konfera = Konfera.objects.create( | ||||||
| 			nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']), | 			nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']), | ||||||
| 			anotace=lorem.paragraph(), | 			anotace=lorem.paragraph(), | ||||||
|  |  | ||||||
							
								
								
									
										145
									
								
								seminar/views.py
									
									
									
									
									
								
							
							
						
						
									
										145
									
								
								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 Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Tema, Clanek | ||||||
| #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | ||||||
| from . import utils | from . import utils | ||||||
|  | from .unicodecsv import UnicodeWriter | ||||||
| from .forms import NameForm | from .forms import NameForm | ||||||
| 
 | 
 | ||||||
| from datetime import timedelta, date, datetime | from datetime import timedelta, date, datetime | ||||||
|  | @ -34,7 +35,7 @@ import csv | ||||||
| def verejna_temata(rocnik): | def verejna_temata(rocnik): | ||||||
| 	"""Vrací queryset zveřejněných témat v daném ročníku. | 	"""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): | def AktualniZadaniView(request): | ||||||
|  | @ -377,39 +378,111 @@ class ProblemView(generic.DetailView): | ||||||
| 		return context | 		return context | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class RadekVysledkovky(object): | class VysledkyResitele(object): | ||||||
| 	pass | 	"""Pro daného řešitele ukládá počet bodů za jednotlivé úlohy a celkový | ||||||
|  | 	počet bodů za číslo.""" | ||||||
| 
 | 
 | ||||||
| #class CisloView(generic.DetailView): | 	def __init__(self, jmeno, prijmeni): | ||||||
| #	model = Cislo | 		resitel_jmeno = jmeno | ||||||
| #	template_name = 'seminar/archiv/cislo.html' | 		resitel_prijmeni = prijmeni | ||||||
| # | 		body = {} | ||||||
| #	# Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik) | 		body_cislo = 0 | ||||||
| #	def get_object(self, queryset=None): | 
 | ||||||
| #		if queryset is None: | 	def body_za_cislo(self): | ||||||
| #			queryset = self.get_queryset() | 		return sum(body.values()) | ||||||
| #		rocnik_arg = self.kwargs.get('rocnik') | 
 | ||||||
| #		cislo_arg = self.kwargs.get('cislo') | class CisloView(generic.DetailView): | ||||||
| #		queryset = queryset.filter(rocnik__rocnik=rocnik_arg, cislo=cislo_arg) | 	model = Cislo | ||||||
| # | 	template_name = 'seminar/archiv/cislo.html' | ||||||
| #		try: | 
 | ||||||
| #			obj = queryset.get() |        # Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik) | ||||||
| #		except queryset.model.DoesNotExist: | 	def get_object(self, queryset=None): | ||||||
| #			raise Http404(_("No %(verbose_name)s found matching the query") % | 		if queryset is None: | ||||||
| #						{'verbose_name': queryset.model._meta.verbose_name}) | 			queryset = self.get_queryset() | ||||||
| #		return obj | 		rocnik_arg = self.kwargs.get('rocnik') | ||||||
| # | 		cislo_arg = self.kwargs.get('cislo') | ||||||
| # | 		queryset = queryset.filter(rocnik__rocnik=rocnik_arg, cislo=cislo_arg) | ||||||
| #	def get_context_data(self, **kwargs): | 
 | ||||||
| #		context = super(CisloView, self).get_context_data(**kwargs) | 		try: | ||||||
| # | 			obj = queryset.get() | ||||||
| #		vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = context['cislo']).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno') | 		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) | ||||||
|  | 		radky_vysledkovky = [] | ||||||
|  | 		for ar in aktivni_resitele: | ||||||
|  | 			vr = VysledkyResitele(ar.jmeno, ar.prijmeni) | ||||||
|  | 			for h in hlavni_problemy:  | ||||||
|  | 				body = vysledky_resitele_problemu(h, ar, cislo) | ||||||
|  | 				vr.body[h.kod_v_rocniku] = body | ||||||
|  | 				vr.body_cislo = vr.body_cislo + body  | ||||||
|  | 			radky_vysledkovky.append(vr) | ||||||
|  | 
 | ||||||
|  | 		## TODO: spočítat počet bodů řešitele v daném ročníku a seřadit je podle toho | ||||||
|  | 		## TODO: možná použít tyto funkce i v RocnikVysledkovkaView (a umístit sem nebo tam)? | ||||||
|  | 		 | ||||||
|  | 
 | ||||||
|  | #		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") | #		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] | #		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') | #		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') | #		resene_problemy = Problem.objects.filter(cislo_reseni=context['cislo']).filter(typ__in=typy_skutecne_zadanych).order_by('cislo_zadani__cislo', 'kod') | ||||||
| # | # | ||||||
| #		poradi_typu = { | #		poradi_typu = { | ||||||
|  | @ -465,7 +538,11 @@ class ArchivTemataView(generic.ListView): | ||||||
| 
 | 
 | ||||||
| ### Generovani vysledkovky | ### Generovani vysledkovky | ||||||
| 
 | 
 | ||||||
| #class CisloVysledkovkaView(CisloView): | #class CisloVysledkovkaView(CisloView):i | ||||||
|  | #	poradi | titul. jmeno prijmeni | ulohy | za cislo | celkem | odjakziva | ||||||
|  | # | ||||||
|  | # | ||||||
|  | # | ||||||
| #	model = Cislo | #	model = Cislo | ||||||
| #	template_name = 'seminar/archiv/cislo_vysledkovka.tex' | #	template_name = 'seminar/archiv/cislo_vysledkovka.tex' | ||||||
| #	#content_type = 'application/x-tex; charset=UTF8' | #	#content_type = 'application/x-tex; charset=UTF8' | ||||||
|  | @ -628,10 +705,10 @@ def soustredeniUcastniciExportView(request,soustredeni): | ||||||
| 	response = HttpResponse(content_type='text/csv') | 	response = HttpResponse(content_type='text/csv') | ||||||
| 	response['Content-Disposition'] = 'attachment; filename="ucastnici.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"]) | 	writer.writerow(["jmeno", "prijmeni", "rok_maturity", "telefon", "email", "ulice", "mesto", "psc","stat"]) | ||||||
| 	for u in ucastnici: | 	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 | 	return response | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -641,7 +718,7 @@ def soustredeniUcastniciExportView(request,soustredeni): | ||||||
| class ClankyResitelView(generic.ListView): | class ClankyResitelView(generic.ListView): | ||||||
| 	model = Problem | 	model = Problem | ||||||
| 	template_name = 'seminar/clanky/resitelske_clanky.html' | 	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 | # FIXME: pokud chceme orgoclanky, tak nejak zavest do modelu a podle toho odkomentovat a upravit | ||||||
| #class ClankyOrganizatorView(generic.ListView)<F12>: | #class ClankyOrganizatorView(generic.ListView)<F12>: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Kateřina Čížková
						Kateřina Čížková