Součty
Hnusně, ale přece…
This commit is contained in:
		
							parent
							
								
									bef932345c
								
							
						
					
					
						commit
						86f6d47f10
					
				
					 2 changed files with 14 additions and 6 deletions
				
			
		|  | @ -36,13 +36,16 @@ Do data (včetně): {{ filtr.reseni_do }} | ||||||
| 			{# TODO: Chceme mít view i na řešení konkrétního řešitele ke všem problémům? #} | 			{# TODO: Chceme mít view i na řešení konkrétního řešitele ke všem problémům? #} | ||||||
| 			{{ resitel }} | 			{{ resitel }} | ||||||
| 		</td> | 		</td> | ||||||
| 		{% for bunka in hodnoty %} | 		{% for soucet,bunka in hodnoty %} | ||||||
| 			<td> | 			<td> | ||||||
| 			{% for reseni,hodnoceni in bunka %} | 			{% for reseni,hodnoceni in bunka %} | ||||||
| 				<a href="{% url 'odevzdavatko_detail_reseni' pk=reseni.id %}"> | 				<a href="{% url 'odevzdavatko_detail_reseni' pk=reseni.id %}"> | ||||||
| 					{{reseni.cas_doruceni | date:"j. n."}} ({{ hodnoceni.body|default:"🔨"}}b) | 					{{reseni.cas_doruceni | date:"j. n."}} ({{ hodnoceni.body|default_if_none:"🔨"}} b) | ||||||
| 				</a><br> | 				</a><br> | ||||||
| 			{% endfor %} | 			{% endfor %} | ||||||
|  | 			{% if bunka|length > 1 %} | ||||||
|  | 				<b>Σ: {{soucet}} b</b> | ||||||
|  | 			{% endif %} | ||||||
| 			</td> | 			</td> | ||||||
| 		{% endfor %} | 		{% endfor %} | ||||||
| 	</tr> | 	</tr> | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ from django.db.models import Q | ||||||
| 
 | 
 | ||||||
| from dataclasses import dataclass | from dataclasses import dataclass | ||||||
| import datetime | import datetime | ||||||
|  | from decimal import Decimal | ||||||
| from itertools import groupby | from itertools import groupby | ||||||
| import logging | import logging | ||||||
| 
 | 
 | ||||||
|  | @ -119,6 +120,7 @@ class TabulkaOdevzdanychReseniView(ListView): | ||||||
| 		ctx['problemy'] = self.problemy | 		ctx['problemy'] = self.problemy | ||||||
| 		ctx['resitele'] = self.resitele | 		ctx['resitele'] = self.resitele | ||||||
| 		tabulka: dict[m.Problem, dict[m.Resitel, list[tuple[m.Reseni, m.Hodnoceni]]]] = dict() | 		tabulka: dict[m.Problem, dict[m.Resitel, list[tuple[m.Reseni, m.Hodnoceni]]]] = dict() | ||||||
|  | 		soucty: dict[m.Problem, dict[m.Resitel, Decimal]] = dict() | ||||||
| 
 | 
 | ||||||
| 		def pridej_reseni(resitel, hodnoceni): | 		def pridej_reseni(resitel, hodnoceni): | ||||||
| 			problem = hodnoceni.problem | 			problem = hodnoceni.problem | ||||||
|  | @ -127,26 +129,29 @@ class TabulkaOdevzdanychReseniView(ListView): | ||||||
| 			reseni = hodnoceni.reseni | 			reseni = hodnoceni.reseni | ||||||
| 			if problem not in tabulka: | 			if problem not in tabulka: | ||||||
| 				tabulka[problem] = dict() | 				tabulka[problem] = dict() | ||||||
|  | 				soucty[problem] = dict() | ||||||
| 			if resitel not in tabulka[problem]: | 			if resitel not in tabulka[problem]: | ||||||
| 				tabulka[problem][resitel] = [(reseni, hodnoceni)] | 				tabulka[problem][resitel] = [(reseni, hodnoceni)] | ||||||
|  | 				soucty[problem][resitel] = hodnoceni.body or 0 # Neobodované neřešíme | ||||||
| 			else: | 			else: | ||||||
| 				tabulka[problem][resitel].append((reseni, hodnoceni)) | 				tabulka[problem][resitel].append((reseni, hodnoceni)) | ||||||
|  | 				soucty[problem][resitel] += hodnoceni.body or 0 # Neobodované neřešíme | ||||||
| 		 | 		 | ||||||
| 		for hodnoceni in self.get_queryset(): | 		for hodnoceni in self.get_queryset(): | ||||||
| 			for resitel in hodnoceni.reseni.resitele.all(): | 			for resitel in hodnoceni.reseni.resitele.all(): | ||||||
| 				pridej_reseni(resitel, hodnoceni) | 				pridej_reseni(resitel, hodnoceni) | ||||||
| 
 | 
 | ||||||
| 		hodnoty: list[list[list[tuple[m.Reseni, m.Hodnoceni]]]] = [] # Seznam řádků výsledné tabulky podle self.resitele, v každém řádku buňky v pořadí podle self.problemy, v každé buňce seznam řešení k danému řešiteli a problému. | 		hodnoty: list[list[tuple[Decimal,list[tuple[m.Reseni, m.Hodnoceni]]]]] = [] # Seznam řádků výsledné tabulky podle self.resitele, v každém řádku buňky v pořadí podle self.problemy + jejich součty, v každé buňce seznam řešení k danému řešiteli a problému. | ||||||
| 		resitele_do_tabulky: list[m.Resitel] = [] | 		resitele_do_tabulky: list[m.Resitel] = [] | ||||||
| 		for resitel in self.resitele: | 		for resitel in self.resitele: | ||||||
| 			dostal_body = False | 			dostal_body = False | ||||||
| 			resiteluv_radek: list[list[tuple[m.Resitel, m.Hodnoceni]]] = [] # podle pořadí v self.problemy | 			resiteluv_radek: list[tuple[Decimal,list[tuple[m.Resitel, m.Hodnoceni]]]] = [] # podle pořadí v self.problemy | ||||||
| 			for problem in self.problemy: | 			for problem in self.problemy: | ||||||
| 				if problem in tabulka and resitel in tabulka[problem]: | 				if problem in tabulka and resitel in tabulka[problem]: | ||||||
| 					resiteluv_radek.append(tabulka[problem][resitel]) | 					resiteluv_radek.append((soucty[problem][resitel], tabulka[problem][resitel])) | ||||||
| 					dostal_body = True | 					dostal_body = True | ||||||
| 				else: | 				else: | ||||||
| 					resiteluv_radek.append([]) | 					resiteluv_radek.append((Decimal(0),[])) | ||||||
| 			if self.chteni_resitele != FiltrForm.RESITELE_RELEVANTNI or dostal_body: | 			if self.chteni_resitele != FiltrForm.RESITELE_RELEVANTNI or dostal_body: | ||||||
| 				hodnoty.append(resiteluv_radek) | 				hodnoty.append(resiteluv_radek) | ||||||
| 				resitele_do_tabulky.append(resitel) | 				resitele_do_tabulky.append(resitel) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky