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