mamweb/tvorba/views/archiv.py

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')