mamweb/seminar/admin.py

174 lines
5.7 KiB
Python
Raw Normal View History

2014-11-17 12:05:46 +01:00
from django.contrib import admin
from django.db import models
from django.forms import widgets, ModelForm
from django.core.exceptions import ValidationError
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
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 16:40:23 +02:00
from seminar.models.tvorba import Rocnik, Cislo, Deadline, ZmrazenaVysledkovka, Problem, Uloha, Tema, Clanek
from seminar.models.nastaveni import Nastaveni
2023-07-31 19:53:12 +02:00
from personalni.models import Resitel
from seminar.models.soustredeni 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)
2022-10-01 11:25:53 +02:00
class DeadlineAdminInline(admin.TabularInline):
model = Deadline
2022-10-01 11:25:53 +02:00
extra = 0
class CisloForm(ModelForm):
class Meta:
model = Cislo
fields = '__all__'
2022-05-28 23:13:49 +02:00
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('<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)
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(
'<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>')))
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']
2022-10-01 11:25:53 +02:00
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'
2019-08-13 23:17:56 +02:00
@admin.register(Problem)
2019-08-14 01:34:50 +02:00
class ProblemAdmin(PolymorphicParentModelAdmin):
base_model = Problem
2019-08-14 01:34:50 +02:00
child_models = [
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
# 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
2019-08-14 01:34:50 +02:00
@admin.register(Clanek)
class ClanekAdmin(ProblemAdminMixin,PolymorphicChildModelAdmin):
base_model = Clanek
2019-08-14 01:34:50 +02:00
@admin.register(Uloha)
class UlohaAdmin(ProblemAdminMixin,PolymorphicChildModelAdmin):
base_model = Uloha
2019-08-14 01:34:50 +02:00
@admin.register(Konfera)
class KonferaAdmin(ProblemAdminMixin,PolymorphicChildModelAdmin):
base_model = Konfera
class TextAdminInline(admin.TabularInline):
model = Text
formfield_overrides = {
models.TextField: {'widget': widgets.TextInput}
}
exclude = ['text_zkraceny_set','text_zkraceny']
admin.site.register(Text)
class ResitelInline(admin.TabularInline):
model = Resitel
extra = 1
# admin.site.register(Pohadka)
admin.site.register(Obrazek)
admin.site.register(Nastaveni, SingletonModelAdmin)
admin.site.register(Novinky)