182 lines
5.9 KiB
Python
182 lines
5.9 KiB
Python
import os.path as op
|
|
from itertools import groupby
|
|
from collections import OrderedDict
|
|
|
|
from django.shortcuts import get_object_or_404
|
|
from django.views import generic
|
|
from django.utils.translation import ugettext as _
|
|
from django.http import Http404
|
|
from django.db.models import Q
|
|
from django.conf import settings
|
|
|
|
from vysledkovky.utils import VysledkovkaCisla, VysledkovkaRocniku
|
|
|
|
from tvorba.models import Rocnik, Cislo, Deadline, Problem, Tema, Clanek
|
|
from personalni.models.resitel import Resitel
|
|
|
|
|
|
class ArchivView(generic.ListView):
|
|
model = Rocnik
|
|
template_name = 'tvorba/archiv/cisla.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(ArchivView, self).get_context_data(**kwargs)
|
|
|
|
cisla = Cislo.objects.filter(poradi=1)
|
|
if not self.request.user.je_org:
|
|
cisla = cisla.filter(verejne_db=True)
|
|
urls = {}
|
|
|
|
for i, c in enumerate(cisla):
|
|
# Výchozí nastavení
|
|
if c.rocnik not in urls:
|
|
urls[c.rocnik] = op.join(settings.STATIC_URL, "images", "no-picture.png")
|
|
# NOTE: tohle možná nastavuje poslední titulku
|
|
if c.titulka_nahled:
|
|
urls[c.rocnik] = c.titulka_nahled.url
|
|
|
|
context["object_list"] = urls
|
|
|
|
return context
|
|
|
|
|
|
class RocnikView(generic.DetailView):
|
|
model = Rocnik
|
|
template_name = 'tvorba/archiv/rocnik.html'
|
|
|
|
# Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik)
|
|
def get_object(self, queryset=None):
|
|
if queryset is None:
|
|
queryset = self.get_queryset()
|
|
|
|
return get_object_or_404(queryset, rocnik=self.kwargs.get('rocnik'))
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(RocnikView, self).get_context_data(**kwargs)
|
|
context["vysledkovka"] = VysledkovkaRocniku(context["rocnik"], True)
|
|
context["neprazdna_vysledkovka"] = len(context['vysledkovka'].cisla_rocniku) != 0
|
|
context["vysledkovka_neverejna"] = VysledkovkaRocniku(context["rocnik"], False)
|
|
return context
|
|
|
|
|
|
def resiteleRocnikuCsvExportView(request, rocnik):
|
|
from personalni.views import dataResiteluCsvResponse
|
|
assert request.method in ('GET', 'HEAD')
|
|
return dataResiteluCsvResponse(
|
|
Resitel.objects.resi_v_rocniku(
|
|
get_object_or_404(Rocnik, rocnik=rocnik)
|
|
)
|
|
)
|
|
|
|
|
|
class CisloView(generic.DetailView):
|
|
# FIXME zobrazování témátek a vůbec, teď je tam jen odkaz na číslo v pdf
|
|
model = Cislo
|
|
template_name = 'tvorba/archiv/cislo.html'
|
|
|
|
# Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik)
|
|
def get_object(self, queryset=None):
|
|
if queryset is None:
|
|
queryset = self.get_queryset()
|
|
rocnik_arg = self.kwargs.get('rocnik')
|
|
poradi_arg = self.kwargs.get('cislo')
|
|
queryset = queryset.filter(rocnik__rocnik=rocnik_arg, poradi=poradi_arg)
|
|
|
|
try:
|
|
obj = queryset.get()
|
|
except queryset.model.DoesNotExist:
|
|
raise Http404(
|
|
_("No %(verbose_name)s found matching the query") %
|
|
{'verbose_name': queryset.model._meta.verbose_name}
|
|
)
|
|
return obj
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(CisloView, self).get_context_data(**kwargs)
|
|
|
|
cislo = context['cislo']
|
|
context['prevcislo'] = Cislo.objects.filter(
|
|
(Q(rocnik__lt=self.object.rocnik) | Q(poradi__lt=self.object.poradi)) &
|
|
Q(rocnik__lte=self.object.rocnik)
|
|
).first()
|
|
|
|
deadliny = Deadline.objects.filter(cislo=cislo).reverse()
|
|
deadliny_s_vysledkovkami = []
|
|
|
|
nadpisy = {
|
|
Deadline.TYP_CISLA: "Výsledkovka",
|
|
Deadline.TYP_PRVNI: "Výsledkovka do prvního deadlinu",
|
|
Deadline.TYP_PRVNI_A_SOUS: "Výsledkovka do prvního deadlinu a deadlinu pro účast na soustředění",
|
|
Deadline.TYP_SOUS: "Výsledkovka do deadlinu pro účast na soustředění",
|
|
}
|
|
|
|
for deadline in deadliny:
|
|
if self.request.user.je_org | deadline.verejna_vysledkovka:
|
|
deadliny_s_vysledkovkami.append((
|
|
deadline, nadpisy[deadline.typ],
|
|
VysledkovkaCisla(
|
|
cislo, not self.request.user.je_org, deadline
|
|
),
|
|
))
|
|
|
|
context['deadliny_s_vysledkovkami'] = deadliny_s_vysledkovkami
|
|
return context
|
|
|
|
|
|
class ArchivTemataView(generic.ListView):
|
|
model = Problem
|
|
template_name = 'tvorba/archiv/temata.html'
|
|
queryset = Tema.objects.filter(stav=Problem.STAV_ZADANY).select_related('rocnik').order_by('rocnik', 'kod')
|
|
|
|
def get_context_data(self, *args, **kwargs):
|
|
ctx = super().get_context_data(*args, **kwargs)
|
|
ctx['rocniky'] = OrderedDict()
|
|
for rocnik, temata in groupby(ctx['object_list'], lambda tema: tema.rocnik):
|
|
ctx['rocniky'][rocnik] = list(temata)
|
|
return ctx
|
|
|
|
|
|
### Články
|
|
def group_by_rocnik(clanky):
|
|
""" Vezme zadaný seznam článků a seskupí je podle ročníku.
|
|
Vrátí seznam seznamů článků ze stejného ročníku."""
|
|
if len(clanky) == 0:
|
|
return clanky
|
|
clanky.order_by('cislo__rocnik__rocnik')
|
|
skupiny_clanku = []
|
|
skupina = []
|
|
|
|
rocnik = clanky.first().cislo.rocnik.rocnik # první ročník
|
|
for clanek in clanky:
|
|
if clanek.cislo.rocnik.rocnik == rocnik:
|
|
skupina.append(clanek)
|
|
else:
|
|
skupiny_clanku.append(skupina)
|
|
skupina = [clanek]
|
|
rocnik = clanek.cislo.rocnik.rocnik
|
|
skupiny_clanku.append(skupina)
|
|
return skupiny_clanku
|
|
|
|
|
|
# FIXME: clanky jsou vsechny, pokud budou i neresitelske, tak se take zobrazi
|
|
# 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):
|
|
model = Problem
|
|
template_name = 'tvorba/clanky/resitelske_clanky.html'
|
|
|
|
# FIXME: QuerySet není pole!
|
|
def get_queryset(self):
|
|
clanky = Clanek.objects.filter(stav=Problem.STAV_VYRESENY).select_related('cislo__rocnik').order_by('-cislo__rocnik__rocnik')
|
|
queryset = []
|
|
skupiny_clanku = group_by_rocnik(clanky)
|
|
for skupina in skupiny_clanku:
|
|
skupina.sort(key=lambda clanek: clanek.kod_v_rocniku)
|
|
for clanek in skupina:
|
|
queryset.append(clanek)
|
|
return queryset
|
|
|
|
# FIXME: pokud chceme orgoclanky, tak nejak zavest do modelu a podle toho odkomentovat a upravit
|
|
# class ClankyOrganizatorView(generic.ListView):
|
|
# model = Problem
|
|
# template_name = 'seminar/clanky/organizatorske_clanky.html'
|
|
# queryset = Problem.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo_zadani__rocnik').order_by('-cislo_zadani__rocnik__rocnik', 'kod')
|