diff --git a/seminar/admin.py b/seminar/admin.py index b237c686..f57aa980 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -1,157 +1,15 @@ +# Todo: reversion + 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 django.forms import widgets from solo.admin import SingletonModelAdmin -from django.utils.safestring import mark_safe - -# Todo: reversion -from tvorba.models import Rocnik, Cislo, Deadline, ZmrazenaVysledkovka, Problem, Uloha, Tema, Clanek from seminar.models.nastaveni import Nastaveni from personalni.models import Resitel -from soustredeni.models import Konfera from seminar.models.novinky import Novinky from seminar.models.pomocne import Text, Obrazek -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') == 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 - class TextAdminInline(admin.TabularInline): model = Text diff --git a/tvorba/admin.py b/tvorba/admin.py new file mode 100644 index 00000000..4137bbe5 --- /dev/null +++ b/tvorba/admin.py @@ -0,0 +1,151 @@ +# Todo: reversion + +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