Upraveny výsledkovky
'–' místo ' -- ', v posledním rozsahu pořadí nechybí horní mez, v ročníku funguje součet bodů za čísla, ^MM se nezobrazuje, když řešitel nemá titul, trochu zkrácen view
This commit is contained in:
		
							parent
							
								
									5543e368d2
								
							
						
					
					
						commit
						0723b3421f
					
				
					 3 changed files with 74 additions and 107 deletions
				
			
		|  | @ -34,17 +34,21 @@ | ||||||
|       {% for p in problemy %} |       {% for p in problemy %} | ||||||
|       <th class='border-r'><a href="{{ p.verejne_url }}">{{ p.cislo_zadani.cislo }}.{{ p.kod }}</a> |       <th class='border-r'><a href="{{ p.verejne_url }}">{{ p.cislo_zadani.cislo }}.{{ p.kod }}</a> | ||||||
|       {% endfor %} |       {% endfor %} | ||||||
|       <th class='border-r'>Sum<sup>-1</sup> |       <th class='border-r'>Za číslo</sup> | ||||||
|       <th class='border-r'>Celkem |       <th class='border-r'>Za ročník | ||||||
|       <th class='border-r'>Odjakživa |       <th class='border-r'>Odjakživa | ||||||
|   {% for rv in vysledkovka %} |   {% for rv in vysledkovka %} | ||||||
|     <tr> |     <tr> | ||||||
|       <td class='border-r'>{{ rv.poradi }} |       <td class='border-r'>{% autoescape off %}{{ rv.poradi }}{% endautoescape %} | ||||||
| 		  <th class='border-r'> {{ rv.titul }} <sup>MM</sup> {{ rv.resitel.plne_jmeno }} | 		  <th class='border-r'> | ||||||
|       {% for b in rv.body %} |           {% if rv.titul %} | ||||||
|  |             {{ rv.titul }}<sup>MM</sup> | ||||||
|  |           {% endif %} | ||||||
|  |           {{ rv.resitel.plne_jmeno }} | ||||||
|  |       {% for b in rv.body_ulohy %} | ||||||
|       <td class='border-r'>{{ b }} |       <td class='border-r'>{{ b }} | ||||||
|       {% endfor %} |       {% endfor %} | ||||||
|       <td class='border-r'>{{ rv.body_minule }} |       <td class='border-r'>{{ rv.body_cislo }} | ||||||
|       <td class='border-r'><b>{{ rv.body_celkem_rocnik }}</b> |       <td class='border-r'><b>{{ rv.body_celkem_rocnik }}</b> | ||||||
|       <td class='border-r'>{{ rv.body_celkem_odjakziva }} |       <td class='border-r'>{{ rv.body_celkem_odjakziva }} | ||||||
|     </tr> |     </tr> | ||||||
|  |  | ||||||
|  | @ -30,11 +30,15 @@ | ||||||
| 
 | 
 | ||||||
|     {% for rv in vysledkovka %} |     {% for rv in vysledkovka %} | ||||||
|       <tr> |       <tr> | ||||||
|         <td class='border-r'>{{ rv.poradi }} |         <td class='border-r'>{% autoescape off %}{{ rv.poradi }}{% endautoescape %} | ||||||
|         <th class='border-r'> {{ rv.resitel.titul }} <sup>MM</sup> {{ rv.resitel.plne_jmeno }} |         <th class='border-r'> | ||||||
|  |           {% if rv.titul %} | ||||||
|  |             {{ rv.titul }}<sup>MM</sup> | ||||||
|  |           {% endif %} | ||||||
|  |           {{ rv.resitel.plne_jmeno }} | ||||||
|         <td class='border-r'>{{ rv.resitel.rocnik }} |         <td class='border-r'>{{ rv.resitel.rocnik }} | ||||||
|         <td class='border-r'>{{ rv.body_odjakziva }} |         <td class='border-r'>{{ rv.body_odjakziva }} | ||||||
|         {% for b in rv.body %} |         {% for b in rv.body_cisla %} | ||||||
|         <td class='border-r'>{{ b }} |         <td class='border-r'>{{ b }} | ||||||
|         {% endfor %} |         {% endfor %} | ||||||
|         <td class='border-r'><b>{{ rv.body_rocnik }}</b> |         <td class='border-r'><b>{{ rv.body_rocnik }}</b> | ||||||
|  |  | ||||||
							
								
								
									
										155
									
								
								seminar/views.py
									
									
									
									
									
								
							
							
						
						
									
										155
									
								
								seminar/views.py
									
									
									
									
									
								
							|  | @ -12,6 +12,7 @@ from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjak | ||||||
