from django.contrib import admin
from django.db import models
from django.forms import widgets, ModelForm
from django.core.exceptions import ValidationError
from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter
from solo.admin import SingletonModelAdmin
from django.utils.safestring import mark_safe
# Todo: reversion
from seminar.models.tvorba import Rocnik, Cislo, Deadline, ZmrazenaVysledkovka, Problem, Uloha, Tema, Clanek, Nastaveni
from seminar.models.personalni import Resitel
from seminar.models.soustredeni import Konfera
from seminar.models.novinky import Novinky
from seminar.models.pomocne import Text, Obrazek
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('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 seznamu čísel')))
# 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(
'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 seznamu čísel')))
if self.cleaned_data.get('datum_vydani') == 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
class TextAdminInline(admin.TabularInline):
model = Text
formfield_overrides = {
models.TextField: {'widget': widgets.TextInput}
}
exclude = ['text_zkraceny_set','text_zkraceny']
admin.site.register(Text)
class ResitelInline(admin.TabularInline):
model = Resitel
extra = 1
# admin.site.register(Pohadka)
admin.site.register(Obrazek)
admin.site.register(Nastaveni, SingletonModelAdmin)
admin.site.register(Novinky)