Jonas Havelka
4 months ago
36 changed files with 215 additions and 190 deletions
@ -0,0 +1,177 @@ |
|||||
|
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.utils.safestring import mark_safe |
||||
|
|
||||
|
# Todo: reversion |
||||
|
|
||||
|
import soustredeni.models |
||||
|
|
||||
|
from seminar.models.tvorba import Rocnik, ZmrazenaVysledkovka, Deadline, Uloha, Problem, Tema, Clanek, Cislo |
||||
|
|
||||
|
admin.site.register(Rocnik) |
||||
|
admin.site.register(ZmrazenaVysledkovka) |
||||
|
|
||||
|
@admin.register(Deadline) |
||||
|
class DeadlineAdmin(admin.ModelAdmin): |
||||
|
actions = ['pregeneruj_vysledkovku'] |
||||
|
|
||||
|
# Nikomu nezobrazovat, ale superuživatelům se může hodit :-) |
||||
|
@admin.action(permissions=['bazmek'], description= 'Přegeneruj výsledkovky vybraných deadlinů') |
||||
|
def pregeneruj_vysledkovku(self, req, qs): |
||||
|
for deadline in qs: |
||||
|
deadline.vygeneruj_vysledkovku() |
||||
|
|
||||
|
def has_bazmek_permission(self, request): |
||||
|
# Boilerplate: potřebujeme nějakou permission, protože nějaká haluz v Djangu… |
||||
|
return request.user.is_superuser |
||||
|
|
||||
|
|
||||
|
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('<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', 'pregeneruj_vysledkovky'] |
||||
|
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' |
||||
|
|
||||
|
# Jen pro superuživatele |
||||
|
@admin.action(permissions=['bazmek'], description='Přegenerovat výsledkovky všech deadlinů vybraných čísel') |
||||
|
def pregeneruj_vysledkovky(self, req, qs): |
||||
|
for cislo in qs: |
||||
|
for deadline in cislo.deadline_v_cisle.all(): |
||||
|
deadline.vygeneruj_vysledkovku() |
||||
|
|
||||
|
def has_bazmek_permission(self, request): |
||||
|
# Boilerplate: potřebujeme nějakou permission, protože nějaká haluz v Djangu… |
||||
|
return request.user.is_superuser |
||||
|
|
||||
|
|
||||
|
@admin.register(Problem) |
||||
|
class ProblemAdmin(PolymorphicParentModelAdmin): |
||||
|
base_model = Problem |
||||
|
child_models = [ |
||||
|
Tema, |
||||
|
Clanek, |
||||
|
Uloha, |
||||
|
soustredeni.models.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(soustredeni.models.Konfera) |
||||
|
class KonferaAdmin(ProblemAdminMixin,PolymorphicChildModelAdmin): |
||||
|
base_model = soustredeni.models.Konfera |
||||
|
|
@ -0,0 +1,6 @@ |
|||||
|
from django.apps import AppConfig |
||||
|
|
||||
|
|
||||
|
class TvorbaConfig(AppConfig): |
||||
|
name = 'tvorba' |
||||
|
verbose_name = 'Tvorba' |
@ -1,6 +1,6 @@ |
|||||
from django.urls import path, include, re_path |
from django.urls import path, include, re_path |
||||
from . import views |
from . import views |
||||
from .utils import org_required |
from seminar.utils import org_required |
||||
|
|
||||
urlpatterns = [ |
urlpatterns = [ |
||||
# path('aktualni/temata/', views.TemataRozcestnikView), |
# path('aktualni/temata/', views.TemataRozcestnikView), |
@ -1 +1,6 @@ |
|||||
|
from solo.admin import SingletonModelAdmin |
||||
from django.contrib import admin |
from django.contrib import admin |
||||
|
|
||||
|
from .models import Nastaveni |
||||
|
|
||||
|
admin.site.register(Nastaveni, SingletonModelAdmin) |
||||
|
Loading…
Reference in new issue