Pavel 'LEdoian' Turinsky
4 years ago
1 changed files with 93 additions and 0 deletions
@ -0,0 +1,93 @@ |
|||
from django.views.generic import ListView, DetailView |
|||
from django.views.generic.base import TemplateView |
|||
|
|||
from dataclasses import dataclass |
|||
import datetime |
|||
|
|||
import seminar.models as m |
|||
from seminar.utils import aktivniResitele, resi_v_rocniku |
|||
|
|||
# Co chceme? |
|||
# - "Tabulku" aktuální řešitelé x zveřejněné problémy, v buňkách počet řešení |
|||
# - TabulkaOdevzdanychReseniView |
|||
# - Detail konkrétního problému a řešitele -- přehled všech řešení odevzdaných k tomuto problému |
|||
# - ReseniProblemuView |
|||
# - Detail konkrétního řešení -- všechny soubory, datum, ... |
|||
# - DetailReseniView |
|||
# |
|||
# Taky se může hodit: |
|||
# - Tabulka všech řešitelů x všech problémů? |
|||
|
|||
@dataclass |
|||
class SouhrnReseni: |
|||
"""Dataclass reprezentující data o odevzdaných řešeních pro zobrazení v tabulce.""" |
|||
pocet_reseni : int |
|||
posledni_odevzdani : datetime.datetime |
|||
body : float |
|||
|
|||
|
|||
class TabulkaOdevzdanychReseniView(TemplateView): |
|||
template_name = 'TODO' |
|||
|
|||
def get_context_data(self, *args, **kwargs): |
|||
akt_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi... |
|||
resitele = resi_v_rocniku(akt_rocnik) |
|||
zadane_problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY) |
|||
|
|||
ctx = dict() |
|||
ctx['problemy'] = zadane_problemy |
|||
ctx['resitele'] = resitele |
|||
|
|||
# Zkonstruujeme jednotlivé řádky |
|||
# Řádky budou indexované řešiteli a budou obsahovat SouhrnyReseni |
|||
# TODO: Tohle se asi nějak dá urychlit / zpřehlednit... |
|||
ctx['radky'] = dict() |
|||
for resitel in resitele: |
|||
ctx['radky'][resitel] = [] |
|||
for problem in zadane_problemy: |
|||
reseni_k_tomuto_problemu = m.Reseni.objects.filter( |
|||
resitele__in=[resitel], # Snad funguje i takhle |
|||
hodnoceni__problem__in=[problem], # ditto |
|||
) |
|||
.order_by('-cas_doruceni') |
|||
pocet_reseni = reseni_k_tomuto_problemu.count() |
|||
nejnovejsi = reseni_k_tomuto_problemu.first().cas_doruceni |
|||
pocet_bodu = max( |
|||
[h.body for h in m.Hodnoceni.objects.filter( |
|||
reseni__in=reseni_k_tomuto_problemu, |
|||
problem=problem, |
|||
) |
|||
] |
|||
) |
|||
ctx['radky'][resitel].append( |
|||
SouhrnReseni( |
|||
pocet_reseni=pocet_reseni, |
|||
posledni_odevzdani=nejnovejsi, |
|||
body=pocet_bodu, |
|||
) |
|||
return ctx |
|||
|
|||
class ReseniProblemuView(ListView): |
|||
model = m.Reseni |
|||
template_name = 'TODO' |
|||
|
|||
def get_queryset(self): |
|||
qs = super().get_queryset() |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
# Přehled všech řešení kvůli debugování |
|||
|
|||
class SeznamReseniView(ListView): |
|||
model = m.Reseni |
|||
template_name = 'TODO' |
|||
|
|||
class SeznamAktualnichReseniView(SeznamReseniView): |
|||
def get_queryset(self): |
|||
qs = super().get_queryset() |
|||
akt_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi... |
|||
resitele = resi_v_rocniku(akt_rocnik) |
|||
qs = qs.filter(resitele__in=resitele) # Doufám, že tohle najde řešení, která maji alespoň jednoho řešitele řešícího v aktuálním ročníku |
|||
return qs |
Loading…
Reference in new issue