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'] # 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) 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)