From 0d7ec1d90ab6b731bb4cf9d9eb4e9162405089ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Wed, 5 Oct 2022 21:02:18 +0200
Subject: [PATCH] =?UTF-8?q?P=C5=99eps=C3=A1na=20s=C4=8D=C3=ADtac=C3=AD=20f?=
 =?UTF-8?q?unkce?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 vysledkovky/utils.py | 81 +++++++++++++++++++-------------------------
 1 file changed, 34 insertions(+), 47 deletions(-)

diff --git a/vysledkovky/utils.py b/vysledkovky/utils.py
index 19163e93..5a22a447 100644
--- a/vysledkovky/utils.py
+++ b/vysledkovky/utils.py
@@ -258,86 +258,73 @@ class VysledkovkaCisla(Vysledkovka):
 		)
 
 	@cached_property
-	def problemy_s_body_za_cislo(self):
+	def sectene_body(self):
 		"""
-			TODDO okomentovat a zpřehlednit. Vzniklo slepením dvou funkcí
-			(výpočet bodů hlavních problémů a výpočet bodů podproblémů)
-			pro zrychlení výpočtu bodů ve výsledkovce.
-
-			Což asi zpomalilo výsledkovku v TeXu. Co s tím? (Tu nevidí řeš.)
+			Sečte body za číslo, hlavní problémy a podproblémy
 		"""
 
-		hlavni_problemy_slovnik = dict()
-		for hp in self.hlavni_problemy:
-			hlavni_problemy_slovnik[hp.id] = {}
+		# Body za číslo
+		body_za_cislo = {ar.id: "" for ar in self.aktivni_resitele}
 
-		hlavni_problemy_slovnik[-1] = {}
+		# Body za hlavní problémy
+		body_za_temata = {
+			hp.id: {ar.id: "" for ar in self.aktivni_resitele}
+			for hp in self.temata_a_spol
+		}
+		body_za_temata[-1] = {ar.id: "" for ar in self.aktivni_resitele}
 
-		# zakládání prázdných záznamů pro řešitele
-		cislobody = {}
-		for ar in self.aktivni_resitele:
-			# řešitele převedeme na řetězec pomocí unikátního id
-			cislobody[ar.id] = ""
-			for hp in self.temata_a_spol:
-				slovnik = hlavni_problemy_slovnik[hp.id]
-				slovnik[ar.id] = ""
-
-			hlavni_problemy_slovnik[-1][ar.id] = ""
+		# Body za podproblémy
+		body_za_problemy = {
+			tema.id: {
+				problem.id: {ar.id: "" for ar in self.aktivni_resitele}
+				for problem in self.podproblemy[tema.id]
+			}
+			for tema in self.temata_a_spol
+		}
+		body_za_problemy[-1] = {
+				problem.id: {ar.id: "" for ar in self.aktivni_resitele}
+				for problem in self.podproblemy[-1]
+		}
 
+		# Mapování podproblémů na problémy
 		problem2nadproblem = dict()
-
-		body_slovnik = {}
 		for tema in self.temata_a_spol:
-			body_slovnik[tema.id] = {}
 			for problem in self.podproblemy[tema.id]:
-				body_slovnik[tema.id][problem.id] = {}
 				problem2nadproblem[problem.id] = tema.id
-		body_slovnik[-1] = {}
-		for problem in self.podproblemy[-1]:
-			body_slovnik[-1][problem.id] = {}
-			problem2nadproblem[problem.id] = -1
-
-		# zakládání prázdných záznamů pro řešitele
-		for ar in self.aktivni_resitele:
-			for tema in self.temata_a_spol:
-				for problem in self.podproblemy[tema.id]:
-					body_slovnik[tema.id][problem.id][ar.id] = ""
-
-			for problem in self.podproblemy[-1]:
-				body_slovnik[-1][problem.id][ar.id] = ""
-
 
+		# Získáme query všech sčítaných hodnocení
 		hodnoceni_do_cisla = self.hodnoceni_do_cisla
 
+		# Sečteme hodnocení
 		for hodnoceni in hodnoceni_do_cisla:
 			prob = hodnoceni.problem
 			nadproblem = problem2nadproblem[prob.id]
-			nadproblem_slovnik = hlavni_problemy_slovnik[nadproblem]
+
+			problem_slovnik = body_za_problemy[nadproblem][prob.id]
+			nadproblem_slovnik = body_za_temata[nadproblem]
 
 			body = hodnoceni.body
 
-			problem_slovnik = body_slovnik[nadproblem][prob.id]
-
-			# a mít více řešitelů
+			# Může mít více řešitelů
 			for resitel in hodnoceni.reseni.resitele.all():
 				if resitel not in self.aktivni_resitele:
 					continue
-				self.pricti_body(cislobody, resitel, body)
+				self.pricti_body(body_za_cislo, resitel, body)
 				self.pricti_body(nadproblem_slovnik, resitel, body)
 				self.pricti_body(problem_slovnik, resitel, body)
-		return hlavni_problemy_slovnik, cislobody, body_slovnik
+		return body_za_cislo, body_za_temata, body_za_problemy
 
 	@cached_property
 	def hlavni_problemy_slovnik(self) -> dict[int, dict[int, str]]:
-		return self.problemy_s_body_za_cislo[0]
+		return self.sectene_body[1]
 
 	@cached_property
 	def body_za_cislo(self) -> dict[int, str]:
-		return self.problemy_s_body_za_cislo[1]
+		return self.sectene_body[0]
 
 	@cached_property
 	def problemy_slovnik(self):
-		return self.problemy_s_body_za_cislo[2]
+		return self.sectene_body[2]
 
 	@cached_property
 	def temata_a_spol(self) -> list[m.Problem]: