From c71f08b0bc9c33db4d9396bc14118dc33de1c0fb Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Thu, 30 Jul 2015 13:34:45 +0200 Subject: [PATCH] Velky fix a rework views na body (a sablon) * vysledkovka.tex neni uplne hotova (ani nebyla) --- seminar/export.py | 11 ++-- .../migrations/0029_fix_body_celkem_views.py | 51 +++++++++++++++++++ seminar/models.py | 10 ++-- seminar/templates/seminar/archiv/cislo.html | 10 ++-- .../seminar/archiv/cislo_vysledkovka.tex | 4 +- seminar/views.py | 29 ++++++----- 6 files changed, 85 insertions(+), 30 deletions(-) create mode 100644 seminar/migrations/0029_fix_body_celkem_views.py diff --git a/seminar/export.py b/seminar/export.py index bc8a72f3..86bce0ac 100644 --- a/seminar/export.py +++ b/seminar/export.py @@ -5,7 +5,8 @@ from django.core.urlresolvers import reverse from django.views import generic from django.utils.encoding import force_text -from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni +from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni +from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva from .ovvpfile import OvvpFile class ExportIndexView(generic.View): @@ -75,7 +76,7 @@ class ExportRocnikView(generic.View): rocnik = get_object_or_404(Rocnik, prvni_rok=pr, exportovat=True) cislo = rocnik.posledni_zverejnena_vysledkovka_cislo() - vysledky = VysledkyKCislu.objects.filter(cislo = cislo).select_related("resitel").order_by('-body_celkem').all() + vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = cislo).select_related("resitel").order_by('-body').all() of = default_ovvpfile('MaM.rocnik', rocnik) of.headers['comment'] = u'MaM-Web export aktivnich resitelu rocniku {rocnik} do cisla {cislo}'.format( @@ -91,11 +92,11 @@ class ExportRocnikView(generic.View): v = vysledky[vi] rd = v.resitel.export_row() - if posledni_body > v.body_celkem: - posledni_body = v.body_celkem + if posledni_body > v.body: + posledni_body = v.body posledni_poradi = vi + 1 rd['rank'] = posledni_poradi - rd['points'] = v.body_celkem + rd['points'] = v.body of.rows.append(rd) diff --git a/seminar/migrations/0029_fix_body_celkem_views.py b/seminar/migrations/0029_fix_body_celkem_views.py new file mode 100644 index 00000000..5e287747 --- /dev/null +++ b/seminar/migrations/0029_fix_body_celkem_views.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django_countries.fields +import seminar.models +import django.utils.timezone +from django.conf import settings + +CREATE_VIEWS=""" + +drop view seminar_body_k_cislu_rocnik; +create view seminar_body_k_cislu_rocnik as + select + seminar_cisla.id || '-' || min_body.resitel_id as id, + seminar_cisla.id as cislo_id, + min_body.resitel_id as resitel_id, + sum(min_body.body) as body + from + seminar_cisla + inner join seminar_body_za_cislo as min_body on + (min_body.rocnik_id = seminar_cisla.rocnik_id and seminar_cisla.cislo >= min_body.cislo) + group by seminar_cisla.id, min_body.resitel_id + order by body desc; + +drop view seminar_body_k_cislu_odjakziva; +create view seminar_body_k_cislu_odjakziva as + select + seminar_cisla.id || '-' || min_body.resitel_id as id, + seminar_cisla.id as cislo_id, + min_body.resitel_id as resitel_id, + sum(min_body.body) as body + from + seminar_cisla + inner join seminar_rocniky on + (seminar_cisla.rocnik_id = seminar_rocniky.id) + inner join seminar_body_za_cislo as min_body on + (min_body.rocnik_id = seminar_cisla.rocnik_id and seminar_cisla.cislo >= min_body.cislo) or + (min_body.rocnik < seminar_rocniky.rocnik) + group by seminar_cisla.id, min_body.resitel_id + order by body desc; +""" + +class Migration(migrations.Migration): + + dependencies = [("seminar", "0028_add_body_celkem_views")] + + operations = [ + migrations.RunSQL(sql=CREATE_VIEWS) + ] + diff --git a/seminar/models.py b/seminar/models.py index 8e941bf5..6993996c 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -661,15 +661,15 @@ class VysledkyZaCislo(VysledkyBase): managed = False -class VysledkyKCislu(VysledkyBase): +class VysledkyKCisluZaRocnik(VysledkyBase): class Meta: db_table = 'seminar_body_k_cislu_rocnik' abstract = False managed = False - body_celkem = models.DecimalField(max_digits=8, decimal_places=1, db_column='body_celkem', - verbose_name=u'body celkem do čísla (za ročník)') +# body = models.DecimalField(max_digits=8, decimal_places=1, db_column='body', +# verbose_name=u'body do čísla (za ročník)') class VysledkyKCisluOdjakziva(VysledkyBase): @@ -679,8 +679,8 @@ class VysledkyKCisluOdjakziva(VysledkyBase): abstract = False managed = False - body_celkem = models.DecimalField(max_digits=8, decimal_places=1, db_column='body_celkem', - verbose_name=u'body celkem do čísla (i minulé ročníky)') +# body = models.DecimalField(max_digits=8, decimal_places=1, db_column='body', +# verbose_name=u'body do čísla (i minulé ročníky)') @reversion.register(ignore_duplicate_revisions=True) diff --git a/seminar/templates/seminar/archiv/cislo.html b/seminar/templates/seminar/archiv/cislo.html index a7096fec..d14073e6 100644 --- a/seminar/templates/seminar/archiv/cislo.html +++ b/seminar/templates/seminar/archiv/cislo.html @@ -34,17 +34,19 @@ {% for p in problemy %} {{ p.cislo_zadani.cislo }}.{{ p.kod }} {% endfor %} - Sum + Sum-1 Celkem + Odjakživa {% for rv in vysledkovka %} {{ rv.poradi }} - {{ rv.resitel.plne_jmeno }} [{{ rv.resitel.id }}] + {{ rv.resitel.plne_jmeno }} {{ rv.titul }} {% for b in rv.body %} {{ b }} {% endfor %} - {{ rv.vysledek.body |default:0 }} - {{ rv.vysledek.body_celkem }} + {{ rv.body_minule }} + {{ rv.body_celkem_rocnik }} + {{ rv.body_celkem_odjakziva }} {% endfor %} diff --git a/seminar/templates/seminar/archiv/cislo_vysledkovka.tex b/seminar/templates/seminar/archiv/cislo_vysledkovka.tex index e39e0c2c..e988484c 100644 --- a/seminar/templates/seminar/archiv/cislo_vysledkovka.tex +++ b/seminar/templates/seminar/archiv/cislo_vysledkovka.tex @@ -22,12 +22,12 @@ {% for rv in vysledkovka %} {{ rv.poradi }} & {% if rv.resitel.titul %} - \titul{ {{ rv.resitel.titul }} } + \titul{ {{ rv.titul }} } {% endif %} {{ rv.resitel.plne_jmeno }} & {{ rv.resitel.rocnik |default:"" }} & {{ rv.body_minule }} {% for b in rv.body %} {{ b }} & {% endfor %} - {{ rv.vysledek.body |default:0 }} & {{ rv.vysledek.body_celkem }} \\ + {{ rv.body_celkem_rocnik |default:0 }} & {{ rv.body_celkem_minule }} \\ {% endfor %} \end{longtable} diff --git a/seminar/views.py b/seminar/views.py index 0876d69e..2650ddf3 100644 --- a/seminar/views.py +++ b/seminar/views.py @@ -5,7 +5,8 @@ from django.views import generic from django.utils.translation import ugettext as _ from django.http import Http404 -from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel +from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel +from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva from . import utils def AktualniZadaniView(request): @@ -74,7 +75,7 @@ class CisloView(generic.DetailView): def get_context_data(self, **kwargs): context = super(CisloView, self).get_context_data(**kwargs) - vysledky = VysledkyKCislu.objects.filter(cislo = context['cislo']).order_by('-body_celkem').select_related("resitel") + vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = context['cislo']).order_by('-body').select_related("resitel") reseni = Reseni.objects.filter(cislo_body = context['cislo']).select_related("resitel") problemy = sorted(list(set([r.problem for r in reseni])), key=lambda x:(0 if x.typ==Problem.TYP_ULOHA else 1,x.kod)) @@ -97,16 +98,20 @@ class CisloView(generic.DetailView): tv = RadekVysledkovky() tv.resitel = v.resitel tv.rocnik = tv.resitel.rocnik(context['cislo'].rocnik) - tv.resitel.titul = tv.resitel.titul(v.body_celkem) tv.vysledek = v #odkazuje na VysledkyKCislu tv.body = ['']*len(problemy) #pole bodu za ulohy tv.poradi = '' #defaultni poradi je prazdne - kvuli sdilenym mistum - tv.body_minule = 0 + tv.body_celkem_rocnik = v.body + tv.body_celkem_odjakziva = VysledkyKCisluOdjakziva.objects.get(resitel=v.resitel, cislo=context['cislo']).body + body_cislo_q = VysledkyZaCislo.objects.filter(resitel=v.resitel, cislo=context['cislo']) + tv.body_cislo = body_cislo_q[0].body if len(body_cislo_q) > 0 else 0 + tv.body_minule = tv.body_celkem_rocnik - tv.body_cislo + tv.titul = tv.resitel.titul(tv.body_celkem_odjakziva) #pocet bodu do tohoto cisla - if posledni_body > v.body_celkem: + if posledni_body > tv.body_celkem_rocnik: if stejne_body.get(posledni_body): konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body] #druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body @@ -115,16 +120,16 @@ class CisloView(generic.DetailView): elif predchozi_poradi : predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi) #pokud nebyl rozsah hodnot, pridam tecku za cislo - posledni_body = v.body_celkem + posledni_body = tv.body_celkem_rocnik tv.poradi = vi + 1 #poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly predchozi_poradi = tv - elif posledni_body == v.body_celkem: - if not stejne_body.get(v.body_celkem): - stejne_body[v.body_celkem] = 1 + elif posledni_body == tv.body_celkem_rocnik: + if not stejne_body.get(tv.body_celkem_rocnik): + stejne_body[tv.body_celkem_rocnik] = 1 #pokud klic neexistuje, zalozim novy pro tohoto resitele else: - stejne_body[v.body_celkem] += 1 + stejne_body[tv.body_celkem_rocnik] += 1 #rozsirim pocet resitelu sdilejici stejnou pozici vysledky_resitele[v.resitel.id] = tv #odkaz na radek vysledkovky patrici danemu resiteli @@ -132,10 +137,6 @@ class CisloView(generic.DetailView): for r in reseni: vysledky_resitele[r.resitel.id].body[problem_index[r.problem.id]] = r.body - body_za_cislo = vysledky_resitele[r.resitel.id].vysledek.body - #body za toto cislo, stejne jako tv.vysledek.body - body_celkem = vysledky_resitele[r.resitel.id].vysledek.body_celkem - vysledky_resitele[r.resitel.id].body_minule = body_celkem - body_za_cislo context['vysledkovka'] = vysledkovka