| from . import utils | from . import utils | ||||||
| 
 | 
 | ||||||
| import datetime | import datetime | ||||||
|  | from itertools import groupby | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def AktualniZadaniView(request): | def AktualniZadaniView(request): | ||||||
|  | @ -72,6 +73,26 @@ class CislaView(generic.ListView): | ||||||
|     model = Rocnik |     model = Rocnik | ||||||
|     template_name='seminar/archiv/cisla.html' |     template_name='seminar/archiv/cisla.html' | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | def sloupec_s_poradim(vysledky): | ||||||
|  |     # počet řešitelů ve výsledkovce nad aktuálním | ||||||
|  |     lepsich_resitelu = 0 | ||||||
|  | 
 | ||||||
|  |     poradi_l = [] | ||||||
|  |     # projdeme skupiny řešitelů se stejným počtem bodů | ||||||
|  |     for skupina in (list(x) for _, x in groupby(vysledky, lambda x: x.body)): | ||||||
|  | 
 | ||||||
|  |         # připravíme si obsahy buněk ve sloupci pořadí pro skupinu | ||||||
|  |         if len(skupina) == 1: | ||||||
|  |             poradi_l += ["{}.".format(lepsich_resitelu + 1)] | ||||||
|  |         # je-li účastníků se stejným počtem bodů víc, pořadí (rozsah X.-Y.) je jen u prvního | ||||||
|  |         else: | ||||||
|  |             poradi_l += ["{}.–{}.".format(lepsich_resitelu + 1, lepsich_resitelu + len(skupina))] + [""] * (len(skupina)-1) | ||||||
|  |         lepsich_resitelu += len(skupina) | ||||||
|  | 
 | ||||||
|  |     return poradi_l | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class RocnikView(generic.DetailView): | class RocnikView(generic.DetailView): | ||||||
|     model = Rocnik |     model = Rocnik | ||||||
|     template_name = 'seminar/archiv/rocnik.html' |     template_name = 'seminar/archiv/rocnik.html' | ||||||
|  | @ -93,71 +114,40 @@ class RocnikView(generic.DetailView): | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super(RocnikView, self).get_context_data(**kwargs) |         context = super(RocnikView, self).get_context_data(**kwargs) | ||||||
| 
 | 
 | ||||||
|         cisla_v_rocniku = VysledkyKCisluZaRocnik.objects.filter(cislo__verejna_vysledkovka = True).filter(cislo__rocnik = context['rocnik']).order_by('-cislo') |         cisla_v_rocniku = VysledkyKCisluZaRocnik.objects.filter(cislo__verejna_vysledkovka = True).filter(cislo__rocnik = context['rocnik']).order_by('cislo') | ||||||
|         #vyberu vsechny verejne vysledky z rocniku |         #vyberu vsechny verejne vysledky z rocniku | ||||||
|         #pokud žádné nejsou, výsledkovka se nezobrazí |         #pokud žádné nejsou, výsledkovka se nezobrazí | ||||||
|         if cisla_v_rocniku: |         if cisla_v_rocniku: | ||||||
|             vysledky = cisla_v_rocniku.filter(cislo = cisla_v_rocniku[0].cislo).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno').select_related('resitel') |             vysledky = list(cisla_v_rocniku.filter(cislo = cisla_v_rocniku[0].cislo).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno').select_related('resitel')) | ||||||
|             #vybere vsechny vysledky z posledniho verejneho cisla a setridi sestupne dle bodu |             #vybere vsechny vysledky z posledniho verejneho cisla a setridi sestupne dle bodu | ||||||
|             vysledky_resitele = {} |  | ||||||
|             stejne_body = {} |  | ||||||
|             konec_rozmezi = {} |  | ||||||
|             vysledkovka = [] |             vysledkovka = [] | ||||||
|             posledni_body = 100000 |  | ||||||
|             predchozi_poradi = None |  | ||||||
|             body_minule = None |  | ||||||
| 
 | 
 | ||||||
