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