2014-11-17 12:05:46 +01:00
from django . contrib import admin
2021-01-19 21:49:50 +01:00
from django . db import models
2021-03-02 23:46:30 +01:00
from django . forms import widgets , ModelForm
from django . core . exceptions import ValidationError
2015-06-25 11:01:39 +02:00
2019-08-13 23:17:56 +02:00
from polymorphic . admin import PolymorphicParentModelAdmin , PolymorphicChildModelAdmin , PolymorphicChildModelFilter
2020-09-04 17:29:22 +02:00
from solo . admin import SingletonModelAdmin
2021-03-09 22:51:36 +01:00
from django . utils . safestring import mark_safe
2019-08-13 23:17:56 +02:00
2019-08-14 01:17:05 +02:00
# Todo: reversion
2023-08-09 17:11:20 +02:00
from tvorba . models import Rocnik , Cislo , Deadline , ZmrazenaVysledkovka , Problem , Uloha , Tema , Clanek
2023-08-09 16:40:23 +02:00
from seminar . models . nastaveni import Nastaveni
2023-07-31 19:53:12 +02:00
from personalni . models import Resitel
2023-08-09 21:29:14 +02:00
from soustredeni . models import Konfera
2023-07-31 19:13:56 +02:00
from seminar . models . novinky import Novinky
from seminar . models . pomocne import Text , Obrazek
2019-06-20 21:45:35 +02:00
2023-07-31 19:13:56 +02:00
admin . site . register ( Rocnik )
2021-03-02 23:46:30 +01:00
2023-07-31 19:13:56 +02:00
admin . site . register ( Deadline )
admin . site . register ( ZmrazenaVysledkovka )
2022-10-01 11:25:53 +02:00
class DeadlineAdminInline ( admin . TabularInline ) :
2023-07-31 19:13:56 +02:00
model = Deadline
2022-10-01 11:25:53 +02:00
extra = 0
2021-03-02 23:46:30 +01:00
class CisloForm ( ModelForm ) :
class Meta :
2023-07-31 19:13:56 +02:00
model = Cislo
2021-03-02 23:46:30 +01:00
fields = ' __all__ '
2022-05-28 23:13:49 +02:00
2021-03-02 23:46:30 +01:00
def clean ( self ) :
if self . cleaned_data . get ( ' verejne_db ' ) == False :
return self . cleaned_data
2023-07-31 19:13:56 +02:00
# cn = CisloNode.objects.get(cislo=self.instance)
2021-09-05 10:18:02 +02:00
# errors = []
# for ch in tl.all_children(cn):
2023-07-31 19:13:56 +02:00
# if isinstance(ch, TemaVCisleNode):
2021-09-05 10:18:02 +02:00
# if ch.tema.stav not in \
2023-07-31 19:13:56 +02:00
# (Problem.STAV_ZADANY, Problem.STAV_VYRESENY):
2021-09-05 10:18:02 +02:00
# errors.append(ValidationError('Téma %(tema)s není zadané ani vyřešené', params={'tema':ch.tema}))
#
2023-07-31 19:13:56 +02:00
# if isinstance(ch, UlohaZadaniNode) or isinstance(ch, UlohaVzorakNode):
2021-09-05 10:18:02 +02:00
# if ch.uloha.stav not in \
2023-07-31 19:13:56 +02:00
# (Problem.STAV_ZADANY, Problem.STAV_VYRESENY):
2021-09-05 10:18:02 +02:00
# errors.append(ValidationError('Úloha %(uloha)s není zadaná ani vyřešená', params={'uloha':ch.uloha}))
2023-07-31 19:13:56 +02:00
# if isinstance(ch, ReseniNode):
2021-09-05 10:18:02 +02:00
# for problem in ch.reseni.problem_set:
# if problem not in \
2023-07-31 19:13:56 +02:00
# (Problem.STAV_ZADANY, Problem.STAV_VYRESENY):
2021-09-05 10:18:02 +02:00
# errors.append(ValidationError('Problém %s není zadaný ani vyřešený', code=problem))
# if errors:
# errors.append(ValidationError(mark_safe('<b>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 <a href="/admin/seminar/cislo">seznamu čísel</a></b>')))
# raise ValidationError(errors)
2021-03-09 22:51:36 +01:00
errors = [ ]
2023-07-31 19:13:56 +02:00
for ch in Uloha . objects . filter ( cislo_zadani = self . instance ) :
if ch . stav not in ( Problem . STAV_ZADANY , Problem . STAV_VYRESENY ) :
2021-09-05 10:18:02 +02:00
errors . append (
ValidationError ( ' Úloha %(uloha)s není zadaná ani vyřešená ' , params = { ' uloha ' : ch } ) )
2021-03-09 22:51:36 +01:00
if errors :
2021-09-05 10:18:02 +02:00
errors . append ( ValidationError ( mark_safe (
' <b>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 <a href= " /admin/seminar/cislo " >seznamu čísel</a></b> ' ) ) )
2021-11-22 19:44:10 +01:00
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 :
2021-03-09 22:51:36 +01:00
raise ValidationError ( errors )
2021-09-05 10:18:02 +02:00
2021-03-02 23:46:30 +01:00
return self . cleaned_data
2021-03-09 22:51:36 +01:00
2023-07-31 19:13:56 +02:00
@admin.register ( Cislo )
2021-03-02 23:46:30 +01:00
class CisloAdmin ( admin . ModelAdmin ) :
form = CisloForm
2021-03-09 22:51:36 +01:00
actions = [ ' force_publish ' ]
2022-10-01 11:25:53 +02:00
inlines = ( DeadlineAdminInline , )
2021-03-09 22:51:36 +01:00
def force_publish ( self , request , queryset ) :
for cislo in queryset :
2023-07-31 19:13:56 +02:00
# cn = CisloNode.objects.get(cislo=cislo)
2021-09-05 09:49:09 +02:00
# for ch in tl.all_children(cn):
2023-07-31 19:13:56 +02:00
# if isinstance(ch, TemaVCisleNode):
# if ch.tema.stav not in (Problem.STAV_ZADANY, Problem.STAV_VYRESENY):
# ch.tema.stav = Problem.STAV_ZADANY
2021-09-05 09:49:09 +02:00
# ch.tema.save()
#
2023-07-31 19:13:56 +02:00
# 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
2021-09-05 09:49:09 +02:00
# ch.uloha.save()
2023-07-31 19:13:56 +02:00
# if isinstance(ch, ReseniNode):
2021-09-05 09:49:09 +02:00
# for problem in ch.reseni.problem_set:
2023-07-31 19:13:56 +02:00
# if problem not in (Problem.STAV_ZADANY, Problem.STAV_VYRESENY):
# problem.stav = Problem.STAV_ZADANY
2021-09-05 09:49:09 +02:00
# problem.save()
2023-07-31 19:13:56 +02:00
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
2021-09-05 09:49:09 +02:00
ch . save ( )
2022-10-05 21:43:15 +02:00
hp = ch . hlavni_problem
2023-07-31 19:13:56 +02:00
if hp . stav not in ( Problem . STAV_ZADANY , Problem . STAV_VYRESENY ) :
hp . stav = Problem . STAV_ZADANY
2021-09-05 09:49:09 +02:00
hp . save ( )
# TODO Řešení, vzoráky?
# TODO Konfera/Článek?
2021-03-09 22:51:36 +01:00
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 '
2019-08-13 23:17:56 +02:00
2020-12-23 00:02:11 +01:00
2023-07-31 19:13:56 +02:00
@admin.register ( Problem )
2019-08-14 01:34:50 +02:00
class ProblemAdmin ( PolymorphicParentModelAdmin ) :
2023-07-31 19:13:56 +02:00
base_model = Problem
2019-08-14 01:34:50 +02:00
child_models = [
2023-07-31 19:13:56 +02:00
Tema ,
Clanek ,
Uloha ,
Konfera ,
2019-08-14 01:34:50 +02:00
]
2021-02-09 22:03:00 +01:00
# Pokud chceme orezavat na aktualni rocnik, musime do modelu pridat odkaz na rocnik. Zatim bere vse.
search_fields = [ ' nazev ' ]
2019-08-13 23:17:56 +02:00
2021-02-23 21:09:17 +01:00
# 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 ' ]
2023-07-31 19:13:56 +02:00
@admin.register ( Tema )
2021-02-23 21:09:17 +01:00
class TemaAdmin ( ProblemAdminMixin , PolymorphicChildModelAdmin ) :
2023-07-31 19:13:56 +02:00
base_model = Tema
2019-08-14 01:34:50 +02:00
2023-07-31 19:13:56 +02:00
@admin.register ( Clanek )
2021-02-23 21:09:17 +01:00
class ClanekAdmin ( ProblemAdminMixin , PolymorphicChildModelAdmin ) :
2023-07-31 19:13:56 +02:00
base_model = Clanek
2019-08-14 01:34:50 +02:00
2023-07-31 19:13:56 +02:00
@admin.register ( Uloha )
2021-02-23 21:09:17 +01:00
class UlohaAdmin ( ProblemAdminMixin , PolymorphicChildModelAdmin ) :
2023-07-31 19:13:56 +02:00
base_model = Uloha
2019-08-14 01:34:50 +02:00
2023-07-31 19:13:56 +02:00
@admin.register ( Konfera )
2021-02-23 21:09:17 +01:00
class KonferaAdmin ( ProblemAdminMixin , PolymorphicChildModelAdmin ) :
2023-07-31 19:13:56 +02:00
base_model = Konfera
2020-04-01 23:28:21 +02:00
2021-01-19 21:49:50 +01:00
2020-01-08 21:44:50 +01:00
class TextAdminInline ( admin . TabularInline ) :
2023-07-31 19:13:56 +02:00
model = Text
2021-01-19 21:49:50 +01:00
formfield_overrides = {
models . TextField : { ' widget ' : widgets . TextInput }
}
2020-01-08 21:44:50 +01:00
exclude = [ ' text_zkraceny_set ' , ' text_zkraceny ' ]
2021-01-19 21:49:50 +01:00
2023-07-31 19:13:56 +02:00
admin . site . register ( Text )
2020-01-08 21:44:50 +01:00
class ResitelInline ( admin . TabularInline ) :
2023-07-31 19:13:56 +02:00
model = Resitel
2020-01-08 21:44:50 +01:00
extra = 1
2021-01-19 21:49:50 +01:00
2023-07-31 19:13:56 +02:00
# admin.site.register(Pohadka)
admin . site . register ( Obrazek )
admin . site . register ( Nastaveni , SingletonModelAdmin )
admin . site . register ( Novinky )