diff --git a/seminar/admin.py b/seminar/admin.py index 4da32e96..849ca696 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -1,7 +1,8 @@ from django.contrib import admin from django.contrib.auth.models import Group from django.db import models -from django.forms import widgets +from django.forms import widgets, ModelForm +from django.core.exceptions import ValidationError from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter from reversion.admin import VersionAdmin @@ -12,11 +13,43 @@ from solo.admin import SingletonModelAdmin # Todo: reversion import seminar.models as m +import seminar.treelib as tl admin.site.register(m.Skola) admin.site.register(m.Prijemce) admin.site.register(m.Rocnik) -admin.site.register(m.Cislo) + +class CisloForm(ModelForm): + class Meta: + model = m.Cislo + fields = '__all__' + + def clean(self): + print("Cleaning...") + print(self.cleaned_data) + if self.cleaned_data.get('verejne_db') == False: + return self.cleaned_data + cn = m.CisloNode.objects.get(cislo=self.instance) + for ch in tl.all_children(cn): + if isinstance(ch, m.TemaVCisleNode): + if ch.tema.stav not in \ + (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): + raise ValidationError('Téma %(tema)s není zadané ani vyřešené', params={'tema':ch.tema}) + + if isinstance(ch, m.UlohaZadaniNode) or isinstance(ch, m.UlohaVzorakNode): + if ch.uloha.stav not in \ + (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): + raise ValidationError('Úloha %(uloha)s není zadaná ani vyřešená', params={'uloha':ch.uloha}) + if isinstance(ch, m.ReseniNode): + for problem in ch.reseni.problem_set: + if problem not in \ + (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): + raise ValidationError('Problém %s není zadaný ani vyřešený', code=problem) + return self.cleaned_data + +@admin.register(m.Cislo) +class CisloAdmin(admin.ModelAdmin): + form = CisloForm @admin.register(m.Osoba) class OsobaAdmin(admin.ModelAdmin): diff --git a/seminar/models.py b/seminar/models.py index b85711e5..f2c418e6 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -864,31 +864,31 @@ class Problem(SeminarModelBase,PolymorphicModel): return str(self.kod) return '' - def verejne(self): - # aktuálně podle stavu problému - # FIXME pro některé problémy možná chceme override - # FIXME vrací veřejnost čistě problému, nezávisle na čísle, ve kterém je. - # Je to tak správně? Podle aktuální představy ano. - stav_verejny = False - if self.stav == 'zadany' or self.stav == 'vyreseny': - stav_verejny = True - print("stav_verejny: {}".format(stav_verejny)) - - cislo_verejne = False - cislonode = self.cislo_node() - if cislonode is None: - # problém nemá vlastní node, veřejnost posuzujeme jen podle stavu - print("empty node") - return stav_verejny - else: - cislo_zadani = cislonode.cislo - if (cislo_zadani and cislo_zadani.verejne()): - print("cislo: {}".format(cislo_zadani)) - cislo_verejne = True - print("stav_verejny: {}".format(stav_verejny)) - print("cislo_verejne: {}".format(cislo_verejne)) - return (stav_verejny and cislo_verejne) - verejne.boolean = True +# def verejne(self): +# # aktuálně podle stavu problému +# # FIXME pro některé problémy možná chceme override +# # FIXME vrací veřejnost čistě problému, nezávisle na čísle, ve kterém je. +# # Je to tak správně? Podle aktuální představy ano. +# stav_verejny = False +# if self.stav == 'zadany' or self.stav == 'vyreseny': +# stav_verejny = True +# print("stav_verejny: {}".format(stav_verejny)) +# +# cislo_verejne = False +# cislonode = self.cislo_node() +# if cislonode is None: +# # problém nemá vlastní node, veřejnost posuzujeme jen podle stavu +# print("empty node") +# return stav_verejny +# else: +# cislo_zadani = cislonode.cislo +# if (cislo_zadani and cislo_zadani.verejne()): +# print("cislo: {}".format(cislo_zadani)) +# cislo_verejne = True +# print("stav_verejny: {}".format(stav_verejny)) +# print("cislo_verejne: {}".format(cislo_verejne)) +# return (stav_verejny and cislo_verejne) +# verejne.boolean = True def verejne_url(self): return reverse('seminar_problem', kwargs={'pk': self.id}) diff --git a/seminar/templates/seminar/zadani/AktualniVysledkovka.html b/seminar/templates/seminar/zadani/AktualniVysledkovka.html index ed89c87c..5874c983 100644 --- a/seminar/templates/seminar/zadani/AktualniVysledkovka.html +++ b/seminar/templates/seminar/zadani/AktualniVysledkovka.html @@ -24,7 +24,9 @@

Výsledky včetně neveřejných

{% with vysledkovka_s_neverejnymi as radky_vysledkovky %} + {% with cisla_s_neverejnymi as cisla %} {% include "seminar/vysledkovka_rocnik.html" %} + {% endwith %} {% endwith %}
{% endif %} diff --git a/seminar/utils.py b/seminar/utils.py index a02c317c..e28f3cbc 100644 --- a/seminar/utils.py +++ b/seminar/utils.py @@ -232,7 +232,7 @@ def cisla_rocniku(rocnik, jen_verejne=True): if jen_verejne: return rocnik.verejna_cisla() else: - return rocnik.cisla.all() + return rocnik.cisla.all().order_by('poradi') def hlavni_problem(problem): """ Pro daný problém vrátí jeho nejvyšší nadproblém.""" diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 032e9380..04600d6a 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -503,6 +503,7 @@ def ZadaniAktualniVysledkovkaView(request): pass # vysledkovka s neverejnyma vysledkama vysledkovka_s_neverejnymi = vysledkovka_rocniku(nastaveni.aktualni_rocnik, jen_verejne=False) + cisla_s_neverejnymi = cisla_rocniku(nastaveni.aktualni_rocnik, jen_verejne=False) return render( request, 'seminar/zadani/AktualniVysledkovka.html', @@ -511,6 +512,7 @@ def ZadaniAktualniVysledkovkaView(request): 'radky_vysledkovky': vysledkovka, 'cisla': cisla, 'vysledkovka_s_neverejnymi': vysledkovka_s_neverejnymi, + 'cisla_s_neverejnymi': cisla_s_neverejnymi, } )