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