|             for vi in range(len(vysledky)): |             # doplníme některé údaje do řádků výsledkovky pro řešitele ve skupině | ||||||
|                 v = vysledky[vi] |             for poradi, v in zip(sloupec_s_poradim(vysledky), vysledky): | ||||||
|                 rv = RadekVysledkovky() |                 v.poradi = poradi | ||||||
|                 rv.resitel = v.resitel   |                 v.resitel.rocnik = v.resitel.rocnik(context['rocnik']) | ||||||
|  | 
 | ||||||
|                 verejne_vysl_odjakziva = VysledkyKCisluOdjakziva.objects.filter(cislo__verejna_vysledkovka = True).filter(cislo__rocnik = context['rocnik']).filter(cislo = cisla_v_rocniku[0].cislo) |                 verejne_vysl_odjakziva = VysledkyKCisluOdjakziva.objects.filter(cislo__verejna_vysledkovka = True).filter(cislo__rocnik = context['rocnik']).filter(cislo = cisla_v_rocniku[0].cislo) | ||||||
|                 rv.body_odjakziva = verejne_vysl_odjakziva.filter(resitel = rv.resitel)[0].body | 
 | ||||||
|                 rv.resitel.titul = rv.resitel.get_titul(rv.body_odjakziva) |                 v.body_odjakziva = verejne_vysl_odjakziva.filter(resitel = v.resitel)[0].body | ||||||
|                 rv.resitel.rocnik = rv.resitel.rocnik(context['rocnik']) |                 v.titul = v.resitel.get_titul(v.body_odjakziva) | ||||||
|                 rv.body = []*len(context['rocnik'].verejna_cisla()) |                 v.body_rocnik = v.body | ||||||
|  |                 v.body_cisla = [] | ||||||
|  | 
 | ||||||
|                 #pokud pro dany rok a cislo nema resitel vysledky, ma defaultne 0 |                 #pokud pro dany rok a cislo nema resitel vysledky, ma defaultne 0 | ||||||
|                 for cis in context['rocnik'].verejna_cisla(): |                 for cis in context['rocnik'].verejna_cisla(): | ||||||
|                     if cis.verejna_vysledkovka: |                     if cis.verejna_vysledkovka: | ||||||
|                         print cis |                         body_za_cislo = VysledkyZaCislo.objects.filter(cislo__rocnik = context['rocnik']).filter(cislo = cis).filter(resitel = v.resitel) | ||||||
|                         body_za_cislo = VysledkyZaCislo.objects.filter(cislo__rocnik = context['rocnik']).filter(cislo = cis).filter(resitel = rv.resitel) |  | ||||||
|                         #seznam vysledku se spravnym rocnikem a cislem pro resitele |                         #seznam vysledku se spravnym rocnikem a cislem pro resitele | ||||||
|                         #zobrazim jen je-li vysledkovka verejna |                         #zobrazim jen je-li vysledkovka verejna | ||||||
|                         if body_za_cislo: |                         if body_za_cislo: | ||||||
|                             rv.body.append(body_za_cislo[0].body) |                             v.body_cisla.append(body_za_cislo[0].body) | ||||||
|                             #neprazdne vysledky by mely obsahovat prave jeden vysledek |                             #neprazdne vysledky by mely obsahovat prave jeden vysledek | ||||||
|                         else: |                         else: | ||||||
|                             rv.body.append(0) |                             v.body_cisla.append(0) | ||||||
|                             #resitel nema za cislo body |                             #resitel nema za cislo body | ||||||
|                 rv.poradi = '' | 
 | ||||||
