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 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'] # Nikomu nezobrazovat, ale superuživatelům se může hodit :-) @admin.action(permissions=['bazmek'], description= 'Přegeneruj výsledkovky vybraných deadlinů') def pregeneruj_vysledkovku(self, req, qs): for deadline in qs: deadline.vygeneruj_vysledkovku() def has_bazmek_permission(self, request): # Boilerplate: potřebujeme nějakou permission, protože nějaká haluz v Djangu… return request.user.is_superuser 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' # Jen pro superuživatele @admin.action(permissions=['bazmek'], description='Přegenerovat výsledkovky všech deadlinů vybraných čísel') def pregeneruj_vysledkovky(self, req, qs): for cislo in qs: for deadline in cislo.deadline_v_cisle.all(): deadline.vygeneruj_vysledkovku() def has_bazmek_permission(self, request): # Boilerplate: potřebujeme nějakou permission, protože nějaká haluz v Djangu… return request.user.is_superuser @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) # admin.site.register(m.Pohadka) admin.site.register(m.Obrazek) admin.site.register(m.Nastaveni, SingletonModelAdmin)