Merge branch 'data_migrations' of gimli.ms.mff.cuni.cz:/akce/mam/git/mamweb into data_migrations
This commit is contained in:
commit
0dc5442c99
3 changed files with 126 additions and 38 deletions
|
@ -284,8 +284,18 @@ class Resitel(SeminarModelBase):
|
||||||
else:
|
else:
|
||||||
return 'Z' + str(rozdil + 9)
|
return 'Z' + str(rozdil + 9)
|
||||||
|
|
||||||
def get_titul(self, celkove_body):
|
def vsechny_body(self):
|
||||||
"Vrati titul podle zadaneho poctu bodu."
|
"Spočítá body odjakživa."
|
||||||
|
vsechna_reseni = self.reseni_set.all()
|
||||||
|
vsechna_hodnoceni = Hodnoceni.objects.filter(
|
||||||
|
reseni__in=vsechna_reseni)
|
||||||
|
return sum(h.body for h in list(vsechna_hodnoceni))
|
||||||
|
|
||||||
|
|
||||||
|
def get_titul(self):
|
||||||
|
"Vrati titul"
|
||||||
|
celkove_body = self.vsechny_body()
|
||||||
|
|
||||||
if celkove_body < 10:
|
if celkove_body < 10:
|
||||||
return ''
|
return ''
|
||||||
elif celkove_body < 20:
|
elif celkove_body < 20:
|
||||||
|
@ -1370,7 +1380,6 @@ class Novinky(models.Model):
|
||||||
datum = models.DateField(auto_now_add=True)
|
datum = models.DateField(auto_now_add=True)
|
||||||
|
|
||||||
text = models.TextField('Text novinky', blank=True, null=True)
|
text = models.TextField('Text novinky', blank=True, null=True)
|
||||||
|
|
||||||
obrazek = models.ImageField('Obrázek', upload_to='image_novinky/%Y/%m/%d/',
|
obrazek = models.ImageField('Obrázek', upload_to='image_novinky/%Y/%m/%d/',
|
||||||
null=True, blank=True)
|
null=True, blank=True)
|
||||||
|
|
||||||
|
|
|
@ -254,7 +254,9 @@ def gen_rocniky(last_rocnik, size):
|
||||||
|
|
||||||
def gen_konfery(size, rnd, organizatori, resitele, soustredeni):
|
def gen_konfery(size, rnd, organizatori, resitele, soustredeni):
|
||||||
konfery = []
|
konfery = []
|
||||||
for _ in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
|
for _ in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
|
||||||
|
# Anet: size je parametr udávající velikost testovacích dat a dá se pomocí ní škálovat,
|
||||||
|
# kolik dat se nageneruje
|
||||||
konfera = Konfera.objects.create(
|
konfera = Konfera.objects.create(
|
||||||
nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']),
|
nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']),
|
||||||
anotace=lorem.paragraph(),
|
anotace=lorem.paragraph(),
|
||||||
|
|
145
seminar/views.py
145
seminar/views.py
|
@ -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 Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Tema, Clanek
|
||||||
#from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva
|
#from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva
|
||||||
from . import utils
|
from . import utils
|
||||||
|
from .unicodecsv import UnicodeWriter
|
||||||
from .forms import NameForm
|
from .forms import NameForm
|
||||||
|
|
||||||
from datetime import timedelta, date, datetime
|
from datetime import timedelta, date, datetime
|
||||||
|
@ -34,7 +35,7 @@ import csv
|
||||||
def verejna_temata(rocnik):
|
def verejna_temata(rocnik):
|
||||||
"""Vrací queryset zveřejněných témat v daném ročníku.
|
"""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):
|
def AktualniZadaniView(request):
|
||||||
|
@ -377,39 +378,111 @@ class ProblemView(generic.DetailView):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class RadekVysledkovky(object):
|
class VysledkyResitele(object):
|
||||||
pass
|
"""Pro daného řešitele ukládá počet bodů za jednotlivé úlohy a celkový
|
||||||
|
počet bodů za číslo."""
|
||||||
|
|
||||||
#class CisloView(generic.DetailView):
|
def __init__(self, jmeno, prijmeni):
|
||||||
# model = Cislo
|
resitel_jmeno = jmeno
|
||||||
# template_name = 'seminar/archiv/cislo.html'
|
resitel_prijmeni = prijmeni
|
||||||
#
|
body = {}
|
||||||
# # Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik)
|
body_cislo = 0
|
||||||
# def get_object(self, queryset=None):
|
|
||||||
# if queryset is None:
|
def body_za_cislo(self):
|
||||||
# queryset = self.get_queryset()
|
return sum(body.values())
|
||||||
# rocnik_arg = self.kwargs.get('rocnik')
|
|
||||||
# cislo_arg = self.kwargs.get('cislo')
|
class CisloView(generic.DetailView):
|
||||||
# queryset = queryset.filter(rocnik__rocnik=rocnik_arg, cislo=cislo_arg)
|
model = Cislo
|
||||||
#
|
template_name = 'seminar/archiv/cislo.html'
|
||||||
# try:
|
|
||||||
# obj = queryset.get()
|
# Vlastni ziskavani objektu z databaze podle (Rocnik.rocnik)
|
||||||
# except queryset.model.DoesNotExist:
|
def get_object(self, queryset=None):
|
||||||
# raise Http404(_("No %(verbose_name)s found matching the query") %
|
if queryset is None:
|
||||||
# {'verbose_name': queryset.model._meta.verbose_name})
|
queryset = self.get_queryset()
|
||||||
# return obj
|
rocnik_arg = self.kwargs.get('rocnik')
|
||||||
#
|
cislo_arg = self.kwargs.get('cislo')
|
||||||
#
|
queryset = queryset.filter(rocnik__rocnik=rocnik_arg, cislo=cislo_arg)
|
||||||
# def get_context_data(self, **kwargs):
|
|
||||||
# context = super(CisloView, self).get_context_data(**kwargs)
|
try:
|
||||||
#
|
obj = queryset.get()
|
||||||
# vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = context['cislo']).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno')
|
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)
|
||||||
|
radky_vysledkovky = []
|
||||||
|
for ar in aktivni_resitele:
|
||||||
|
vr = VysledkyResitele(ar.jmeno, ar.prijmeni)
|
||||||
|
for h in hlavni_problemy:
|
||||||
|
body = vysledky_resitele_problemu(h, ar, cislo)
|
||||||
|
vr.body[h.kod_v_rocniku] = body
|
||||||
|
vr.body_cislo = vr.body_cislo + body
|
||||||
|
radky_vysledkovky.append(vr)
|
||||||
|
|
||||||
|
## TODO: spočítat počet bodů řešitele v daném ročníku a seřadit je podle toho
|
||||||
|
## TODO: možná použít tyto funkce i v RocnikVysledkovkaView (a umístit sem nebo tam)?
|
||||||
|
|
||||||
|
|
||||||
|
# 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")
|
# 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]
|
# 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')
|
# 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')
|
# resene_problemy = Problem.objects.filter(cislo_reseni=context['cislo']).filter(typ__in=typy_skutecne_zadanych).order_by('cislo_zadani__cislo', 'kod')
|
||||||
#
|
#
|
||||||
# poradi_typu = {
|
# poradi_typu = {
|
||||||
|
@ -465,7 +538,11 @@ class ArchivTemataView(generic.ListView):
|
||||||
|
|
||||||
### Generovani vysledkovky
|
### Generovani vysledkovky
|
||||||
|
|
||||||
#class CisloVysledkovkaView(CisloView):
|
#class CisloVysledkovkaView(CisloView):i
|
||||||
|
# poradi | titul. jmeno prijmeni | ulohy | za cislo | celkem | odjakziva
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
# model = Cislo
|
# model = Cislo
|
||||||
# template_name = 'seminar/archiv/cislo_vysledkovka.tex'
|
# template_name = 'seminar/archiv/cislo_vysledkovka.tex'
|
||||||
# #content_type = 'application/x-tex; charset=UTF8'
|
# #content_type = 'application/x-tex; charset=UTF8'
|
||||||
|
@ -628,10 +705,10 @@ def soustredeniUcastniciExportView(request,soustredeni):
|
||||||
response = HttpResponse(content_type='text/csv')
|
response = HttpResponse(content_type='text/csv')
|
||||||
response['Content-Disposition'] = 'attachment; filename="ucastnici.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"])
|
writer.writerow(["jmeno", "prijmeni", "rok_maturity", "telefon", "email", "ulice", "mesto", "psc","stat"])
|
||||||
for u in ucastnici:
|
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
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
@ -641,7 +718,7 @@ def soustredeniUcastniciExportView(request,soustredeni):
|
||||||
class ClankyResitelView(generic.ListView):
|
class ClankyResitelView(generic.ListView):
|
||||||
model = Problem
|
model = Problem
|
||||||
template_name = 'seminar/clanky/resitelske_clanky.html'
|
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
|
# FIXME: pokud chceme orgoclanky, tak nejak zavest do modelu a podle toho odkomentovat a upravit
|
||||||
#class ClankyOrganizatorView(generic.ListView)<F12>:
|
#class ClankyOrganizatorView(generic.ListView)<F12>:
|
||||||
|
|
Loading…
Reference in a new issue