|
|
|
from django.shortcuts import get_object_or_404, render
|
|
|
|
from django.urls import reverse
|
|
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
|
|
from django.views import generic
|
|
|
|
from django.views.generic.base import RedirectView
|
|
|
|
|
|
|
|
from tvorba.models import Rocnik, Deadline, Tema
|
|
|
|
from seminar.models import *
|
|
|
|
from personalni.models import Organizator
|
|
|
|
|
|
|
|
from vysledkovky.utils import VysledkovkaRocniku
|
|
|
|
|
|
|
|
from django.utils import timezone
|
|
|
|
from collections.abc import Sequence
|
|
|
|
|
|
|
|
|
|
|
|
# ze starého modelu
|
|
|
|
#def verejna_temata(rocnik):
|
|
|
|
# """
|
|
|
|
# Vrací queryset zveřejněných témat v daném ročníku.
|
|
|
|
# """
|
|
|
|
# return Problem.objects.filter(typ=Problem.TYP_TEMA, cislo_zadani__rocnik=rocnik, cislo_zadani__verejne_db=True).order_by('kod')
|
|
|
|
#
|
|
|
|
#def temata_v_rocniku(rocnik):
|
|
|
|
# return Problem.objects.filter(typ=Problem.TYP_TEMA, rocnik=rocnik)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#class AktualniZadaniView(generic.TemplateView):
|
|
|
|
# template_name = 'seminar/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...
|
|
|
|
#class AktualniZadaniView(TreeNodeView):
|
|
|
|
# def get_object(self):
|
|
|
|
# nastaveni = get_object_or_404(Nastaveni)
|
|
|
|
# return nastaveni.aktualni_cislo.cislonode
|
|
|
|
#
|
|
|
|
# def get_context_data(self,**kwargs):
|
|
|
|
# nastaveni = get_object_or_404(Nastaveni)
|
|
|
|
# context = super().get_context_data(**kwargs)
|
|
|
|
# verejne = nastaveni.aktualni_cislo.verejne()
|
|
|
|
# context['verejne'] = verejne
|
|
|
|
# return context
|
|
|
|
|
|
|
|
def AktualniZadaniView(request):
|
|
|
|
nastaveni = get_object_or_404(Nastaveni)
|
|
|
|
verejne = nastaveni.aktualni_cislo.verejne()
|
|
|
|
return render(request, 'seminar/zadani/AktualniZadani.html',
|
|
|
|
{'nastaveni': nastaveni,
|
|
|
|
'verejne': verejne,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
def ZadaniTemataView(request):
|
|
|
|
nastaveni = get_object_or_404(Nastaveni)
|
|
|
|
verejne = nastaveni.aktualni_cislo.verejne()
|
|
|
|
akt_rocnik = nastaveni.aktualni_cislo.rocnik
|
|
|
|
temata = Tema.objects.filter(rocnik=akt_rocnik, stav='zadany')
|
|
|
|
return render(request, 'seminar/tematka/rozcestnik.html',
|
|
|
|
{
|
|
|
|
'tematka': temata,
|
|
|
|
'verejne': verejne,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
# nastaveni = get_object_or_404(Nastaveni)
|
|
|
|
# temata = verejna_temata(nastaveni.aktualni_rocnik)
|
|
|
|
# for t in temata:
|
|
|
|
# if request.user.is_staff:
|
|
|
|
# t.prispevky = t.prispevek_set.filter(problem=t)
|
|
|
|
# else:
|
|
|
|
# t.prispevky = t.prispevek_set.filter(problem=t, zverejnit=True)
|
|
|
|
# return render(request, 'seminar/zadani/Temata.html',
|
|
|
|
# {
|
|
|
|
# 'temata': temata,
|
|
|
|
# }
|
|
|
|
# )
|
|
|
|
#
|
|
|
|
#
|
|
|
|
#
|
|
|
|
#def TemataRozcestnikView(request):
|
|
|
|
# print("=============================================")
|
|
|
|
# nastaveni = Nastaveni.objects.first()
|
|
|
|
# tematka_objects = Tema.objects.filter(rocnik=nastaveni.aktualni_rocnik())
|
|
|
|
# tematka = [] #List tematka obsahuje pro kazde tematko object a list vsech TemaVCisleNodu - implementované pomocí slovníku
|
|
|
|
# for tematko_object in tematka_objects:
|
|
|
|
# print("AKTUALNI TEMATKO")
|
|
|
|
# print(tematko_object.id)
|
|
|
|
# odkazy = vytahniZLesaSeznam(tematko_object, nastaveni.aktualni_rocnik().rocniknode, pouze_zajimave = True) #Odkazy jsou tuply (node, depth) v listu
|
|
|
|
# print(odkazy)
|
|
|
|
# cisla = [] # List tuplů (nazev cisla, list odkazů)
|
|
|
|
# vcisle = []
|
|
|
|
# cislo = None
|
|
|
|
# for odkaz in odkazy:
|
|
|
|
# if odkaz[1] == 0:
|
|
|
|
# if cislo != None:
|
|
|
|
# cisla.append((cislo, vcisle))
|
|
|
|
# cislo = (odkaz[0].getOdkazStr(), odkaz[0].getOdkaz())
|
|
|
|
# vcisle = []
|
|
|
|
# else:
|
|
|
|
# print(odkaz[0].getOdkaz())
|
|
|
|
# vcisle.append((odkaz[0].getOdkazStr(), odkaz[0].getOdkaz()))
|
|
|
|
# if cislo != None:
|
|
|
|
# cisla.append((cislo, vcisle))
|
|
|
|
#
|
|
|
|
# print(cisla)
|
|
|
|
# tematka.append({
|
|
|
|
# "kod" : tematko_object.kod,
|
|
|
|
# "nazev" : tematko_object.nazev,
|
|
|
|
# "abstrakt" : tematko_object.abstrakt,
|
|
|
|
# "obrazek": tematko_object.obrazek,
|
|
|
|
# "cisla" : cisla
|
|
|
|
# })
|
|
|
|
# return render(request, 'seminar/tematka/rozcestnik.html', {"tematka": tematka, "rocnik" : nastaveni.aktualni_rocnik().rocnik})
|
|
|
|
#
|
|
|
|
|
|
|
|
def ZadaniAktualniVysledkovkaView(request):
|
|
|
|
nastaveni = get_object_or_404(Nastaveni)
|
|
|
|
# Aktualni verejna vysledkovka
|
|
|
|
rocnik = nastaveni.aktualni_rocnik
|
|
|
|
context = {'vysledkovka': VysledkovkaRocniku(rocnik, True)}
|
|
|
|
|
|
|
|
# kdyz neni verejna vysledkovka, tak zobraz starou
|
|
|
|
if len(context['vysledkovka'].cisla_rocniku) == 0:
|
|
|
|
try:
|
|
|
|
minuly_rocnik = Rocnik.objects.get(
|
|
|
|
rocnik=(rocnik.rocnik-1))
|
|
|
|
rocnik = minuly_rocnik
|
|
|
|
|
|
|
|
# Přepíšeme prázdnou výsledkovku výsledkovkou z minulého ročníku
|
|
|
|
context['vysledkovka'] = VysledkovkaRocniku(rocnik, True)
|
|
|
|
except ObjectDoesNotExist:
|
|
|
|
pass
|
|
|
|
|
|
|
|
context['rocnik'] = rocnik
|
|
|
|
return render(
|
|
|
|
request,
|
|
|
|
'seminar/zadani/AktualniVysledkovka.html',
|
|
|
|
context
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
### Titulni strana
|
|
|
|
|
|
|
|
def spravne_novinky(request):
|
|
|
|
"""
|
|
|
|
Vrátí správný QuerySet novinek, tedy ten, který daný uživatel smí vidět.
|
|
|
|
Tj. Organizátorům všechny, ostatním jen veřejné
|
|
|
|
"""
|
|
|
|
user = request.user
|
|
|
|
# Využíváme líné vyhodnocování QuerySetů
|
|
|
|
qs = Novinky.objects.all()
|
|
|
|
if not user.je_org:
|
|
|
|
qs = qs.filter(zverejneno=True)
|
|
|
|
return qs.order_by('-datum')
|
|
|
|
|
|
|
|
def aktualni_temata(rocnik):
|
|
|
|
"""
|
|
|
|
Vrací PolymorphicQuerySet témat v daném ročníku, ke kterým se aktuálně dá něco odevzdat.
|
|
|
|
"""
|
|
|
|
return Tema.objects.filter(rocnik=rocnik, stav='zadany').order_by('kod')
|
|
|
|
|
|
|
|
|
|
|
|
class TitulniStranaView(generic.ListView):
|
|
|
|
template_name= 'seminar/titulnistrana/titulnistrana.html'
|
|
|
|
|
|
|
|
def get_queryset(self):
|
|
|
|
return spravne_novinky(self.request)[:3]
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
context = super(TitulniStranaView, self).get_context_data(**kwargs)
|
|
|
|
nastaveni = get_object_or_404(Nastaveni)
|
|
|
|
|
|
|
|
deadline = Deadline.objects.filter(deadline__gte=timezone.now()).order_by("deadline").first()
|
|
|
|
context['nejblizsi_deadline'] = deadline
|
|
|
|
|
|
|
|
# Aktuální témata
|
|
|
|
nazvy_a_odkazy_na_aktualni_temata = []
|
|
|
|
akt_temata = aktualni_temata(nastaveni.aktualni_rocnik)
|
|
|
|
|
|
|
|
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
|
|
|
|
nazvy_a_odkazy_na_aktualni_temata.append({'nazev':tema.nazev,'url':tema.verejne_url()})
|
|
|
|
|
|
|
|
context['aktualni_temata'] = nazvy_a_odkazy_na_aktualni_temata
|
|
|
|
|
|
|
|
print(context)
|
|
|
|
|
|
|
|
return context
|
|
|
|
|
|
|
|
class StareNovinkyView(generic.ListView):
|
|
|
|
template_name = 'seminar/stare_novinky.html'
|
|
|
|
|
|
|
|
def get_queryset(self):
|
|
|
|
return spravne_novinky(self.request)
|
|
|
|
|
|
|
|
### Co je M&M
|
|
|
|
|
|
|
|
|
|
|
|
# Organizatori
|
|
|
|
def aktivniOrganizatori(datum=timezone.now()):
|
|
|
|
return Organizator.objects.exclude(
|
|
|
|
organizuje_do__isnull=False,
|
|
|
|
organizuje_do__lt=datum
|
|
|
|
).order_by('osoba__jmeno')
|
|
|
|
|
|
|
|
|
|
|
|
class CojemamOrganizatoriView(generic.ListView):
|
|
|
|
model = Organizator
|
|
|
|
template_name = 'seminar/cojemam/organizatori.html'
|
|
|
|
queryset = aktivniOrganizatori()
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
context = super(CojemamOrganizatoriView, self).get_context_data(**kwargs)
|
|
|
|
context['aktivni'] = True
|
|
|
|
return context
|
|
|
|
|
|
|
|
|
|
|
|
class CojemamOrganizatoriStariView(generic.ListView):
|
|
|
|
model = Organizator
|
|
|
|
template_name = 'seminar/cojemam/organizatori.html'
|
|
|
|
queryset = Organizator.objects.exclude(
|
|
|
|
id__in=aktivniOrganizatori()).order_by('-organizuje_do')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Interní, nemá se nikdy objevit v urls (jinak to účastníci vytrolí)
|
|
|
|
def formularOKView(request, text='', dalsi_odkazy: Sequence[tuple[str, str]] = ()):
|
|
|
|
template_name = 'seminar/formular_ok.html'
|
|
|
|
odkazy = list(dalsi_odkazy) + [
|
|
|
|
# (Text, odkaz)
|
|
|
|
('Vrátit se na titulní stránku', reverse('titulni_strana')),
|
|
|
|
('Zobrazit aktuální zadání', reverse('seminar_aktualni_zadani')),
|
|
|
|
]
|
|
|
|
context = {
|
|
|
|
'odkazy': odkazy,
|
|
|
|
'text': text,
|
|
|
|
}
|
|
|
|
return render(request, template_name, context)
|
|
|
|
|
|
|
|
#------------------ Jak řešit - možná má být udělané úplně jinak
|
|
|
|
|
|
|
|
class JakResitView(generic.ListView):
|
|
|
|
template_name = 'seminar/jakresit/jak-resit.html'
|
|
|
|
|
|
|
|
def get_queryset(self):
|
|
|
|
return None
|
|
|
|
|
|
|
|
class AktualniRocnikRedirectView(RedirectView):
|
|
|
|
permanent=False
|
|
|
|
pattern_name = 'seminar_rocnik'
|
|
|
|
|
|
|
|
def get_redirect_url(self, *args, **kwargs):
|
|
|
|
aktualni_rocnik = Nastaveni.get_solo().aktualni_rocnik.rocnik
|
|
|
|
return super().get_redirect_url(rocnik=aktualni_rocnik, *args, **kwargs)
|