From e182785e48625b670978e13b5b82ca90e750de3b Mon Sep 17 00:00:00 2001 From: MaM Web user Date: Wed, 20 Sep 2023 01:11:03 +0200 Subject: [PATCH 1/5] =?UTF-8?q?P=C5=99id=C3=A1ny=20akce=20pro=20p=C5=99ege?= =?UTF-8?q?nerov=C3=A1n=C3=AD=20deadlin=C5=AF=20do=20Admina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nikdo o tom neví, a když se o tom dozví, tak se buď nic nezmění, nebo to bylo tak dávno, že si toho nikdo nevšimne :-D Ale na testování se to hodí… Also: někde jsem přepsal mezery na taby. --- seminar/admin.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index e88af140..2ce7b2f5 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -12,16 +12,22 @@ from django.utils.safestring import mark_safe import seminar.models as m admin.site.register(m.Rocnik) - -admin.site.register(m.Deadline) admin.site.register(m.ZmrazenaVysledkovka) +@admin.register(m.Deadline) +class DeadlineAdmin(admin.ModelAdmin): + actions = ['pregeneruj_vysledkovku'] -class DeadlineAdminInline(admin.TabularInline): - model = m.Deadline - extra = 0 + def pregeneruj_vysledkovku(self, req, qs): + for deadline in qs: + deadline.vygeneruj_vysledkovku() + pregeneruj_vysledkovku.short_description = 'Přegeneruj výsledkovky vybraných deadlinů' +class DeadlineAdminInline(admin.TabularInline): + model = m.Deadline + extra = 0 + class CisloForm(ModelForm): class Meta: model = m.Cislo @@ -71,7 +77,7 @@ class CisloForm(ModelForm): @admin.register(m.Cislo) class CisloAdmin(admin.ModelAdmin): form = CisloForm - actions = ['force_publish'] + actions = ['force_publish', 'pregeneruj_vysledkovky'] inlines = (DeadlineAdminInline,) def force_publish(self,request,queryset): @@ -111,6 +117,12 @@ class CisloAdmin(admin.ModelAdmin): force_publish.short_description = 'Zveřejnit vybraná čísla a všechny návrhy úloh v nich učinit zadanými' + def pregeneruj_vysledkovky(self, req, qs): + for cislo in qs: + for deadline in cislo.deadline_v_cisle.all(): + deadline.vygeneruj_vysledkovku() + pregeneruj_vysledkovky.short_description = 'Přegenerovat výsledkovky všech deadlinů vybraných čísel' + @admin.register(m.Problem) class ProblemAdmin(PolymorphicParentModelAdmin): From f14df7b579161740342fd708ad659c8dc169f574 Mon Sep 17 00:00:00 2001 From: MaM Web user Date: Wed, 20 Sep 2023 10:47:11 +0200 Subject: [PATCH 2/5] =?UTF-8?q?Nov=C3=A9=20k=C3=B3dy=20=C3=BAloh=20ve=20v?= =?UTF-8?q?=C3=BDsledkovce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Zprasený commit, má být na jiné větvi, já vím :-D) --- seminar/models/tvorba.py | 17 +++++++---------- vysledkovky/utils.py | 8 ++++---- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/seminar/models/tvorba.py b/seminar/models/tvorba.py index 54e769c8..1c1a3285 100644 --- a/seminar/models/tvorba.py +++ b/seminar/models/tvorba.py @@ -491,7 +491,7 @@ class Problem(SeminarModelBase,PolymorphicModel): return self.nadproblem.kod_v_rocniku+".{}".format(self.kod) return str(self.kod) logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") - return '' + return f'' # def verejne(self): # # aktuálně podle stavu problému @@ -571,9 +571,9 @@ class Tema(Problem): if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY: if self.nadproblem: return self.nadproblem.kod_v_rocniku+".t{}".format(self.kod) - return "t{}".format(self.kod) + return 't'+self.kod logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") - return '' + return f'' def save(self, *args, **kwargs): super().save(*args, **kwargs) @@ -607,9 +607,9 @@ class Clanek(Problem): # Nemělo by být potřeba # if self.nadproblem: # return self.nadproblem.kod_v_rocniku+".c{}".format(self.kod) - return "c{}".format(self.kod) + return "c" + self.kod logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") - return '' + return f'' def node(self): return None @@ -642,12 +642,9 @@ class Uloha(Problem): @cached_property def kod_v_rocniku(self): if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY: - name="{}.u{}".format(self.cislo_zadani.poradi,self.kod) - if self.nadproblem: - return self.nadproblem.kod_v_rocniku+name - return name + return f"{self.cislo_zadani.poradi}.{self.kod}" logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") - return '' + return f'' def save(self, *args, **kwargs): super().save(*args, **kwargs) diff --git a/vysledkovky/utils.py b/vysledkovky/utils.py index 56d05c31..2036b9d3 100644 --- a/vysledkovky/utils.py +++ b/vysledkovky/utils.py @@ -257,7 +257,7 @@ class VysledkovkaCisla(Vysledkovka): # (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) hlavni_problemy = set() for p in self.problemy: - hlavni_problemy.add(p.hlavni_problem) + hlavni_problemy.add(p.hlavni_problem) # FIXME: proč tohle nemůže obsahovat reálné instance? Ve výsledkovce by se pak zobrazovaly správné kódy… # zunikátnění hlavni_problemy = list(hlavni_problemy) @@ -313,7 +313,7 @@ class VysledkovkaCisla(Vysledkovka): # Sečteme hodnocení for hodnoceni in self.hodnoceni_do_cisla: - prob = hodnoceni.problem + prob = hodnoceni.problem.get_real_instance() nadproblem = prob.hlavni_problem.id # Když nadproblém není "téma", pak je "Ostatní" @@ -366,9 +366,9 @@ class VysledkovkaCisla(Vysledkovka): for problem in self.problemy: h_problem = problem.hlavni_problem if h_problem in temata_a_spol: - podproblemy[h_problem.id].append(problem) + podproblemy[h_problem.id].append(problem.get_real_instance()) else: - podproblemy[-1].append(problem) + podproblemy[-1].append(problem.get_real_instance()) for podproblem in podproblemy.keys(): podproblemy[podproblem] = sorted(podproblemy[podproblem], key=lambda p: p.kod_v_rocniku) From 8a473a50970404a3d0aa01c6b262719a04aa8a09 Mon Sep 17 00:00:00 2001 From: MaM Web user Date: Wed, 20 Sep 2023 11:10:55 +0200 Subject: [PATCH 3/5] =?UTF-8?q?Popisky=20v=20z=C3=A1hlav=C3=AD=20v=C3=BDsl?= =?UTF-8?q?edkovky?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sice to na mobilu nic moc neudělá, ale aspoň myší se to má šanci používat trochu snáz. --- vysledkovky/templates/vysledkovky/vysledkovka_cisla.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vysledkovky/templates/vysledkovky/vysledkovka_cisla.html b/vysledkovky/templates/vysledkovky/vysledkovka_cisla.html index ac53c811..4aa62953 100644 --- a/vysledkovky/templates/vysledkovky/vysledkovka_cisla.html +++ b/vysledkovky/templates/vysledkovky/vysledkovka_cisla.html @@ -4,11 +4,11 @@ # Jméno {% for p in vysledkovka.temata_a_spol%} - {# #}{{ p.kod_v_rocniku }}{# #} + {# #}{{ p.kod_v_rocniku }}{# #} {# TODELETE #} {% for podproblemy in vysledkovka.podproblemy_iter.next %} - {# #}{{ podproblemy.kod_v_rocniku }}{# #} + {# #}{{ podproblemy.kod_v_rocniku }}{# #} {% endfor %} {# TODELETE #} @@ -17,7 +17,7 @@ {# TODELETE #} {% for podproblemy in vysledkovka.podproblemy_iter.next %} - {# #}{{ podproblemy.kod_v_rocniku }}{# #} + {# #}{{ podproblemy.kod_v_rocniku }}{# #} {% endfor %} {# TODELETE #} From 002e33002c5c1500ec10eed0881285cb521e2e6c Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 9 Oct 2023 22:25:25 +0200 Subject: [PATCH 4/5] =?UTF-8?q?P=C5=99egenerov=C3=A1vat=20v=C3=BDsledkovky?= =?UTF-8?q?=20nem=C5=AF=C5=BEe=20b=C4=9B=C5=BEn=C3=BD=20org?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/admin.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index 2ce7b2f5..59a72927 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -18,12 +18,12 @@ admin.site.register(m.ZmrazenaVysledkovka) class DeadlineAdmin(admin.ModelAdmin): actions = ['pregeneruj_vysledkovku'] + # Nikomu nezobrazovat, ale superuživatelům se může hodit :-) + @admin.action(permissions=[], description= 'Přegeneruj výsledkovky vybraných deadlinů') def pregeneruj_vysledkovku(self, req, qs): for deadline in qs: deadline.vygeneruj_vysledkovku() - pregeneruj_vysledkovku.short_description = 'Přegeneruj výsledkovky vybraných deadlinů' - - + class DeadlineAdminInline(admin.TabularInline): model = m.Deadline extra = 0 @@ -117,11 +117,12 @@ class CisloAdmin(admin.ModelAdmin): force_publish.short_description = 'Zveřejnit vybraná čísla a všechny návrhy úloh v nich učinit zadanými' + # Jen pro superuživatele + @admin.action(permissions=[], description='Přegenerovat výsledkovky všech deadlinů vybraných čísel') def pregeneruj_vysledkovky(self, req, qs): for cislo in qs: for deadline in cislo.deadline_v_cisle.all(): deadline.vygeneruj_vysledkovku() - pregeneruj_vysledkovky.short_description = 'Přegenerovat výsledkovky všech deadlinů vybraných čísel' @admin.register(m.Problem) From 2d416472e8b11967c4caeb9cf2cc932573dc5b8b Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 9 Oct 2023 22:50:28 +0200 Subject: [PATCH 5/5] =?UTF-8?q?Tak=20superuser=20u=C5=BE=20m=C5=AF=C5=BEe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lol… --- seminar/admin.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/seminar/admin.py b/seminar/admin.py index 59a72927..8f589a03 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -19,11 +19,15 @@ class DeadlineAdmin(admin.ModelAdmin): actions = ['pregeneruj_vysledkovku'] # Nikomu nezobrazovat, ale superuživatelům se může hodit :-) - @admin.action(permissions=[], description= 'Přegeneruj výsledkovky vybraných deadlinů') + @admin.action(permissions=['bazmek'], description= 'Přegeneruj výsledkovky vybraných deadlinů') def pregeneruj_vysledkovku(self, req, qs): for deadline in qs: deadline.vygeneruj_vysledkovku() + def has_bazmek_permission(self, request): + # Boilerplate: potřebujeme nějakou permission, protože nějaká haluz v Djangu… + return request.user.is_superuser + class DeadlineAdminInline(admin.TabularInline): model = m.Deadline extra = 0 @@ -118,11 +122,15 @@ class CisloAdmin(admin.ModelAdmin): force_publish.short_description = 'Zveřejnit vybraná čísla a všechny návrhy úloh v nich učinit zadanými' # Jen pro superuživatele - @admin.action(permissions=[], description='Přegenerovat výsledkovky všech deadlinů vybraných čísel') + @admin.action(permissions=['bazmek'], description='Přegenerovat výsledkovky všech deadlinů vybraných čísel') def pregeneruj_vysledkovky(self, req, qs): for cislo in qs: for deadline in cislo.deadline_v_cisle.all(): deadline.vygeneruj_vysledkovku() + + def has_bazmek_permission(self, request): + # Boilerplate: potřebujeme nějakou permission, protože nějaká haluz v Djangu… + return request.user.is_superuser @admin.register(m.Problem)