|
|
@ -14,6 +14,7 @@ from django.contrib.auth import authenticate, login |
|
|
|
from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Tema, Clanek |
|
|
|
#from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva |
|
|
|
from . import utils |
|
|
|
from .unicodecsv import UnicodeWriter |
|
|
|
from .forms import NameForm |
|
|
|
|
|
|
|
from datetime import timedelta, date, datetime |
|
|
@ -34,7 +35,7 @@ import csv |
|
|
|
def verejna_temata(rocnik): |
|
|
|
"""Vrací queryset zveřejněných témat v daném ročníku. |
|
|
|
""" |
|
|
|
return Tema.objects.filter(rocnik=rocnik).order_by('kod') #FIXME Ještě je potřeba zjistit, jestli je tematko verejne. |
|
|
|
return Problem.objects.filter(typ=Problem.TYP_TEMA, cislo_zadani__rocnik=rocnik, cislo_zadani__verejne_db=True).order_by('kod') |
|
|
|
|
|
|
|
|
|
|
|
def AktualniZadaniView(request): |
|
|
@ -377,39 +378,103 @@ class ProblemView(generic.DetailView): |
|
|
|
return context |
|
|
|
|
|
|
|
|
|
|
|
class RadekVysledkovky(object): |
|
|
|
pass |
|
|
|
class VysledkyResitele(object): |
|
|
|
#resitel_jmeno = models.CharField('jméno řešitele', max_length=256) |
|
|
|
#resitel_prijmeni = CharField('příjmení', max_length=256) |
|
|
|
|
|
|
|
#class CisloView(generic.DetailView): |
|
|
|
# model = Cislo |
|
|
|
# template_name = 'seminar/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') |
|
|
|
# cislo_arg = self.kwargs.get('cislo') |
|
|
|
# queryset = queryset.filter(rocnik__rocnik=rocnik_arg, cislo=cislo_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) |
|
|
|
# |
|
|
|
# vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = context['cislo']).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno') |
|
|
|
def __init__(self, jmeno, prijmeni): |
|
|
|
resitel_jmeno = jmeno |
|
|
|
resitel_prijmeni = prijmeni |
|
|
|
body = {} |
|
|
|
|
|
|
|
def body_za_cislo(self): |
|
|
|
return sum(body.values()) |
|
|
|
|
|
|
|
class CisloView(generic.DetailView): |
|
|
|
model = Cislo |
|
|
|
template_name = 'seminar/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') |
|
|
|
cislo_arg = self.kwargs.get('cislo') |
|
|
|
queryset = queryset.filter(rocnik__rocnik=rocnik_arg, cislo=cislo_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 |
|
|
|
|
|
|
|
# spočítá součet bodů získaných daným řešitelem za zadaný problém a všechny jeho podproblémy |
|
|
|
def __soucet_resitele_problemu(problem, resitel, soucet): |
|
|
|
# FIXME: správně je nadproblem_(typ problemu), ale to by bylo potřeba nějak |
|
|
|
# zjistit, jaký typ nodu to vlastně je a aplikovat to ve volání funkce |
|
|
|
|
|
|
|
# sečteme body za daný problém přes všechna řešení daného problému |
|
|
|
# od daného řešitele |
|
|
|
reseni_resitele = problem.hodnoceni_set.filter(reseni_resitele__contains=resitel) |
|
|
|
for r in reseni_resitele: |
|
|
|
soucet += r.body |
|
|
|
|
|
|
|
for p in problem.nadproblem_set: |
|
|
|
# i přes jméno by to měla být množina jeho podproblémů |
|
|
|
soucet += __soucet_resitele_problemu(p, resitel, soucet) |
|
|
|
return soucet |
|
|
|
|
|
|
|
|
|
|
|
def vysledky_resitele_problemu(problem, resitel, cislo): |
|
|
|
return __soucet_resitele_problemu(problem, resitel, 0) |
|
|
|
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs): |
|
|
|
context = super(CisloView, self).get_context_data(**kwargs) |
|
|
|
|
|
|
|
## TODO upravit dle nového modelu |
|
|
|
cislo = context['cislo'] |
|
|
|
hodnoceni = cislo.hodnoceni_set # hodnocení, která se vážou k danému číslu |
|
|
|
|
|
|
|
reseni = [h.reseni for h in hodnoceni] |
|
|
|
problemy = [h.problem for h in hodnoceni] |
|
|
|
problemy_set = set(problemy) # chceme každý problém unikátně, |
|
|
|
problemy = (list(problemy_set)) # převedení na množinu a zpět to zaručí |
|
|
|
|
|
|
|
# hlavní problémy čísla |
|
|
|
# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) |
|
|
|
hlavni_problemy = [] |
|
|
|
for p in problemy: |
|
|
|
while not(p.nadproblem == None): |
|
|
|
p = nadproblem |
|
|
|
hlavni_problemy.append(p) |
|
|
|
|
|
|
|
# zunikátnění |
|
|
|
hlavni_problemy_set = set(hlavni_problemy) |
|
|
|
hlavni_problemy = list(hlavni_problemy_set) |
|
|
|
|
|
|
|
## TODO dostat pro tyto problémy součet v daném čísle pro daného řešitele |
|
|
|
## TODO možná chytřeji vybírat aktivní řešitele |
|
|
|
## chceme letos něco poslal |
|
|
|
aktivni_resitele = Resitel.objects.filter( |
|
|
|
rok_maturity__gte=context['rocnik'].druhy_rok()) |
|
|
|
#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik) |
|
|
|
udaje_vysledkovky = {} |
|
|
|
for ar in aktivni_resitele: |
|
|
|
vr = VysledkyResitele(ar.jmeno, ar.prijmeni) |
|
|
|
for h in hlavni_problemy: |
|
|
|
vr.body[h.id] = vysledky_resitele_problemu(h, ar, cislo) |
|
|
|
|
|
|
|
vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = context['cislo']).\ |
|
|
|
order_by('-body', 'resitel__prijmeni', 'resitel__jmeno') |
|
|
|
# reseni = Reseni.objects.filter(cislo_body = context['cislo']).select_related("resitel") |
|
|
|
# |
|
|
|
# # typy úloh, které se mají zobrazovat u čísla, tj. těch, které byly v čísle skutečně zadány |
|
|
|
|
|
|
|
# typy úloh, které se mají zobrazovat u čísla, tj. těch, které byly |
|
|
|
# v čísle skutečně zadány |
|
|
|
# typy_skutecne_zadanych = [Problem.TYP_ULOHA, Problem.TYP_SERIAL, Problem.TYP_ORG_CLANEK] |
|
|
|
# v_cisle_zadane = Problem.objects.filter(cislo_zadani=context['cislo']).filter(typ__in=typy_skutecne_zadanych).order_by('kod') |
|
|
|
# |
|
|
|
|
|
|
|
# resene_problemy = Problem.objects.filter(cislo_reseni=context['cislo']).filter(typ__in=typy_skutecne_zadanych).order_by('cislo_zadani__cislo', 'kod') |
|
|
|
# |
|
|
|
# poradi_typu = { |
|
|
@ -465,7 +530,11 @@ class ArchivTemataView(generic.ListView): |
|
|
|
|
|
|
|
### Generovani vysledkovky |
|
|
|
|
|
|
|
#class CisloVysledkovkaView(CisloView): |
|
|
|
#class CisloVysledkovkaView(CisloView):i |
|
|
|
# poradi | titul. jmeno prijmeni | ulohy | za cislo | celkem | odjakziva |
|
|
|
# |
|
|
|
# |
|
|
|
# |
|
|
|
# model = Cislo |
|
|
|
# template_name = 'seminar/archiv/cislo_vysledkovka.tex' |
|
|
|
# #content_type = 'application/x-tex; charset=UTF8' |
|
|
@ -628,10 +697,10 @@ def soustredeniUcastniciExportView(request,soustredeni): |
|
|
|
response = HttpResponse(content_type='text/csv') |
|
|
|
response['Content-Disposition'] = 'attachment; filename="ucastnici.csv"' |
|
|
|
|
|
|
|
writer = csv.writer(response) |
|
|
|
writer = UnicodeWriter(response) |
|
|
|
writer.writerow(["jmeno", "prijmeni", "rok_maturity", "telefon", "email", "ulice", "mesto", "psc","stat"]) |
|
|
|
for u in ucastnici: |
|
|
|
writer.writerow([u.osoba.jmeno, u.osoba.prijmeni, str(u.rok_maturity), u.osoba.telefon, u.osoba.email, u.osoba.ulice, u.osoba.mesto, u.osoba.psc, u.osoba.stat.name]) |
|
|
|
writer.writerow([u.jmeno, u.prijmeni, str(u.rok_maturity), u.telefon, u.email, u.ulice, u.mesto, u.psc, u.stat.name]) |
|
|
|
return response |
|
|
|
|
|
|
|
|
|
|
@ -641,7 +710,7 @@ def soustredeniUcastniciExportView(request,soustredeni): |
|
|
|
class ClankyResitelView(generic.ListView): |
|
|
|
model = Problem |
|
|
|
template_name = 'seminar/clanky/resitelske_clanky.html' |
|
|
|
queryset = Clanek.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo__rocnik').order_by('-cislo__rocnik__rocnik', 'kod') |
|
|
|
queryset = Clanek.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo_zadani__rocnik').order_by('-cislo_zadani__rocnik__rocnik', 'kod') |
|
|
|
|
|
|
|
# FIXME: pokud chceme orgoclanky, tak nejak zavest do modelu a podle toho odkomentovat a upravit |
|
|
|
#class ClankyOrganizatorView(generic.ListView)<F12>: |
|
|
|