from django.contrib import admin from django.forms import ModelForm from django.core.exceptions import ValidationError from django.utils.safestring import mark_safe from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin from solo.admin import SingletonModelAdmin from soustredeni.models.konfera import Konfera import tvorba.models as m admin.site.register(m.Rocnik) admin.site.register(m.Deadline) # Todo: reversion class DeadlineAdminInline(admin.TabularInline): model = m.Deadline extra = 0 class CisloForm(ModelForm): class Meta: model = m.Cislo fields = '__all__' def clean(self): if not self.cleaned_data.get('verejne_db'): return self.cleaned_data # cn = m.CisloNode.objects.get(cislo=self.instance) # errors = [] # 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): # errors.append(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): # errors.append(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): # 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 m.Uloha.objects.filter(cislo_zadani=self.instance): if ch.stav not in (m.Problem.STAV_ZADANY, m.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(m.Cislo) class CisloAdmin(admin.ModelAdmin): form = CisloForm actions = ['force_publish'] inlines = (DeadlineAdminInline,) def force_publish(self, _request, queryset): for cislo in queryset: # cn = m.CisloNode.objects.get(cislo=cislo) # 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): # ch.tema.stav = m.Problem.STAV_ZADANY # ch.tema.save() # # if isinstance(ch, m.UlohaZadaniNode) or isinstance(ch, m.UlohaVzorakNode): # if ch.uloha.stav not in (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): # ch.uloha.stav = m.Problem.STAV_ZADANY # ch.uloha.save() # if isinstance(ch, m.ReseniNode): # for problem in ch.reseni.problem_set: # if problem not in (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): # problem.stav = m.Problem.STAV_ZADANY # problem.save() for ch in m.Uloha.objects.filter(cislo_zadani=cislo): if ch.stav not in (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): ch.stav = m.Problem.STAV_ZADANY ch.save() hp = ch.hlavni_problem if hp.stav not in (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): hp.stav = m.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(m.Problem) class ProblemAdmin(PolymorphicParentModelAdmin): base_model = m.Problem child_models = [ m.Tema, m.Clanek, m.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(m.Tema) class TemaAdmin(ProblemAdminMixin, PolymorphicChildModelAdmin): base_model = m.Tema @admin.register(m.Clanek) class ClanekAdmin(ProblemAdminMixin, PolymorphicChildModelAdmin): base_model = m.Clanek @admin.register(m.Uloha) class UlohaAdmin(ProblemAdminMixin, PolymorphicChildModelAdmin): base_model = m.Uloha # admin.site.register(m.Pohadka) admin.site.register(m.Nastaveni, SingletonModelAdmin)