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)