Web M&M
https://mam.matfyz.cz
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
6.1 KiB
180 lines
6.1 KiB
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']
|
|
|
|
def pregeneruj_vysledkovku(self, req, qs):
|
|
for deadline in qs:
|
|
deadline.vygeneruj_vysledkovku()
|
|
pregeneruj_vysledkovku.short_description = 'Přegeneruj výsledkovky vybraných deadlinů'
|
|
|
|
|
|
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('<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 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(
|
|
'<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(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'
|
|
|
|
def pregeneruj_vysledkovky(self, req, qs):
|
|
for cislo in qs:
|
|
for deadline in cislo.deadline_v_cisle.all():
|
|
deadline.vygeneruj_vysledkovku()
|
|
pregeneruj_vysledkovky.short_description = 'Přegenerovat výsledkovky všech deadlinů vybraných čísel'
|
|
|
|
|
|
@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)
|
|
admin.site.register(m.Novinky)
|
|
|