Rozstřílení seminářové aplikace #60
36 changed files with 215 additions and 190 deletions
|
@ -1,7 +1,6 @@
|
||||||
from django.test import TestCase, tag
|
from django.test import TestCase, tag
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
import seminar.models as m
|
import seminar.models as m
|
||||||
import seminar.views as v
|
|
||||||
from seminar.utils import sync_skoly
|
from seminar.utils import sync_skoly
|
||||||
|
|
||||||
@tag('stejny-model-na-produkci')
|
@tag('stejny-model-na-produkci')
|
||||||
|
|
|
@ -131,6 +131,7 @@ INSTALLED_APPS = (
|
||||||
# MaMweb
|
# MaMweb
|
||||||
'mamweb',
|
'mamweb',
|
||||||
'seminar',
|
'seminar',
|
||||||
|
'tvorba',
|
||||||
'galerie',
|
'galerie',
|
||||||
'korektury',
|
'korektury',
|
||||||
'prednasky',
|
'prednasky',
|
||||||
|
|
|
@ -17,8 +17,8 @@ urlpatterns = [
|
||||||
path('admin/', admin.site.urls), # NOQA
|
path('admin/', admin.site.urls), # NOQA
|
||||||
path('ckeditor/', include('ckeditor_uploader.urls')),
|
path('ckeditor/', include('ckeditor_uploader.urls')),
|
||||||
|
|
||||||
# Seminarova aplikace (ma vlastni podadresare)
|
# Tvorba = ročníky, čísla, problémy atd. (ma vlastni podadresare)
|
||||||
path('', include('seminar.urls')),
|
path('', include('tvorba.urls')),
|
||||||
|
|
||||||
# Odevzdavatko (ma vlastni podadresare)
|
# Odevzdavatko (ma vlastni podadresare)
|
||||||
path('', include('odevzdavatko.urls')),
|
path('', include('odevzdavatko.urls')),
|
||||||
|
|
165
seminar/admin.py
165
seminar/admin.py
|
@ -1,173 +1,11 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.forms import widgets, ModelForm
|
from django.forms import widgets
|
||||||
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
|
# Todo: reversion
|
||||||
|
|
||||||
import seminar.models as m
|
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']
|
|
||||||
|
|
||||||
# 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 = 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'
|
|
||||||
|
|
||||||
# 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(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):
|
class TextAdminInline(admin.TabularInline):
|
||||||
model = m.Text
|
model = m.Text
|
||||||
|
@ -180,4 +18,3 @@ admin.site.register(m.Text)
|
||||||
|
|
||||||
# admin.site.register(m.Pohadka)
|
# admin.site.register(m.Pohadka)
|
||||||
admin.site.register(m.Obrazek)
|
admin.site.register(m.Obrazek)
|
||||||
admin.site.register(m.Nastaveni, SingletonModelAdmin)
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{% extends "seminar/archiv/base.html" %}
|
{% extends "tvorba/archiv/base.html" %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
|
||||||
{% block custom_css %}
|
{% block custom_css %}
|
||||||
|
|
0
tvorba/__init__.py
Normal file
0
tvorba/__init__.py
Normal file
177
tvorba/admin.py
Normal file
177
tvorba/admin.py
Normal file
|
@ -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
|
||||||
|
|
6
tvorba/apps.py
Normal file
6
tvorba/apps.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class TvorbaConfig(AppConfig):
|
||||||
|
name = 'tvorba'
|
||||||
|
verbose_name = 'Tvorba'
|
0
tvorba/migrations/__init__.py
Normal file
0
tvorba/migrations/__init__.py
Normal file
|
@ -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),
|
|
@ -82,7 +82,7 @@ def get_problemy_k_tematu(tema):
|
||||||
|
|
||||||
|
|
||||||
#class AktualniZadaniView(generic.TemplateView):
|
#class AktualniZadaniView(generic.TemplateView):
|
||||||
# template_name = 'seminar/treenode.html'
|
# template_name = 'treenode/treenode.html'
|
||||||
|
|
||||||
# TODO Co chceme vlastně zobrazovat na této stránce? Zatím je zde aktuální číslo, ale může tu být cokoli jiného...
|
# TODO Co chceme vlastně zobrazovat na této stránce? Zatím je zde aktuální číslo, ale může tu být cokoli jiného...
|
||||||
#class AktualniZadaniView(TreeNodeView):
|
#class AktualniZadaniView(TreeNodeView):
|
||||||
|
@ -100,7 +100,7 @@ def get_problemy_k_tematu(tema):
|
||||||
def AktualniZadaniView(request):
|
def AktualniZadaniView(request):
|
||||||
nastaveni = get_object_or_404(Nastaveni)
|
nastaveni = get_object_or_404(Nastaveni)
|
||||||
verejne = nastaveni.aktualni_cislo.verejne()
|
verejne = nastaveni.aktualni_cislo.verejne()
|
||||||
return render(request, 'seminar/zadani/AktualniZadani.html',
|
return render(request, 'tvorba/zadani/AktualniZadani.html',
|
||||||
{'nastaveni': nastaveni,
|
{'nastaveni': nastaveni,
|
||||||
'verejne': verejne,
|
'verejne': verejne,
|
||||||
},
|
},
|
||||||
|
@ -111,7 +111,7 @@ def ZadaniTemataView(request):
|
||||||
verejne = nastaveni.aktualni_cislo.verejne()
|
verejne = nastaveni.aktualni_cislo.verejne()
|
||||||
akt_rocnik = nastaveni.aktualni_cislo.rocnik
|
akt_rocnik = nastaveni.aktualni_cislo.rocnik
|
||||||
temata = s.Tema.objects.filter(rocnik=akt_rocnik, stav='zadany')
|
temata = s.Tema.objects.filter(rocnik=akt_rocnik, stav='zadany')
|
||||||
return render(request, 'seminar/tematka/rozcestnik.html',
|
return render(request, 'tvorba/tematka/rozcestnik.html',
|
||||||
{
|
{
|
||||||
'tematka': temata,
|
'tematka': temata,
|
||||||
'verejne': verejne,
|
'verejne': verejne,
|
||||||
|
@ -126,7 +126,7 @@ def ZadaniTemataView(request):
|
||||||
# t.prispevky = t.prispevek_set.filter(problem=t)
|
# t.prispevky = t.prispevek_set.filter(problem=t)
|
||||||
# else:
|
# else:
|
||||||
# t.prispevky = t.prispevek_set.filter(problem=t, zverejnit=True)
|
# t.prispevky = t.prispevek_set.filter(problem=t, zverejnit=True)
|
||||||
# return render(request, 'seminar/zadani/Temata.html',
|
# return render(request, 'tvorba/zadani/Temata.html',
|
||||||
# {
|
# {
|
||||||
# 'temata': temata,
|
# 'temata': temata,
|
||||||
# }
|
# }
|
||||||
|
@ -145,7 +145,7 @@ def ZadaniTemataView(request):
|
||||||
# if node.isinstance(node, s.PohadkaNode): # Mohu ignorovat, má pod sebou
|
# if node.isinstance(node, s.PohadkaNode): # Mohu ignorovat, má pod sebou
|
||||||
# pass
|
# pass
|
||||||
#
|
#
|
||||||
# return render(request, 'seminar/tematka/toaletak.html', {})
|
# return render(request, 'tvorba/tematka/toaletak.html', {})
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
#def TemataRozcestnikView(request):
|
#def TemataRozcestnikView(request):
|
||||||
|
@ -181,7 +181,7 @@ def ZadaniTemataView(request):
|
||||||
# "obrazek": tematko_object.obrazek,
|
# "obrazek": tematko_object.obrazek,
|
||||||
# "cisla" : cisla
|
# "cisla" : cisla
|
||||||
# })
|
# })
|
||||||
# return render(request, 'seminar/tematka/rozcestnik.html', {"tematka": tematka, "rocnik" : nastaveni.aktualni_rocnik().rocnik})
|
# return render(request, 'tvorba/tematka/rozcestnik.html', {"tematka": tematka, "rocnik" : nastaveni.aktualni_rocnik().rocnik})
|
||||||
#
|
#
|
||||||
|
|
||||||
def ZadaniAktualniVysledkovkaView(request):
|
def ZadaniAktualniVysledkovkaView(request):
|
||||||
|
@ -205,7 +205,7 @@ def ZadaniAktualniVysledkovkaView(request):
|
||||||
context['rocnik'] = rocnik
|
context['rocnik'] = rocnik
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
'seminar/zadani/AktualniVysledkovka.html',
|
'tvorba/zadani/AktualniVysledkovka.html',
|
||||||
context
|
context
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ def aktualni_temata(rocnik):
|
||||||
|
|
||||||
class ArchivView(generic.ListView):
|
class ArchivView(generic.ListView):
|
||||||
model = Rocnik
|
model = Rocnik
|
||||||
template_name='seminar/archiv/cisla.html'
|
template_name = 'tvorba/archiv/cisla.html'
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(ArchivView, self).get_context_data(**kwargs)
|
context = super(ArchivView, self).get_context_data(**kwargs)
|
||||||
|
@ -252,7 +252,7 @@ class ArchivView(generic.ListView):
|
||||||
|
|
||||||
class RocnikView(generic.DetailView):
|
class RocnikView(generic.DetailView):
|
||||||
model = Rocnik
|
model = Rocnik
|
||||||
template_name = 'seminar/archiv/rocnik.html'
|
template_name = 'tvorba/archiv/rocnik.html'
|
||||||
|
|
||||||
# Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik)
|
# Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik)
|
||||||
def get_object(self, queryset=None):
|
def get_object(self, queryset=None):
|
||||||
|
@ -292,7 +292,7 @@ def resiteleRocnikuCsvExportView(request, rocnik):
|
||||||
# s.Clanek: "clanek",
|
# s.Clanek: "clanek",
|
||||||
# }
|
# }
|
||||||
# context = super().get_context_data(**kwargs)
|
# context = super().get_context_data(**kwargs)
|
||||||
# return ['seminar/archiv/problem_' + spravne_templaty[context['object'].__class__] + '.html']
|
# return ['tvorba/archiv/problem_' + spravne_templaty[context['object'].__class__] + '.html']
|
||||||
#
|
#
|
||||||
# def get_context_data(self, **kwargs):
|
# def get_context_data(self, **kwargs):
|
||||||
# context = super().get_context_data(**kwargs)
|
# context = super().get_context_data(**kwargs)
|
||||||
|
@ -308,7 +308,7 @@ def resiteleRocnikuCsvExportView(request, rocnik):
|
||||||
class CisloView(generic.DetailView):
|
class CisloView(generic.DetailView):
|
||||||
# FIXME zobrazování témátek a vůbec, teď je tam jen odkaz na číslo v pdf
|
# FIXME zobrazování témátek a vůbec, teď je tam jen odkaz na číslo v pdf
|
||||||
model = Cislo
|
model = Cislo
|
||||||
template_name = 'seminar/archiv/cislo.html'
|
template_name = 'tvorba/archiv/cislo.html'
|
||||||
|
|
||||||
# Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik)
|
# Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik)
|
||||||
def get_object(self, queryset=None):
|
def get_object(self, queryset=None):
|
||||||
|
@ -351,7 +351,7 @@ class CisloView(generic.DetailView):
|
||||||
|
|
||||||
class ArchivTemataView(generic.ListView):
|
class ArchivTemataView(generic.ListView):
|
||||||
model = Problem
|
model = Problem
|
||||||
template_name = 'seminar/archiv/temata.html'
|
template_name = 'tvorba/archiv/temata.html'
|
||||||
queryset = Tema.objects.filter(stav=Problem.STAV_ZADANY).select_related('rocnik').order_by('rocnik', 'kod')
|
queryset = Tema.objects.filter(stav=Problem.STAV_ZADANY).select_related('rocnik').order_by('rocnik', 'kod')
|
||||||
|
|
||||||
def get_context_data(self, *args, **kwargs):
|
def get_context_data(self, *args, **kwargs):
|
||||||
|
@ -362,7 +362,7 @@ class ArchivTemataView(generic.ListView):
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
class OdmenyView(generic.TemplateView):
|
class OdmenyView(generic.TemplateView):
|
||||||
template_name = 'seminar/archiv/odmeny.html'
|
template_name = 'tvorba/archiv/odmeny.html'
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
@ -408,7 +408,7 @@ class CisloVysledkovkaView(CisloView):
|
||||||
"""View vytvořené pro stránku zobrazující výsledkovku čísla v TeXu."""
|
"""View vytvořené pro stránku zobrazující výsledkovku čísla v TeXu."""
|
||||||
|
|
||||||
model = Cislo
|
model = Cislo
|
||||||
template_name = 'seminar/archiv/cislo_vysledkovka.tex'
|
template_name = 'tvorba/archiv/cislo_vysledkovka.tex'
|
||||||
#content_type = 'application/x-tex; charset=UTF8'
|
#content_type = 'application/x-tex; charset=UTF8'
|
||||||
#umozni rovnou stahnout TeXovsky dokument
|
#umozni rovnou stahnout TeXovsky dokument
|
||||||
content_type = 'text/plain; charset=UTF8'
|
content_type = 'text/plain; charset=UTF8'
|
||||||
|
@ -439,7 +439,7 @@ class PosledniCisloVysledkovkaView(generic.DetailView):
|
||||||
"""View vytvořené pro zobrazení výsledkovky posledního čísla v TeXu."""
|
"""View vytvořené pro zobrazení výsledkovky posledního čísla v TeXu."""
|
||||||
|
|
||||||
model = Rocnik
|
model = Rocnik
|
||||||
template_name = 'seminar/archiv/cislo_vysledkovka.tex'
|
template_name = 'tvorba/archiv/cislo_vysledkovka.tex'
|
||||||
content_type = 'text/plain; charset=UTF8'
|
content_type = 'text/plain; charset=UTF8'
|
||||||
|
|
||||||
def get_object(self, queryset=None):
|
def get_object(self, queryset=None):
|
||||||
|
@ -473,7 +473,7 @@ class PosledniCisloVysledkovkaView(generic.DetailView):
|
||||||
class RocnikVysledkovkaView(RocnikView):
|
class RocnikVysledkovkaView(RocnikView):
|
||||||
""" View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu."""
|
""" View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu."""
|
||||||
model = Rocnik
|
model = Rocnik
|
||||||
template_name = 'seminar/archiv/rocnik_vysledkovka.tex'
|
template_name = 'tvorba/archiv/rocnik_vysledkovka.tex'
|
||||||
#content_type = 'application/x-tex; charset=UTF8'
|
#content_type = 'application/x-tex; charset=UTF8'
|
||||||
#umozni rovnou stahnout TeXovsky dokument
|
#umozni rovnou stahnout TeXovsky dokument
|
||||||
content_type = 'text/plain; charset=UTF8'
|
content_type = 'text/plain; charset=UTF8'
|
||||||
|
@ -517,7 +517,7 @@ def TitulyView(request, rocnik, cislo):
|
||||||
else:
|
else:
|
||||||
jmenovci = True
|
jmenovci = True
|
||||||
|
|
||||||
return render(request, 'seminar/archiv/tituly.tex',
|
return render(request, 'tvorba/archiv/tituly.tex',
|
||||||
{'resitele': resitele,'jmenovci':jmenovci},content_type="text/plain")
|
{'resitele': resitele,'jmenovci':jmenovci},content_type="text/plain")
|
||||||
|
|
||||||
|
|
||||||
|
@ -548,7 +548,7 @@ def group_by_rocnik(clanky):
|
||||||
# FIXME: Původně tu byl kód přímo v těle třídy, což rozbíjelo migrace. Opravil jsem, ale vůbec nevím, jestli to funguje.
|
# FIXME: Původně tu byl kód přímo v těle třídy, což rozbíjelo migrace. Opravil jsem, ale vůbec nevím, jestli to funguje.
|
||||||
class ClankyResitelView(generic.ListView):
|
class ClankyResitelView(generic.ListView):
|
||||||
model = Problem
|
model = Problem
|
||||||
template_name = 'seminar/clanky/resitelske_clanky.html'
|
template_name = 'tvorba/clanky/resitelske_clanky.html'
|
||||||
|
|
||||||
# FIXME: QuerySet není pole!
|
# FIXME: QuerySet není pole!
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
|
@ -564,7 +564,7 @@ class ClankyResitelView(generic.ListView):
|
||||||
# FIXME: pokud chceme orgoclanky, tak nejak zavest do modelu a podle toho odkomentovat a upravit
|
# FIXME: pokud chceme orgoclanky, tak nejak zavest do modelu a podle toho odkomentovat a upravit
|
||||||
#class ClankyOrganizatorView(generic.ListView)<F12>:
|
#class ClankyOrganizatorView(generic.ListView)<F12>:
|
||||||
# model = Problem
|
# model = Problem
|
||||||
# template_name = 'seminar/clanky/organizatorske_clanky.html'
|
# template_name = 'tvorba/clanky/organizatorske_clanky.html'
|
||||||
# queryset = Problem.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo_zadani__rocnik').order_by('-cislo_zadani__rocnik__rocnik', 'kod')
|
# queryset = Problem.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo_zadani__rocnik').order_by('-cislo_zadani__rocnik__rocnik', 'kod')
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -11,7 +11,7 @@ from django.views import generic
|
||||||
|
|
||||||
import novinky.views
|
import novinky.views
|
||||||
import seminar.utils
|
import seminar.utils
|
||||||
import seminar.views
|
import tvorba.views
|
||||||
from personalni.models import Resitel
|
from personalni.models import Resitel
|
||||||
from seminar import models as m
|
from seminar import models as m
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ class TitulniStranaView(generic.ListView):
|
||||||
|
|
||||||
# Aktuální témata
|
# Aktuální témata
|
||||||
nazvy_a_odkazy_na_aktualni_temata = []
|
nazvy_a_odkazy_na_aktualni_temata = []
|
||||||
akt_temata = seminar.views.aktualni_temata(nastaveni.aktualni_rocnik)
|
akt_temata = tvorba.views.aktualni_temata(nastaveni.aktualni_rocnik)
|
||||||
|
|
||||||
for tema in akt_temata:
|
for tema in akt_temata:
|
||||||
# FIXME: netuším, jestli funguje tema.verejne_url(), nemáme testdata na témátka - je to asi url vzhledem k ročníku
|
# FIXME: netuším, jestli funguje tema.verejne_url(), nemáme testdata na témátka - je to asi url vzhledem k ročníku
|
||||||
|
|
Loading…
Reference in a new issue