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 import seminar.models as m admin.site.register(m.Rocnik) admin.site.register(m.ZmrazenaVysledkovka) @admin.register(m.Deadline) class DeadlineAdmin(admin.ModelAdmin): actions = ['pregeneruj_vysledkovku'] def pregeneruj_vysledkovku(self, req, qs): for deadline in qs: deadline.vygeneruj_vysledkovku() pregeneruj_vysledkovku.short_description = 'Přegeneruj výsledkovky vybraných deadlinů' class DeadlineAdminInline(admin.TabularInline): model = m.Deadline extra = 0 class CisloForm(ModelForm): class Meta: model = m.Cislo fields = '__all__' def clean(self): if self.cleaned_data.get('verejne_db') == False: 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') == 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', 'pregeneruj_vysledkovky'] 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' def pregeneruj_vysledkovky(self, req, qs): for cislo in qs: for deadline in cislo.deadline_v_cisle.all(): deadline.vygeneruj_vysledkovku() pregeneruj_vysledkovky.short_description = 'Přegenerovat výsledkovky všech deadlinů vybraných čísel' @admin.register(m.Problem) class ProblemAdmin(PolymorphicParentModelAdmin): base_model = m.Problem child_models = [ m.Tema, m.Clanek, m.Uloha, m.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.register(m.Konfera) class KonferaAdmin(ProblemAdminMixin,PolymorphicChildModelAdmin): base_model = m.Konfera class TextAdminInline(admin.TabularInline): model = m.Text formfield_overrides = { models.TextField: {'widget': widgets.TextInput} } exclude = ['text_zkraceny_set','text_zkraceny'] admin.site.register(m.Text) class ResitelInline(admin.TabularInline): model = m.Resitel extra = 1 # admin.site.register(m.Pohadka) admin.site.register(m.Obrazek) admin.site.register(m.Nastaveni, SingletonModelAdmin) admin.site.register(m.Novinky)