From f281d5f724fd91cd3d7be83ffe9262551e224b42 Mon Sep 17 00:00:00 2001 From: Anet Date: Wed, 22 Apr 2020 23:16:26 +0200 Subject: [PATCH 1/6] =?UTF-8?q?views:=20=C3=BAprava=20po=C4=8D=C3=ADt?= =?UTF-8?q?=C3=A1n=C3=AD=20bod=C5=AF=20odjak=C5=BEiva,=20po=C4=8D=C3=ADt?= =?UTF-8?q?=C3=A1n=C3=AD=20bod=C5=AF=20za=20ro=C4=8Dn=C3=ADk=20tak=C3=A9?= =?UTF-8?q?=20pomoc=C3=AD=20agregace.=20Smaz=C3=A1n=C3=AD=20debug=20v?= =?UTF-8?q?=C3=BDpis=C5=AF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/views/views_all.py | 154 +++++++++++++++++++++++-------------- 1 file changed, 98 insertions(+), 56 deletions(-) diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 3d31dfc4..6a3f1c3a 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -324,10 +324,16 @@ class ArchivView(generic.ListView): ### Výsledky -# ze seznamu obsahujícího sestupně setřízené body řešitelů za daný ročník -# vytvoří seznam s pořadími (včetně 3.-5. a pak 2 volná místa atp.), -# podle toho, jak jdou za sebou ve výsledkovce def sloupec_s_poradim(setrizene_body): + """ Ze seznamu obsahujícího sestupně setřízené body řešitelů za daný ročník + vytvoří seznam s pořadími (včetně 3.-5. a pak 2 volná místa atp.), + podle toho, jak jdou za sebou ve výsledkovce. + Parametr: + setrizene_body (seznam integerů): sestupně setřízená čísla + + Výstup: + sloupec_s_poradim (seznam stringů) + """ # ze seznamu obsahujícího setřízené body spočítáme sloupec s pořadím aktualni_poradi = 1 @@ -358,20 +364,28 @@ def sloupec_s_poradim(setrizene_body): aktualni_poradi = aktualni_poradi + velikost_skupiny return sloupec_s_poradim -# vrátí všechna čísla daného ročníku def cisla_rocniku(rocnik, jen_verejne=True): + """ Vrátí všechna čísla daného ročníku. + Parametry: + rocnik (Rocnik): ročník semináře + jen_verejne (bool): zda se mají vrátit jen veřejná, nebo všechna čísla + Vrátí: + seznam objektů typu Cislo + """ if jen_verejne: return rocnik.verejna_cisla() else: return rocnik.cisla.all() -# pro daný problém vrátí jeho nejvyšší nadproblém def hlavni_problem(problem): + """ Pro daný problém vrátí jeho nejvyšší nadproblém.""" while not(problem.nadproblem == None): problem = problem.nadproblem return problem def hlavni_problemy_rocniku(rocnik, jen_verejne=True): + """ Pro zadaný ročník vrátí hlavní problémy ročníku, + tj. ty, které už nemají nadproblém.""" hlavni_problemy = [] for cislo in cisla_rocniku(rocnik, jen_verejne): for problem in hlavni_problemy_cisla(cislo): @@ -382,8 +396,8 @@ def hlavni_problemy_rocniku(rocnik, jen_verejne=True): return hlavni_problemy -# vrátí list všech problémů s body v daném čísle, které již nemají nadproblém def hlavni_problemy_cisla(cislo): + """ Vrátí seznam všech problémů s body v daném čísle, které již nemají nadproblém. """ hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all() # hodnocení, která se vážou k danému číslu @@ -405,36 +419,71 @@ def hlavni_problemy_cisla(cislo): return hlavni_problemy -# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník -def body_resitelu_odjakziva(rocnik, resitele): +def body_resitelu(resitele, za, odjakziva=True): + """ Funkce počítající počty bodů pro zadané řešitele, + buď odjakživa do daného ročníku/čísla anebo za daný ročník/číslo. + Parametry: + resitele (seznam obsahující položky typu Resitel): aktivní řešitelé + za (Rocnik/Cislo): za co se mají počítat body + (generování starších výsledkovek) + odjakziva (bool): zda se mají počítat body odjakživa, nebo jen za číslo/ročník + zadané v "za" + Výstup: + slovník (Resitel.id):body + """ + resitele_id = [r.id for r in resitele] + # Zjistíme, typ objektu v parametru "za" + if isinstance(za, Rocnik): + cislo = None + rocnik = za + rok = rocnik.prvni_rok + elif isinstance(za, Cislo): + cislo = za + rocnik = None + rok = cislo.rocnik.prvni_rok + else: + assert True, "body_resitelu: za není ani číslo ani ročník." + + + # Kvůli rychlosti používáme sčítáme body už v databázi, viz + # https://docs.djangoproject.com/en/3.0/topics/db/aggregation/, + # sekce Filtering on annotations (protože potřebujeme filtrovat výsledky + # jen do nějakého data, abychom uměli správně nagenerovat výsledkovky i + # za historická čísla. + + # Níže se vytváří dotaz na součet bodů za správně vyfiltrovaná hodnocení, + # který se použije ve výsledném dotazu. + if cislo and odjakziva: # Body se sčítají odjakživa do zadaného čísla. + # Vyfiltrujeme všechna hodnocení, která jsou buď ze starších ročníků, + # anebo ze stejného ročníku, jak je zadané číslo, tam ale sčítáme jen + # pro čísla s pořadím nejvýše stejným, jako má zadané číslo. + body_k_zapocteni = Sum('reseni__hodnoceni__body', + filter=( Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lt=rok) | + Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok=rok, + reseni__hodnoceni__cislo_body__poradi__lte=cislo.poradi) )) + elif cislo and not odjakziva: # Body se sčítají za dané číslo. + body_k_zapocteni = Sum('reseni__hodnoceni__body', + filter=( Q(reseni__hodnoceni__cislo_body=cislo) )) + elif rocnik and odjakziva: # Spočítáme body za starší ročníky až do zadaného včetně. + body_k_zapocteni = Sum('reseni__hodnoceni__body', + filter= Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lte=rok)) + elif rocnik and not odjakziva: # Spočítáme body za daný ročník. + body_k_zapocteni = Sum('reseni__hodnoceni__body', + filter= Q(reseni__hodnoceni__cislo_body__rocnik=rocnik)) + else: + assert True, "body_resitelu: Neplatná kombinace za a odjakživa." + # Následující řádek přidá ke každému řešiteli údaj ".body" se součtem jejich bodů - resitele_s_body = Resitel.objects.annotate(body=Sum('reseni__hodnoceni__body')) - # Teď jen z QuerySetu řešitelů anotovaných body vygenerujeme slovník indexovaný řešitelským id obsahující body - # ... ale jen ro řešitele, které dostaneme jako parametr. - # TODO: Zjistit, co ten parametr říká a proč je potřeba - body_odjakziva = {int(res.id) : res.body for res in resitele_s_body if res in resitele} - return body_odjakziva - -# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník -def body_resitelu_za_rocnik(rocnik, aktivni_resitele): - body_za_rocnik = {} - # inicializujeme na 0 pro všechny aktivní řešitele - for ar in aktivni_resitele: - body_za_rocnik[ar.id] = 0 - - # spočítáme body řešitelům přes všechna řešení s hodnocením v daném ročníku - print("Před dotazem:{}".format(time.time())) - reseni = Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').filter(hodnoceni__cislo_body__rocnik=rocnik) - print("Po dotazu:{}".format(time.time())) - for res in reseni: - for resitel in res.resitele.all(): - for hodn in res.hodnoceni_set.all(): - pricti_body(body_za_rocnik, resitel, hodn.body) - print("Po for-cyklu:{}".format(time.time())) - return body_za_rocnik + resitele_s_body = Resitel.objects.filter(id__in=resitele_id).annotate( + body=body_k_zapocteni) + # Teď jen z QuerySetu řešitelů anotovaných body vygenerujeme slovník + # indexovaný řešitelským id obsahující body. + # Pokud jsou body None, nahradíme za 0. + slovnik = {int(res.id) : (res.body if res.body else 0) for res in resitele_s_body} + return slovnik class RadekVysledkovkyRocniku(object): - """Obsahuje věci, které se hodí vědět při konstruování výsledkovky. + """ Obsahuje věci, které se hodí vědět při konstruování výsledkovky. Umožňuje snazší práci v templatu (lepší, než seznam).""" def __init__(self, poradi, resitel, body_cisla_sezn, body_rocnik, body_odjakziva, rok): @@ -447,7 +496,7 @@ class RadekVysledkovkyRocniku(object): self.titul = resitel.get_titul(body_odjakziva) def vysledkovka_rocniku(rocnik, jen_verejne=True): - """Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve + """ Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve formě vhodné pro šablonu "seminar/vysledkovka_rocniku.html" """ @@ -460,7 +509,6 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): #.filter(hodnoceni_set__rocnik__eq=cislo_rocnik) cisla = cisla_rocniku(rocnik, jen_verejne) body_cisla_slov = {} - print("Jen veřejná: {}, čísla: {}".format(jen_verejne, cisla)) for cislo in cisla: # získáme body za číslo _, cislobody = secti_body_za_cislo(cislo, aktivni_resitele) @@ -476,7 +524,7 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): poradi = sloupec_s_poradim(setrizene_body) # získáme body odjakživa - resitel_odjakzivabody_slov = body_resitelu_odjakziva(rocnik, aktivni_resitele) + resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, rocnik) # vytvoříme jednotlivé sloupce výsledkovky radky_vysledkovky = [] @@ -495,11 +543,7 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): setrizene_body[i], # body za ročník (spočítané výše s pořadím) resitel_odjakzivabody_slov[ar_id], # body odjakživa rocnik) # ročník semináře pro získání ročníku řešitele - print("{}: číslobody - {}, ročníkbody - {}," - "odjakživabody - {}".format(radek.resitel, radek.body_cisla_sezn, - radek.body_rocnik, radek.body_celkem_odjakziva)) radky_vysledkovky.append(radek) - print("Přikládám {}-tý řádek.".format(i)) i += 1 return radky_vysledkovky @@ -575,8 +619,8 @@ class RadekVysledkovkyCisla(object): self.titul = resitel.get_titul(body_odjakziva) -# přiřazuje danému řešiteli body do slovníku def pricti_body(slovnik, resitel, body): + """ Přiřazuje danému řešiteli body do slovníku. """ # testujeme na None (""), pokud je to první řešení # daného řešitele, předěláme na 0 # (v dalším kroku přičteme reálný počet bodů), @@ -587,15 +631,16 @@ def pricti_body(slovnik, resitel, body): slovnik[resitel.id] += body def secti_body_za_rocnik(rocnik, aktivni_resitele): - # spočítáme všem řešitelům jejich body za ročník - resitel_rocnikbody_slov = body_resitelu_za_rocnik(rocnik, aktivni_resitele) + """ Spočítá body za ročník, setřídí je sestupně a vrátí jako seznam.""" + # spočítáme všem řešitelům jejich body za ročník (False => ne odjakživa) + resitel_rocnikbody_slov = body_resitelu(aktivni_resitele, rocnik, False) # zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(), key = lambda x: x[1], reverse = True) return resitel_rocnikbody_sezn -# spočítá u řešitelů body za číslo a za jednotlivé hlavní problémy (témata) def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): + """ Spočítá u řešitelů body za číslo a za jednotlivé hlavní problémy (témata).""" # TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé # pro každý hlavní problém zavedeme slovník s body za daný hlavní problém # pro jednotlivé řešitele (slovník slovníků hlavních problémů) @@ -658,8 +703,7 @@ def vysledkovka_cisla(cislo, context=None): resitel_rocnikbody_sezn = secti_body_za_rocnik(cislo.rocnik, aktivni_resitele) # získáme body odjakživa - resitel_odjakzivabody_slov = body_resitelu_odjakziva(cislo.rocnik, - aktivni_resitele) + resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, cislo) # řešitelé setřídění podle bodů za číslo sestupně setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn] @@ -686,10 +730,7 @@ def vysledkovka_cisla(cislo, context=None): setrizeni_resitele_body[i], # body za ročník (spočítané výše s pořadím) resitel_odjakzivabody_slov[ar_id], # body odjakživa cislo.rocnik) # ročník semináře pro zjištění ročníku řešitele - print("{}: body za problémy - {}, číslobody - {}, ročníkbody - {}, odjakživabody - {}".format(radek.resitel, - radek.body_problemy_sezn, radek.body_cislo, radek.body_rocnik, radek.body_celkem_odjakziva)) radky_vysledkovky.append(radek) - print("Přikládám {}-tý řádek.".format(i)) i += 1 # vytahané informace předáváme do kontextu @@ -698,7 +739,6 @@ def vysledkovka_cisla(cislo, context=None): context['problemy'] = hlavni_problemy #context['v_cisle_zadane'] = TODO #context['resene_problemy'] = resene_problemy - print("Předávám kontext.") return context class CisloView(generic.DetailView): @@ -736,7 +776,7 @@ class ArchivTemataView(generic.ListView): ### Generovani vysledkovky class CisloVysledkovkaView(CisloView): - "View vytvořené pro stránku zobrazující výsledkovku čísla v TeXu." + """View vytvořené pro stránku zobrazující výsledkovku čísla v TeXu.""" model = Cislo template_name = 'seminar/archiv/cislo_vysledkovka.tex' @@ -746,7 +786,7 @@ class CisloVysledkovkaView(CisloView): #vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani class RocnikVysledkovkaView(RocnikView): - "View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu." + """ View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu.""" model = Rocnik template_name = 'seminar/archiv/rocnik_vysledkovka.tex' #content_type = 'application/x-tex; charset=UTF8' @@ -832,13 +872,15 @@ def oldObalkovaniView(request, rocnik, cislo): ### Tituly def TitulyView(request, rocnik, cislo): + """ View pro stažení makra titulů v TeXu.""" rocnik_obj = Rocnik.objects.get(rocnik = rocnik) resitele = Resitel.objects.filter(rok_maturity__gte = rocnik_obj.prvni_rok) cislo_obj = Cislo.objects.get(rocnik = rocnik_obj, poradi = cislo) asciijmena = [] - jmenovci = False # detekuje, zda jsou dva řešitelé jmenovci (modulo nabodeníčka), pokud ano, vrátí se jako true - slovnik_s_body = body_resitelu_odjakziva(rocnik_obj, resitele) + jmenovci = False # detekuje, zda jsou dva řešitelé jmenovci (modulo nabodeníčka), + # pokud ano, vrátí se jako true + slovnik_s_body = body_resitelu(resitele, rocnik_obj) for resitel in resitele: resitel.titul = resitel.get_titul(slovnik_s_body[resitel.id]) @@ -886,13 +928,13 @@ class SoustredeniUcastniciBaseView(generic.ListView): class SoustredeniMailyUcastnikuView(SoustredeniUcastniciBaseView): - """Seznam e-mailů řešitelů oddělených čárkami""" + """ Seznam e-mailů řešitelů oddělených čárkami. """ model = Soustredeni_Ucastnici template_name = 'seminar/soustredeni/maily_ucastniku.txt' class SoustredeniUcastniciView(SoustredeniUcastniciBaseView): - """HTML tabulka účastníků pro tisk""" + """ HTML tabulka účastníků pro tisk. """ model = Soustredeni_Ucastnici template_name = 'seminar/soustredeni/seznam_ucastniku.html' From 869b58f35a1585f2fdec5ef6f86e9010edbec38c Mon Sep 17 00:00:00 2001 From: Anet Date: Wed, 22 Apr 2020 23:44:15 +0200 Subject: [PATCH 2/6] =?UTF-8?q?views:=20p=C5=99eveden=C3=AD=20koment=C3=A1?= =?UTF-8?q?=C5=99=C5=AF=20u=20funkc=C3=AD=20do=20docstring=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/views/views_all.py | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index ac79ba00..95eb07d1 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -801,6 +801,7 @@ class RocnikVysledkovkaView(RocnikView): #vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani ### Generovani obalek + class CisloObalkyStruct: rocnik = None cisla = None @@ -825,13 +826,15 @@ def aktivniResitele(rocnik,cislo): letos.rocnik = Rocnik.objects.get(rocnik = rocnik) loni.rocnik = Rocnik.objects.get(rocnik = int(rocnik)-1) - letos.cisla = Cislo.objects.filter(rocnik=letos.rocnik,cislo__lte = cislo) + letos.cisla = Cislo.objects.filter(rocnik=letos.rocnik, cislo__lte = cislo) loni.cisla = Cislo.objects.filter(rocnik=loni.rocnik) if int(cislo) > 3: problemy = Problem.objects.filter(cislo_zadani__in = letos.cisla) else: - problemy = Problem.objects.filter(Q(cislo_zadani__in = letos.cisla)|Q(cislo_zadani__in = loni.cisla)) - resitele = aktualni_resitele.filter(reseni__in = Reseni.objects.filter(problem__in=problemy)).distinct() + problemy = Problem.objects.filter( + Q(cislo_zadani__in = letos.cisla) | Q(cislo_zadani__in = loni.cisla) ) + resitele = aktualni_resitele.filter(reseni__in = Reseni.objects.filter( + problem__in=problemy)).distinct() return resitele @@ -904,8 +907,6 @@ def TitulyView(request, rocnik, cislo): return render(request, 'seminar/archiv/tituly.tex', {'resitele': resitele,'jmenovci':jmenovci},content_type="text/plain") - - ### Soustredeni class SoustredeniListView(generic.ListView): @@ -1062,11 +1063,11 @@ def texUploadView(request): } problem_typ = typy[meta["typ"]] - # Pokud už problém existuje, vytáhneme jej z db a upravíme - # Pokud neexistuje, vytvoříme jej jedině pokud je to vynucené + # Pokud už problém existuje, vytáhneme jej z db a upravíme. + # Pokud neexistuje, vytvoříme jej jedině pokud je to vynucené. # Pokud ročník/číslo ještě neexistuje, vyhodí to výjimku -> - # číslo/ročník se musí založit ručně v adminu + # číslo/ročník se musí založit ručně v adminu. rocnik = Rocnik.objects.get(rocnik=meta["rocnik"]) cislo = Cislo.objects.get(rocnik=rocnik, cislo=meta["cislo"]) @@ -1200,7 +1201,8 @@ class ResitelView(LoginRequiredMixin,generic.DetailView): print(self.request.user) return Resitel.objects.get(osoba__user=self.request.user) -## Formulare +### Formulare + class AddSolutionView(LoginRequiredMixin, FormView): template_name = 'seminar/org/vloz_reseni.html' form_class = f.VlozReseniForm @@ -1239,9 +1241,6 @@ class SubmitSolutionView(LoginRequiredMixin, CreateView): return HttpResponseRedirect(self.get_success_url()) - - - def resetPasswordView(request): pass @@ -1403,10 +1402,6 @@ def prihlaskaView(request): return render(request, 'seminar/prihlaska.html', {'form': form}) - - - - # FIXME: Tohle asi vlastně vůbec nepatří do aplikace 'seminar' class LoginView(auth_views.LoginView): # Jen vezmeme vestavěný a dáme mu vhodný template a přesměrovací URL @@ -1424,25 +1419,25 @@ class LogoutView(auth_views.LogoutView): # Pavel: Vůbec nevím, proč to s _lazy funguje, ale bez toho to bylo rozbité. next_page = reverse_lazy('titulni_strana') -# "Chci resetovat heslo" class PasswordResetView(auth_views.PasswordResetView): + """ Chci resetovat heslo. """ #template_name = 'seminar/password_reset.html' # TODO: vlastní email_template_name a subject_template_name a html_email_template_name success_url = reverse_lazy('reset_password_done') from_email = 'login@mam.mff.cuni.cz' -# "Poslali jsme e-mail (pokud bylo kam))" class PasswordResetDoneView(auth_views.PasswordResetDoneView): + """ Poslali jsme e-mail (pokud bylo kam)). """ #template_name = 'seminar/password_reset_done.html' pass -# "Vymysli si heslo" class PasswordResetConfirmView(auth_views.PasswordResetConfirmView): + """ Vymysli si heslo. """ #template_name = 'seminar/password_confirm_done.html' success_url = reverse_lazy('reset_password_complete') -# "Heslo se asi změnilo." class PasswordResetCompleteView(auth_views.PasswordResetCompleteView): + """ Heslo se asi změnilo.""" #template_name = 'seminar/password_complete_done.html' pass From 97240a41039ec6a4c683141128189d7081f1b9f5 Mon Sep 17 00:00:00 2001 From: Anet Date: Fri, 24 Apr 2020 18:11:39 +0200 Subject: [PATCH 3/6] =?UTF-8?q?testutils:=20=C3=BApravy=20funkc=C3=AD=20k?= =?UTF-8?q?=20v=C4=9Bt=C5=A1=C3=AD=20=C4=8Ditelnosti?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/testutils.py | 207 ++++++++++++++++++++++++------------------- 1 file changed, 118 insertions(+), 89 deletions(-) diff --git a/seminar/testutils.py b/seminar/testutils.py index 65ffbfcd..b562bf74 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -173,13 +173,12 @@ def gen_organizatori(rnd, osoby, last_rocnik, users): if do.year > datetime.datetime.now().year: do = None organizatori.append(Organizator.objects.create(osoba=os, - organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga)) + organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga)) return organizatori -def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size): - logger.info('Generuji úlohy do čísla (size={})...'.format(size)) - - # ulohy resene v cisle +def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi_problemu): + + # Proměnné pro náhodné generování názvů a zadání. jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", "Zákeřná", "Fyzikální"] co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč", @@ -189,7 +188,47 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) ceho = ["všech", "správných", "konstatních", "zelených"] jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] - obor = ["M", "F", "I", "O", "B"] + obory = ["M", "F", "I", "O", "B"] + + p = Uloha.objects.create( + # atributy třídy Problem + nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]), + stav=Problem.STAV_ZADANY, + zamereni=rnd.sample(obory, pocet_oboru), + autor=rnd.choice(organizatori), + garant=rnd.choice(organizatori), + kod=str(poradi_problemu), + # atributy třídy Uloha + cislo_zadani=cisla[poradi_cisla-2-1], + cislo_reseni=cisla[poradi_cisla-1], + cislo_deadline=cisla[poradi_cisla-1], + max_body = rnd.randint(1, 8) + ) + + text_zadani = Text.objects.create( + na_web = " ".join( + [rnd.choice(sloveso), + rnd.choice(koho), + rnd.choice(ceho), + rnd.choice(jmeno), + rnd.choice(kde)] + ), + do_cisla = " ".join( + [rnd.choice(sloveso), + rnd.choice(koho), + rnd.choice(ceho), + rnd.choice(jmeno), + rnd.choice(kde)] + ) + ) + zad = TextNode.objects.create(text = text_zadani) + uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad) + p.ulohazadaninode = uloha_zadani + otec_syn(cisla[poradi_cisla-2-1].cislonode, uloha_zadani) + + return p + +def gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, uloha, pocet_opravovatelu, poradi_cisla): reseni = ["to je přece jasné", "triviální", "omlouváme se," "otevřený problém", "neřešitelné", "triviálně triviální", "použitím věty z prvního semestru na matfyzu", @@ -197,96 +236,81 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) "netriviální aplikace diferenciálních rovnic", "zadání je vnitřně" "sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli," "tak jste fakt hloupí"] + + # Generování vzorového řešení. + text_vzoraku = Text.objects.create( + na_web = rnd.choice(reseni), + do_cisla = rnd.choice(reseni) + ) + vzorak = TextNode.objects.create(text = text_vzoraku) + uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak) + uloha.ulohavzoraknode = uloha_vzorak + otec_syn(cisla[poradi_cisla-1].cislonode, uloha_vzorak) + + uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu)) + uloha.save() + return + +def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_cisla, resitele): + + pocet_reseni = rnd.randint(pocet_resitelu//4, pocet_resitelu * 4) + # generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla + for _ in range(pocet_reseni): + #print("Generuji {}-té řešení".format(reseni)) + if rnd.randint(1, 10) == 1: + # cca desetina řešení od více řešitelů + res_vyber = rnd.sample(resitele_cisla, + rnd.randint(2, 5)) + else: + res_vyber = rnd.sample(resitele_cisla, 1) + if resitele[0] in res_vyber: # speciální řešitel, který nemá žádné body + res_vyber.remove(resitele[0]) + + # Vytvoření řešení. + res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0]) + # Problím a řešitele přiřadíme později, ManyToManyField + # se nedá vyplnit v create(). + res.resitele.set(res_vyber) + res.save() + + # Vytvoření hodnocení. + hod = Hodnoceni.objects.create( + body=rnd.randint(0, uloha.max_body), + cislo_body=cisla[poradi_cisla - 1], + reseni=res, + problem=uloha + ) + return + +def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size): + logger.info('Generuji úlohy do čísla (size={})...'.format(size)) + k = 0 for rocnik in rocniky: - k+=1 + k += 1 print("Generuji {}. číslo.".format(k)) - cisla = rocnik_cisla[k-1] - for ci in range(3, len(cisla)+1): # pro všechna čísla + cisla = rocnik_cisla[k - 1] + for ci in range(3, len(cisla) + 1): # pro všechna čísla resitele_size = round(7/8 * 30 * size) # očekáváný celkový počet řešitelů - poc_res = rnd.randint(round(resitele_size/8), round(resitele_size/4)) + poc_res = rnd.randint(resitele_size//8, resitele_size//4) # dané číslo řeší něco mezi osminou a čtvrtinou všech řešitelů # (náhodná hausnumera, možno změnit) # účelem je, aby se řešení generovala z menší množiny řešitelů a tedy # bylo více řešení od jednoho řešitele daného čísla resitele_cisla = rnd.sample(resitele, poc_res) - for pi in range(1, ((size + 1) // 2) + 1): + for pi in range(1, ((size + 1) // 2) + 1): # počet problémů poc_op = rnd.randint(1, 4) # počet opravovatelů poc_oboru = rnd.randint(1, 2) - p = Uloha.objects.create( - # atributy třídy Problem - nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]), - stav=Problem.STAV_ZADANY, - zamereni=rnd.sample(["M", "F", "I", "O", "B"], poc_oboru), - autor=rnd.choice(organizatori), - garant=rnd.choice(organizatori), - kod=str(pi), - # atributy třídy Uloha - cislo_zadani=cisla[ci-2-1], - cislo_reseni=cisla[ci-1], - cislo_deadline=cisla[ci-1], - max_body = rnd.randint(1, 8) - ) - - text_zadani = Text.objects.create( - na_web = " ".join( - [rnd.choice(sloveso), - rnd.choice(koho), - rnd.choice(ceho), - rnd.choice(jmeno), - rnd.choice(kde)] - ), - do_cisla = " ".join( - [rnd.choice(sloveso), - rnd.choice(koho), - rnd.choice(ceho), - rnd.choice(jmeno), - rnd.choice(kde)] - ) - ) - zad = TextNode.objects.create(text = text_zadani) - uloha_zadani = UlohaZadaniNode.objects.create(uloha=p, first_child = zad) - p.ulohazadaninode = uloha_zadani - otec_syn(cisla[ci-2-1].cislonode, uloha_zadani) - - # generování vzorového textu - text_vzoraku = Text.objects.create( - na_web = rnd.choice(reseni), - do_cisla = rnd.choice(reseni) - ) - vzorak = TextNode.objects.create(text = text_vzoraku) - uloha_vzorak = UlohaVzorakNode.objects.create(uloha=p, first_child = vzorak) - p.ulohavzoraknode = uloha_vzorak - otec_syn(cisla[ci-1].cislonode, uloha_vzorak) - - p.opravovatele.set(rnd.sample(organizatori,poc_op)) - p.save() - - # generování řešení - poc_reseni = rnd.randint(poc_res, poc_res * 4) - # generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla - for ri in range(poc_reseni): - #print("Generuji {}-té řešení".format(ri)) - if rnd.randint(1, 10) == 6: - # cca desetina řešení od více řešitelů - res_vyber = rnd.sample(resitele_cisla, - rnd.randint(2, 5)) - else: - res_vyber = rnd.sample(resitele_cisla, 1) - if resitele[0] in res_vyber: - res_vyber.remove(resitele[0]) - res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0]) - # problem a resitele přiřadíme později, ManyToManyField - # se nedá vyplnit v create() - res.resitele.set(res_vyber) - res.save() - hod = Hodnoceni.objects.create( - body=rnd.randint(0, p.max_body), - cislo_body=cisla[ci-1], - reseni=res, - problem=p - ) + + # Generování zadání úlohy a UlohaZadaniNode, + # přivěšení pod dané číslo + p = gen_zadani_ulohy(rnd, cisla, organizatori, poc_oboru, ci, pi) + # Generování vzorového řešení + gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, p, poc_op, ci) + # Generování řešení a hodnocení k úloze + gen_reseni_ulohy(rnd, cisla, p, poc_res, ci, + resitele_cisla, resitele) return @@ -482,8 +506,10 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) rocnik=rocnik, poradi=str(int(cislo.poradi) + 2), ) - # Pokud není číslo pro vzorák, tak se dá do posledního čísla (i kdyby tam mělo být zadání i řešení...) - # Tohle sice umožňuje vygenerovat vzorák do čísla dávno po konci témátka, ale to nám pro jednoduchost nevadí. + # Pokud není číslo pro vzorák, tak se dá do posledního čísla + # (i kdyby tam mělo být zadání i řešení...) + # Tohle sice umožňuje vygenerovat vzorák do čísla dávno po konci témátka, + # ale to nám pro jednoduchost nevadí. if len(cislo_se_vzorakem) == 0: cislo_se_vzorakem = cisla[-1] else: @@ -505,7 +531,8 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) tema = tema_node.tema # Pokud už témátko skončilo, žádné úložky negenerujeme - # FIXME: Bylo by hezčí, kdyby se čísla předávala jako Cislo a ne jako int v té trojici (start, konec, tema) + # FIXME: Bylo by hezčí, kdyby se čísla předávala jako Cislo a ne + # jako int v té trojici (start, konec, tema) if not temata[int(tema.kod)-1][1] >= int(cislo_se_vzorakem.poradi): continue @@ -581,8 +608,10 @@ def gen_novinky(rnd, organizatori): kdy = ["Zítra bude", "10. 10. 2020 bude", "V prosinci bude", "V létě bude"] for i in range(5): - text_novinky = " ".join([rnd.choice(kdy),rnd.choice(kde),rnd.choice(jake),rnd.choice(co)]) - novinka = Novinky.objects.create(id=i,autor=rnd.choice(organizatori),text=(text_novinky+", těšíme se na vás!"),zverejneno=rnd.choice([True,False])) + text_novinky = " ".join([rnd.choice(kdy), rnd.choice(kde), rnd.choice(jake), + rnd.choice(co)]) + novinka = Novinky.objects.create(id=i,autor=rnd.choice(organizatori), + text=(text_novinky+", těšíme se na vás!"),zverejneno=rnd.choice([True,False])) novinka.save() return From 2242659f9b0d4781a72c8c04bc7a84a6a4d3adff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kate=C5=99ina=20=C4=8C=C3=AD=C5=BEkov=C3=A1?= Date: Wed, 29 Apr 2020 20:27:18 +0200 Subject: [PATCH 4/6] =?UTF-8?q?mobiln=C3=AD=20menu=20funguje=20na=20mobilu?= =?UTF-8?q?,=20graf=20se=20zmen=C5=A1uje=20se=20str=C3=A1nkou?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mamweb/static/css/mamweb.css | 20 +++++++++++++------- mamweb/templates/graph.svg | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/mamweb/static/css/mamweb.css b/mamweb/static/css/mamweb.css index 09b870f4..2a719264 100644 --- a/mamweb/static/css/mamweb.css +++ b/mamweb/static/css/mamweb.css @@ -242,6 +242,10 @@ nav.nav-button { display: none; } +div.dropdown-backdrop { /* tohle způsobuje, že funguje mobilní menu */ + z-index: -1; +} + h1 a:hover { text-decoration: none; } @@ -387,11 +391,16 @@ p.license-mobile { } div.graf{ + width: 70%; float: none; margin-left: auto; margin-right: auto; - width: 70%; + margin-top: 10px; } + #svg-graf{ + width: 100%; + height: auto;; + } ul.menu { font-size: 90%; @@ -575,12 +584,9 @@ ul.submenu { float: none; } - div.graf{ - float: none; - width: 70%; - margin-left: auto; - margin-right: auto; - } + div.graf { + width: 100%; + } } diff --git a/mamweb/templates/graph.svg b/mamweb/templates/graph.svg index 7f25678c..ed730edf 100644 --- a/mamweb/templates/graph.svg +++ b/mamweb/templates/graph.svg @@ -10,7 +10,7 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" - id="svg2" + id="svg-graf" width="482.57019" height="599.45636" viewBox="0 0 482.57019 599.45636" From 29687b01b560db58455a8b4893d7c8d150094984 Mon Sep 17 00:00:00 2001 From: "Tomas \"Jethro\" Pokorny" Date: Wed, 8 Apr 2020 21:45:55 +0200 Subject: [PATCH 5/6] Galerie | opraven bug pri pridavani galerie --- galerie/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/galerie/models.py b/galerie/models.py index 2d9b8e56..c48d3a95 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -39,8 +39,8 @@ def obrazek_filename(self, filename): # soustředění je v cestě jen pokud galerie pod nějaké patří cesta = ( ['Galerie'] + - (["soustredeni_" + gal.soustredeni.pk] if gal.soustredeni else []) + - ["galerie_" + cislo_gal, self.nazev] + (["soustredeni_{}".format(gal.soustredeni.pk)] if gal.soustredeni else []) + + ["galerie_{}".format(cislo_gal), self.nazev] ) return os.path.join(*cesta) From 7764e56e1b948f9c8da3c03550b2021078192430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kate=C5=99ina=20=C4=8C=C3=AD=C5=BEkov=C3=A1?= Date: Wed, 29 Apr 2020 22:19:45 +0200 Subject: [PATCH 6/6] styly galerie --- galerie/static/galerie/prvky/dalsi.png | Bin 15649 -> 0 bytes galerie/static/galerie/prvky/dalsi.svg | 35 ++++++++ galerie/static/galerie/prvky/nahoru.png | Bin 18205 -> 0 bytes galerie/static/galerie/prvky/predchozi.png | Bin 15797 -> 0 bytes galerie/static/galerie/prvky/predchozi.svg | 35 ++++++++ mamweb/static/css/mamweb.css | 97 ++++++--------------- 6 files changed, 95 insertions(+), 72 deletions(-) delete mode 100644 galerie/static/galerie/prvky/dalsi.png create mode 100644 galerie/static/galerie/prvky/dalsi.svg delete mode 100644 galerie/static/galerie/prvky/nahoru.png delete mode 100644 galerie/static/galerie/prvky/predchozi.png create mode 100644 galerie/static/galerie/prvky/predchozi.svg diff --git a/galerie/static/galerie/prvky/dalsi.png b/galerie/static/galerie/prvky/dalsi.png deleted file mode 100644 index b5c68dcca0c1707f568771ba7df1e91ed45f42d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15649 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 + + + + + + image/svg+xml + + + + + + + + + diff --git a/galerie/static/galerie/prvky/nahoru.png b/galerie/static/galerie/prvky/nahoru.png deleted file mode 100644 index d297af60427592be4d1364148c2426a9f754c99e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18205 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 n 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 QC;$Ke07*qoM6N<$f-)Z&x&QzG diff --git a/galerie/static/galerie/prvky/predchozi.png b/galerie/static/galerie/prvky/predchozi.png deleted file mode 100644 index dc657411b4a165c04b27d60ddd1e57e4d69a662a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15797 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 diff --git a/galerie/static/galerie/prvky/predchozi.svg b/galerie/static/galerie/prvky/predchozi.svg new file mode 100644 index 00000000..af139f7e --- /dev/null +++ b/galerie/static/galerie/prvky/predchozi.svg @@ -0,0 +1,35 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/mamweb/static/css/mamweb.css b/mamweb/static/css/mamweb.css index 2a719264..dc942cc2 100644 --- a/mamweb/static/css/mamweb.css +++ b/mamweb/static/css/mamweb.css @@ -712,19 +712,6 @@ div.cislo_odkazy ul { padding: 0px; } -/* archiv ročník -div.cisla-v-rocniku { - font-weight: bold; - color: #6f2509; -} - -div.cislo-v-rocniku-blok { - display: inline-block; - width: 150px; - height: 220px; - text-align: center; -}*/ - /* galerie */ @@ -745,7 +732,8 @@ div.cislo-v-rocniku-blok { top: 0; } .predchozi_obrazek:hover{ - background-image: url("/static/galerie/prvky/predchozi.png"); + background-image: url("/static/galerie/prvky/predchozi.svg"); + filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4)); background-position: left center; background-repeat: no-repeat; } @@ -758,7 +746,8 @@ div.cislo-v-rocniku-blok { top: 0; } .dalsi_obrazek:hover{ - background-image: url("/static/galerie/prvky/dalsi.png"); + background-image: url("/static/galerie/prvky/dalsi.svg"); + filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4)); background-position: right center; background-repeat: no-repeat; } @@ -788,31 +777,25 @@ div.cislo-v-rocniku-blok { /* titulní obrázek hlavní galerie soustředění */ .titulni_obrazek { - border: 1px solid black; } .galerie_nahledy{ /*margin: 1em 0;*/ - margin: 0 auto 30px auto; + margin: auto; + padding: 10px; text-align: center; overflow: auto; } +.galerie_nahledy img { + margin: 10px; +} + .galerie_nahledy div.navigace { display: inline-block; - width: 150px; } -/*.galerie_nahledy img{*/ -/*margin: 0 10px 0 10px;*/ -/*}*/ - -/*.galerie_nahledy a{*/ -/*height: 100%;*/ -/*width: 100%;*/ -/*}*/ - -.galerie_nahled { /* frame */ +.galerie_nahled, .podgalerie_nahled { /* frame */ display: block; position: relative; float: left; @@ -820,19 +803,19 @@ div.cislo-v-rocniku-blok { height: 200px; text-align: center; border: solid; - border-width: 2px; - border-radius: 5px; - /*border-color: #ffa500;*/ - border-color: #ffd546; - /*background-color: #ffb52d;*/ - background-color: white; + border-width: 1px; + border-radius: 4px; + border-color: #f9d59e; + background-color: #fffbf6; white-space: nowrap; - margin: 10px 20px 10px 0px; + margin: 10px; + font-weight: bold; } -.galerie_nahled:hover { - background-color: #ffd546; - border-color: #ffa500; +.galerie_nahled:hover, .podgalerie_nahled:hover { + background-color: #f9d59e; + filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4)); + color: #6f2509; } .vystredeno{ /* helper */ @@ -845,12 +828,6 @@ div.cislo-v-rocniku-blok { vertical-align: middle; max-height: 180px; max-width: 180px; - /*border: 1px solid white;*/ - -} - -.galerie_nahled img, .podgalerie_nahled img { - border-radius: 2px; } .galerie_nahled div { @@ -860,30 +837,6 @@ div.cislo-v-rocniku-blok { text-align: center; } - -.podgalerie_nahled { - display: block; - position: relative; - float: left; - width: 200px; - height: 200px; - text-align: center; - border: solid; - border-width: 2px; - border-radius: 5px; - border-color: #ffa500; - /*border-color: #ffd546;*/ - background-color: #ffd546; - /*background-color: white;*/ - white-space: nowrap; - margin: 10px 20px 10px 0px; - font-weight: bold; -} - -.podgalerie_nahled:hover { - background-color: #ffa500; -} - .podgalerie_nahled img { margin-top: 20px; margin-bottom: 15px; @@ -899,10 +852,10 @@ div.cislo-v-rocniku-blok { /* plus a minus tlacitka */ .mam-org-only-galerie { - background: #fff0d7; + background: #eee4ec; padding: 10px; margin: 10px 10px 10px -20px; - border: orange 2px dashed; + border: #333 2px dashed; float: left; } @@ -910,8 +863,8 @@ div.cislo-v-rocniku-blok { padding: 3px 5px; margin: 5px; border-radius: 20px; - background-color: lightblue; - color: black; + background-color: #6f2509;; + color: #fffbf6; float: left; }