Merge pull request 'Úpravy výsledkovky' (!36) from pregenerovavani-deadlinu into master
Reviewed-on: #36
This commit is contained in:
commit
14b3caaa04
4 changed files with 41 additions and 23 deletions
|
@ -12,15 +12,25 @@ from django.utils.safestring import mark_safe
|
||||||
import seminar.models as m
|
import seminar.models as m
|
||||||
|
|
||||||
admin.site.register(m.Rocnik)
|
admin.site.register(m.Rocnik)
|
||||||
|
|
||||||
admin.site.register(m.Deadline)
|
|
||||||
admin.site.register(m.ZmrazenaVysledkovka)
|
admin.site.register(m.ZmrazenaVysledkovka)
|
||||||
|
|
||||||
|
@admin.register(m.Deadline)
|
||||||
|
class DeadlineAdmin(admin.ModelAdmin):
|
||||||
|
actions = ['pregeneruj_vysledkovku']
|
||||||
|
|
||||||
|
# Nikomu nezobrazovat, ale superuživatelům se může hodit :-)
|
||||||
|
@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):
|
class DeadlineAdminInline(admin.TabularInline):
|
||||||
model = m.Deadline
|
model = m.Deadline
|
||||||
extra = 0
|
extra = 0
|
||||||
|
|
||||||
|
|
||||||
class CisloForm(ModelForm):
|
class CisloForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -71,7 +81,7 @@ class CisloForm(ModelForm):
|
||||||
@admin.register(m.Cislo)
|
@admin.register(m.Cislo)
|
||||||
class CisloAdmin(admin.ModelAdmin):
|
class CisloAdmin(admin.ModelAdmin):
|
||||||
form = CisloForm
|
form = CisloForm
|
||||||
actions = ['force_publish']
|
actions = ['force_publish', 'pregeneruj_vysledkovky']
|
||||||
inlines = (DeadlineAdminInline,)
|
inlines = (DeadlineAdminInline,)
|
||||||
|
|
||||||
def force_publish(self,request,queryset):
|
def force_publish(self,request,queryset):
|
||||||
|
@ -111,6 +121,17 @@ class CisloAdmin(admin.ModelAdmin):
|
||||||
|
|
||||||
force_publish.short_description = 'Zveřejnit vybraná čísla a všechny návrhy úloh v nich učinit zadanými'
|
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=['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)
|
@admin.register(m.Problem)
|
||||||
class ProblemAdmin(PolymorphicParentModelAdmin):
|
class ProblemAdmin(PolymorphicParentModelAdmin):
|
||||||
|
|
|
@ -491,7 +491,7 @@ class Problem(SeminarModelBase,PolymorphicModel):
|
||||||
return self.nadproblem.kod_v_rocniku+".{}".format(self.kod)
|
return self.nadproblem.kod_v_rocniku+".{}".format(self.kod)
|
||||||
return str(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ý.")
|
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 '<Není zadaný>'
|
return f'<Není zadaný: {self.kod}>'
|
||||||
|
|
||||||
# def verejne(self):
|
# def verejne(self):
|
||||||
# # aktuálně podle stavu problému
|
# # 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.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY:
|
||||||
if self.nadproblem:
|
if self.nadproblem:
|
||||||
return self.nadproblem.kod_v_rocniku+".t{}".format(self.kod)
|
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ý.")
|
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 '<Není zadaný>'
|
return f'<Není zadaný: {self.kod}>'
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
|
@ -607,9 +607,9 @@ class Clanek(Problem):
|
||||||
# Nemělo by být potřeba
|
# Nemělo by být potřeba
|
||||||
# if self.nadproblem:
|
# if self.nadproblem:
|
||||||
# return self.nadproblem.kod_v_rocniku+".c{}".format(self.kod)
|
# 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ý.")
|
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 '<Není zadaný>'
|
return f'<Není zadaný: {self.kod}>'
|
||||||
|
|
||||||
def node(self):
|
def node(self):
|
||||||
return None
|
return None
|
||||||
|
@ -642,12 +642,9 @@ class Uloha(Problem):
|
||||||
@cached_property
|
@cached_property
|
||||||
def kod_v_rocniku(self):
|
def kod_v_rocniku(self):
|
||||||
if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY:
|
if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY:
|
||||||
name="{}.u{}".format(self.cislo_zadani.poradi,self.kod)
|
return f"{self.cislo_zadani.poradi}.{self.kod}"
|
||||||
if self.nadproblem:
|
|
||||||
return self.nadproblem.kod_v_rocniku+name
|
|
||||||
return name
|
|
||||||
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ý.")
|
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 '<Není zadaný>'
|
return f'<Není zadaný: {self.kod}>'
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
<th class='border-r'>#</th>
|
<th class='border-r'>#</th>
|
||||||
<th class='border-r'>Jméno</th>
|
<th class='border-r'>Jméno</th>
|
||||||
{% for p in vysledkovka.temata_a_spol%}
|
{% for p in vysledkovka.temata_a_spol%}
|
||||||
<th class='border-r' id="problem{{ oznaceni_vysledkovky }}_{{ forloop.counter0 }}">{# <a href="{{ p.verejne_url }}"> #}{{ p.kod_v_rocniku }}{# </a> #}</th>
|
<th class='border-r' id="problem{{ oznaceni_vysledkovky }}_{{ forloop.counter0 }}">{# <a href="{{ p.verejne_url }}"> #}<span title="{{ p }}">{{ p.kod_v_rocniku }}</span>{# </a> #}</th>
|
||||||
|
|
||||||
{# TODELETE #}
|
{# TODELETE #}
|
||||||
{% for podproblemy in vysledkovka.podproblemy_iter.next %}
|
{% for podproblemy in vysledkovka.podproblemy_iter.next %}
|
||||||
<th class='border-r podproblem{{ oznaceni_vysledkovky }}_{{ forloop.parentloop.counter0 }} podproblem'>{# <a href="{{ podproblemy.verejne_url }}"> #}{{ podproblemy.kod_v_rocniku }}{# </a> #}</th>
|
<th class='border-r podproblem{{ oznaceni_vysledkovky }}_{{ forloop.parentloop.counter0 }} podproblem'>{# <a href="{{ podproblemy.verejne_url }}"> #}<span title="{{ podproblemy }}">{{ podproblemy.kod_v_rocniku }}</span>{# </a> #}</th>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{# TODELETE #}
|
{# TODELETE #}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
{# TODELETE #}
|
{# TODELETE #}
|
||||||
{% for podproblemy in vysledkovka.podproblemy_iter.next %}
|
{% for podproblemy in vysledkovka.podproblemy_iter.next %}
|
||||||
<th class='border-r podproblem{{ oznaceni_vysledkovky }}_{{ vysledkovka.temata_a_spol| length }} podproblem'>{# <a href="{{ podproblemy.verejne_url }}"> #}{{ podproblemy.kod_v_rocniku }}{# </a> #}</th>
|
<th class='border-r podproblem{{ oznaceni_vysledkovky }}_{{ vysledkovka.temata_a_spol| length }} podproblem'>{# <a href="{{ podproblemy.verejne_url }}"> #}<span title="{{ podproblemy }}">{{ podproblemy.kod_v_rocniku }}</span>{# </a> #}</th>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{# TODELETE #}
|
{# TODELETE #}
|
||||||
|
|
||||||
|
|
|
@ -257,7 +257,7 @@ class VysledkovkaCisla(Vysledkovka):
|
||||||
# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém)
|
# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém)
|
||||||
hlavni_problemy = set()
|
hlavni_problemy = set()
|
||||||
for p in self.problemy:
|
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í
|
# zunikátnění
|
||||||
hlavni_problemy = list(hlavni_problemy)
|
hlavni_problemy = list(hlavni_problemy)
|
||||||
|
@ -313,7 +313,7 @@ class VysledkovkaCisla(Vysledkovka):
|
||||||
|
|
||||||
# Sečteme hodnocení
|
# Sečteme hodnocení
|
||||||
for hodnoceni in self.hodnoceni_do_cisla:
|
for hodnoceni in self.hodnoceni_do_cisla:
|
||||||
prob = hodnoceni.problem
|
prob = hodnoceni.problem.get_real_instance()
|
||||||
nadproblem = prob.hlavni_problem.id
|
nadproblem = prob.hlavni_problem.id
|
||||||
|
|
||||||
# Když nadproblém není "téma", pak je "Ostatní"
|
# Když nadproblém není "téma", pak je "Ostatní"
|
||||||
|
@ -366,9 +366,9 @@ class VysledkovkaCisla(Vysledkovka):
|
||||||
for problem in self.problemy:
|
for problem in self.problemy:
|
||||||
h_problem = problem.hlavni_problem
|
h_problem = problem.hlavni_problem
|
||||||
if h_problem in temata_a_spol:
|
if h_problem in temata_a_spol:
|
||||||
podproblemy[h_problem.id].append(problem)
|
podproblemy[h_problem.id].append(problem.get_real_instance())
|
||||||
else:
|
else:
|
||||||
podproblemy[-1].append(problem)
|
podproblemy[-1].append(problem.get_real_instance())
|
||||||
|
|
||||||
for podproblem in podproblemy.keys():
|
for podproblem in podproblemy.keys():
|
||||||
podproblemy[podproblem] = sorted(podproblemy[podproblem], key=lambda p: p.kod_v_rocniku)
|
podproblemy[podproblem] = sorted(podproblemy[podproblem], key=lambda p: p.kod_v_rocniku)
|
||||||
|
|
Loading…
Reference in a new issue