|                 #defaultni poradi je prazdne - kvuli sdilenym mistum |                 vysledkovka.append(v) | ||||||
|                 rv.body_rocnik = v.body |  | ||||||
|                 rv.body_na_zacatku = rv.body_odjakziva - rv.body_rocnik |  | ||||||
|                 #body za minule rocniky |  | ||||||
|                 if posledni_body > v.body: |  | ||||||
|                     if stejne_body.get(posledni_body): |  | ||||||
|                         #pokud uz jsme predtim narazili na stejny pocet bodu |  | ||||||
|                         konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body] |  | ||||||
|                         #druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body |  | ||||||
|                         predchozi_poradi.poradi = '{0}. -- {1}.'.format(predchozi_poradi.poradi,konec_rozmezi[posledni_body]) |  | ||||||
|                         #predchozi radek ktery menil pocty bodu bude mit rozsah, pokud bylo vice radku se stejnym poctem bodu |  | ||||||
|                     elif predchozi_poradi : |  | ||||||
|                         predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi) |  | ||||||
|                         #pokud nebyl rozsah hodnot, vypisu, pridam tecku za cislo |  | ||||||
|                     posledni_body = v.body |  | ||||||
|                     rv.poradi = vi + 1 |  | ||||||
|                     #poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly |  | ||||||
|                     predchozi_poradi = rv |  | ||||||
|                 elif posledni_body == v.body: |  | ||||||
|                     if not stejne_body.get(v.body): |  | ||||||
|                         stejne_body[v.body] = 1 |  | ||||||
|                         #pokud klic neexistuje, zalozim novy pro tohoto resitele |  | ||||||
|                     else: |  | ||||||
|                         stejne_body[v.body] += 1 |  | ||||||
|                         #rozsirim pocet resitelu sdilejici stejnou pozici |  | ||||||
|                 vysledky_resitele[v.resitel.id] = rv |  | ||||||
|                 #odkaz na radek vysledkovky patrici danemu resiteli |  | ||||||
|                 vysledkovka.append(rv) |  | ||||||
| 
 | 
 | ||||||
|             context['vysledkovka'] = vysledkovka |             context['vysledkovka'] = vysledkovka | ||||||
|         return context |         return context | ||||||
|  | @ -188,6 +178,7 @@ class CisloView(generic.DetailView): | ||||||
|                           {'verbose_name': queryset.model._meta.verbose_name}) |                           {'verbose_name': queryset.model._meta.verbose_name}) | ||||||
|         return obj |         return obj | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super(CisloView, self).get_context_data(**kwargs) |         context = super(CisloView, self).get_context_data(**kwargs) | ||||||
| 
 | 
 | ||||||
|  | @ -208,60 +199,28 @@ class CisloView(generic.DetailView): | ||||||
|             #umoznuje zjistit index podle id problemu |             #umoznuje zjistit index podle id problemu | ||||||
| 
 | 
 | ||||||
|         vysledky_resitele = {} |         vysledky_resitele = {} | ||||||
|         stejne_body = {} |  | ||||||
|         konec_rozmezi = {} |  | ||||||
|         vysledkovka = [] |         vysledkovka = [] | ||||||
|         posledni_body = 100000 |  | ||||||
|         predchozi_poradi = None |  | ||||||
|         body_minule = None |  | ||||||
| 
 | 
 | ||||||
|         for vi in range(len(vysledky)): |         # doplníme některé údaje do řádků výsledkovky pro řešitele ve skupině | ||||||
|             v = vysledky[vi] |         for poradi, v in zip(sloupec_s_poradim(vysledky), vysledky): | ||||||
|             tv = RadekVysledkovky() |             v.poradi = poradi | ||||||
|             tv.resitel = v.resitel   |             v.body_celkem_rocnik = v.body | ||||||
|             tv.resitel.titul = tv.resitel.get_titul(v.body) |             v.body_celkem_odjakziva = VysledkyKCisluOdjakziva.objects.get(resitel=v.resitel, cislo=context['cislo']).body | ||||||
|             tv.rocnik = tv.resitel.rocnik(context['cislo'].rocnik) |             v.body_ulohy = [0] * len(problemy) | ||||||
|             tv.vysledek = v |             v.titul = v.resitel.get_titul(v.body_celkem_odjakziva) | ||||||
|             #odkazuje na VysledkyKCislu | 
 | ||||||
