Jonas Havelka
1 year ago
2 changed files with 154 additions and 145 deletions
@ -0,0 +1,151 @@ |
|||
# Todo: reversion |
|||
|
|||
from django.contrib import admin |
|||
from django.forms import ModelForm |
|||
from django.utils.safestring import mark_safe |
|||
from polymorphic.admin import \ |
|||
PolymorphicParentModelAdmin, PolymorphicChildModelAdmin |
|||
|
|||
from soustredeni.models import Konfera |
|||
from .models import * |
|||
|
|||
|
|||
admin.site.register(Rocnik) |
|||
|
|||
admin.site.register(Deadline) |
|||
admin.site.register(ZmrazenaVysledkovka) |
|||
|
|||
|
|||
class DeadlineAdminInline(admin.TabularInline): |
|||
model = Deadline |
|||
extra = 0 |
|||
|
|||
|
|||
class CisloForm(ModelForm): |
|||
class Meta: |
|||
model = Cislo |
|||
fields = '__all__' |
|||
|
|||
def clean(self): |
|||
if self.cleaned_data.get('verejne_db') == False: |
|||
return self.cleaned_data |
|||
# cn = CisloNode.objects.get(cislo=self.instance) |
|||
# errors = [] |
|||
# for ch in tl.all_children(cn): |
|||
# if isinstance(ch, TemaVCisleNode): |
|||
# if ch.tema.stav not in \ |
|||
# (Problem.STAV_ZADANY, Problem.STAV_VYRESENY): |
|||
# errors.append(ValidationError('Téma %(tema)s není zadané ani vyřešené', params={'tema':ch.tema})) |
|||
# |
|||
# if isinstance(ch, UlohaZadaniNode) or isinstance(ch, UlohaVzorakNode): |
|||
# if ch.uloha.stav not in \ |
|||
# (Problem.STAV_ZADANY, Problem.STAV_VYRESENY): |
|||
# errors.append(ValidationError('Úloha %(uloha)s není zadaná ani vyřešená', params={'uloha':ch.uloha})) |
|||
# if isinstance(ch, ReseniNode): |
|||
# for problem in ch.reseni.problem_set: |
|||
# if problem not in \ |
|||
# (Problem.STAV_ZADANY, Problem.STAV_VYRESENY): |
|||
# errors.append(ValidationError('Problém %s není zadaný ani vyřešený', code=problem)) |
|||
# if errors: |
|||
# errors.append(ValidationError(mark_safe('<b>Pokud chceš učinit všechny problémy, co nejsou zadané ani vyřešené, zadanými a číslo zveřejnit, můžeš to udělat pomocí akce v <a href="/admin/seminar/cislo">seznamu čísel</a></b>'))) |
|||
# raise ValidationError(errors) |
|||
|
|||
errors = [] |
|||
for ch in Uloha.objects.filter(cislo_zadani=self.instance): |
|||
if ch.stav not in (Problem.STAV_ZADANY, Problem.STAV_VYRESENY): |
|||
errors.append( |
|||
ValidationError('Úloha %(uloha)s není zadaná ani vyřešená', params={'uloha': ch})) |
|||
if errors: |
|||
errors.append(ValidationError(mark_safe( |
|||
'<b>Pokud chceš učinit všechny problémy, co nejsou zadané ani vyřešené, zadanými a číslo zveřejnit, můžeš to udělat pomocí akce v <a href="/admin/seminar/cislo">seznamu čísel</a></b>'))) |
|||
if self.cleaned_data.get('datum_vydani') is None: |
|||
self.add_error('datum_vydani', 'Číslo určené ke zveřejnění nemá nastavené datum vydání') |
|||
|
|||
if errors: |
|||
raise ValidationError(errors) |
|||
|
|||
return self.cleaned_data |
|||
|
|||
|
|||
@admin.register(Cislo) |
|||
class CisloAdmin(admin.ModelAdmin): |
|||
form = CisloForm |
|||
actions = ['force_publish'] |
|||
inlines = (DeadlineAdminInline,) |
|||
|
|||
def force_publish(self, request, queryset): |
|||
for cislo in queryset: |
|||
# cn = CisloNode.objects.get(cislo=cislo) |
|||
# for ch in tl.all_children(cn): |
|||
# if isinstance(ch, TemaVCisleNode): |
|||
# if ch.tema.stav not in (Problem.STAV_ZADANY, Problem.STAV_VYRESENY): |
|||
# ch.tema.stav = Problem.STAV_ZADANY |
|||
# ch.tema.save() |
|||
# |
|||
# if isinstance(ch, UlohaZadaniNode) or isinstance(ch, UlohaVzorakNode): |
|||
# if ch.uloha.stav not in (Problem.STAV_ZADANY, Problem.STAV_VYRESENY): |
|||
# ch.uloha.stav = Problem.STAV_ZADANY |
|||
# ch.uloha.save() |
|||
# if isinstance(ch, ReseniNode): |
|||
# for problem in ch.reseni.problem_set: |
|||
# if problem not in (Problem.STAV_ZADANY, Problem.STAV_VYRESENY): |
|||
# problem.stav = Problem.STAV_ZADANY |
|||
# problem.save() |
|||
|
|||
for ch in Uloha.objects.filter(cislo_zadani=cislo): |
|||
if ch.stav not in (Problem.STAV_ZADANY, Problem.STAV_VYRESENY): |
|||
ch.stav = Problem.STAV_ZADANY |
|||
ch.save() |
|||
|
|||
hp = ch.hlavni_problem |
|||
if hp.stav not in (Problem.STAV_ZADANY, Problem.STAV_VYRESENY): |
|||
hp.stav = Problem.STAV_ZADANY |
|||
hp.save() |
|||
|
|||
# TODO Řešení, vzoráky? |
|||
# TODO Konfera/Článek? |
|||
|
|||
cislo.verejne_db = True |
|||
cislo.save() |
|||
|
|||
force_publish.short_description = 'Zveřejnit vybraná čísla a všechny návrhy úloh v nich učinit zadanými' |
|||
|
|||
|
|||
@admin.register(Problem) |
|||
class ProblemAdmin(PolymorphicParentModelAdmin): |
|||
base_model = Problem |
|||
child_models = [ |
|||
Tema, |
|||
Clanek, |
|||
Uloha, |
|||
Konfera, |
|||
] |
|||
# Pokud chceme orezavat na aktualni rocnik, musime do modelu pridat odkaz na rocnik. Zatim bere vse. |
|||
search_fields = ['nazev'] |
|||
|
|||
|
|||
# V ProblemAdmin to nejde, protoze se to nepropise do deti |
|||
class ProblemAdminMixin(object): |
|||
show_in_index = True |
|||
autocomplete_fields = ['nadproblem', 'autor', 'garant'] |
|||
filter_horizontal = ['opravovatele'] |
|||
|
|||
|
|||
@admin.register(Tema) |
|||
class TemaAdmin(ProblemAdminMixin, PolymorphicChildModelAdmin): |
|||
base_model = Tema |
|||
|
|||
|
|||
@admin.register(Clanek) |
|||
class ClanekAdmin(ProblemAdminMixin, PolymorphicChildModelAdmin): |
|||
base_model = Clanek |
|||
|
|||
|
|||
@admin.register(Uloha) |
|||
class UlohaAdmin(ProblemAdminMixin, PolymorphicChildModelAdmin): |
|||
base_model = Uloha |
|||
|
|||
|
|||
@admin.register(Konfera) |
|||
class KonferaAdmin(ProblemAdminMixin, PolymorphicChildModelAdmin): |
|||
base_model = Konfera |
Loading…
Reference in new issue