# Todo: reversion from django.core.exceptions import ValidationError 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('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') 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