|             tv.body = ['']*len(problemy) |  | ||||||
|             #pole bodu za ulohy |  | ||||||
|             tv.poradi = '' |  | ||||||
|             #defaultni poradi je prazdne - kvuli sdilenym mistum |  | ||||||
|             tv.body_celkem_rocnik = v.body |  | ||||||
|             tv.body_celkem_odjakziva = VysledkyKCisluOdjakziva.objects.get(resitel=v.resitel, cislo=context['cislo']).body |  | ||||||
|             body_cislo_q = VysledkyZaCislo.objects.filter(resitel=v.resitel, cislo=context['cislo']) |             body_cislo_q = VysledkyZaCislo.objects.filter(resitel=v.resitel, cislo=context['cislo']) | ||||||
|             tv.body_cislo = body_cislo_q[0].body if len(body_cislo_q) > 0 else 0 |             v.body_cislo = body_cislo_q[0].body if body_cislo_q else 0 | ||||||
|             tv.body_minule = tv.body_celkem_rocnik - tv.body_cislo |  | ||||||
|             tv.titul=tv.resitel.get_titul(int(tv.body_celkem_odjakziva)) |  | ||||||
|             #pocet bodu do tohoto cisla |  | ||||||
|             if posledni_body > tv.body_celkem_rocnik: |  | ||||||
|                 if stejne_body.get(posledni_body): |  | ||||||
|                     konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body] |  | ||||||
|                     #druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body |  | ||||||
|                     predchozi_poradi.poradi = '{0}. -- {1}.'.format(predchozi_poradi.poradi,konec_rozmezi[posledni_body]) |  | ||||||
|                     #predchozi radek ktery menil pocty bodu bude mit rozsah, pokud bylo vice radku se stejnym poctem bodu |  | ||||||
|                 elif predchozi_poradi : |  | ||||||
|                     predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi) |  | ||||||
|                     #pokud nebyl rozsah hodnot, pridam tecku za cislo |  | ||||||
|                 posledni_body = tv.body_celkem_rocnik |  | ||||||
|                 tv.poradi = vi + 1 |  | ||||||
|                 #poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly |  | ||||||
|                 predchozi_poradi = tv |  | ||||||
|             elif posledni_body == tv.body_celkem_rocnik: |  | ||||||
|                 if not stejne_body.get(tv.body_celkem_rocnik): |  | ||||||
|                     stejne_body[tv.body_celkem_rocnik] = 1 |  | ||||||
|                     #pokud klic neexistuje, zalozim novy pro tohoto resitele |  | ||||||
|                 else: |  | ||||||
|                     stejne_body[tv.body_celkem_rocnik] += 1 |  | ||||||
|                     #rozsirim pocet resitelu sdilejici stejnou pozici |  | ||||||
|             vysledky_resitele[v.resitel.id] = tv |  | ||||||
|             #odkaz na radek vysledkovky patrici danemu resiteli |  | ||||||
|             vysledkovka.append(tv) |  | ||||||
| 
 | 
 | ||||||
|  |             vysledkovka.append(v) | ||||||
|  | 
 | ||||||
|  |             # připravíme si odkaz na řádek, abychom do něj mohli doplnit body za jednotlivé úlohy | ||||||
|  |             vysledky_resitele[v.resitel.id] = v | ||||||
|  | 
 | ||||||
|  |         # za každé řešení doplníme k příslušnému řešiteli a úloze body | ||||||
|         for r in reseni: |         for r in reseni: | ||||||
|             vysledky_resitele[r.resitel.id].body[problem_index[r.problem.id]] = r.body |            vysledky_resitele[r.resitel.id].body_ulohy[problem_index[r.problem.id]] = r.body | ||||||
|          |                  | ||||||
| 
 |  | ||||||
|         context['vysledkovka'] = vysledkovka |         context['vysledkovka'] = vysledkovka | ||||||
|         context['problemy'] = problemy |         context['problemy'] = problemy | ||||||
|         context['v_cisle_zadane'] = v_cisle_zadane |         context['v_cisle_zadane'] = v_cisle_zadane | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Matěj Kocián
						Matěj Kocián