Merge branch 'master' of atrey.karlin.mff.cuni.cz:/akce/MaM/MaMweb/mamweb
Conflicts: seminar/views.py
This commit is contained in:
commit
0b30583b0a
12 changed files with 284 additions and 41 deletions
|
@ -6,6 +6,12 @@ F2="$2"
|
||||||
TMPF1=`tempfile`
|
TMPF1=`tempfile`
|
||||||
TMPF2=`tempfile`
|
TMPF2=`tempfile`
|
||||||
|
|
||||||
|
if which colordiff; then
|
||||||
|
DIFF=colordiff
|
||||||
|
else
|
||||||
|
DIFF=diff
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "z$F1" == "z" ]; then
|
if [ "z$F1" == "z" ]; then
|
||||||
echo "Requies argument"
|
echo "Requies argument"
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -21,7 +27,7 @@ else
|
||||||
cat "$F2" | bunzip2 > "$TMPF2"
|
cat "$F2" | bunzip2 > "$TMPF2"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
colordiff "$TMPF1" "$TMPF2"
|
$DIFF "$TMPF1" "$TMPF2"
|
||||||
|
|
||||||
rm "$TMPF1" "$TMPF2"
|
rm "$TMPF1" "$TMPF2"
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ from .settings_common import *
|
||||||
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/
|
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/
|
||||||
|
|
||||||
INSTALLED_APPS += (
|
INSTALLED_APPS += (
|
||||||
|
'django_extensions',
|
||||||
)
|
)
|
||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
|
|
|
@ -5,7 +5,8 @@ from django.core.urlresolvers import reverse
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from django.utils.encoding import force_text
|
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
|
from .ovvpfile import OvvpFile
|
||||||
|
|
||||||
class ExportIndexView(generic.View):
|
class ExportIndexView(generic.View):
|
||||||
|
@ -75,7 +76,7 @@ class ExportRocnikView(generic.View):
|
||||||
|
|
||||||
rocnik = get_object_or_404(Rocnik, prvni_rok=pr, exportovat=True)
|
rocnik = get_object_or_404(Rocnik, prvni_rok=pr, exportovat=True)
|
||||||
cislo = rocnik.posledni_zverejnena_vysledkovka_cislo()
|
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 = default_ovvpfile('MaM.rocnik', rocnik)
|
||||||
of.headers['comment'] = u'MaM-Web export aktivnich resitelu rocniku {rocnik} do cisla {cislo}'.format(
|
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]
|
v = vysledky[vi]
|
||||||
rd = v.resitel.export_row()
|
rd = v.resitel.export_row()
|
||||||
|
|
||||||
if posledni_body > v.body_celkem:
|
if posledni_body > v.body:
|
||||||
posledni_body = v.body_celkem
|
posledni_body = v.body
|
||||||
posledni_poradi = vi + 1
|
posledni_poradi = vi + 1
|
||||||
rd['rank'] = posledni_poradi
|
rd['rank'] = posledni_poradi
|
||||||
rd['points'] = v.body_celkem
|
rd['points'] = v.body
|
||||||
|
|
||||||
of.rows.append(rd)
|
of.rows.append(rd)
|
||||||
|
|
||||||
|
|
75
seminar/migrations/0028_add_body_celkem_views.py
Normal file
75
seminar/migrations/0028_add_body_celkem_views.py
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
# -*- 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;
|
||||||
|
drop view seminar_body_za_cislo;
|
||||||
|
|
||||||
|
create view seminar_body_za_cislo as
|
||||||
|
select
|
||||||
|
seminar_reseni.cislo_body_id || '-' || seminar_reseni.resitel_id as id,
|
||||||
|
seminar_reseni.cislo_body_id as cislo_id,
|
||||||
|
seminar_reseni.resitel_id as resitel_id,
|
||||||
|
seminar_cisla.cislo as cislo,
|
||||||
|
seminar_cisla.rocnik_id as rocnik_id,
|
||||||
|
seminar_rocniky.rocnik as rocnik,
|
||||||
|
seminar_cisla.verejna_vysledkovka as verejna_vysledkovka,
|
||||||
|
sum(seminar_reseni.body) as body
|
||||||
|
from
|
||||||
|
seminar_reseni
|
||||||
|
inner join seminar_cisla on seminar_reseni.cislo_body_id = seminar_cisla.id
|
||||||
|
inner join seminar_rocniky on seminar_cisla.rocnik_id = seminar_rocniky.id
|
||||||
|
group by seminar_reseni.cislo_body_id, seminar_reseni.resitel_id, seminar_cisla.cislo,
|
||||||
|
seminar_cisla.rocnik_id, seminar_rocniky.rocnik, seminar_cisla.verejna_vysledkovka
|
||||||
|
order by body desc;
|
||||||
|
|
||||||
|
create view seminar_body_k_cislu_rocnik as
|
||||||
|
select
|
||||||
|
akt_body.id as id,
|
||||||
|
akt_body.cislo_id as cislo_id,
|
||||||
|
akt_body.resitel_id as resitel_id,
|
||||||
|
akt_body.body as body,
|
||||||
|
sum(min_body.body) as body_celkem
|
||||||
|
from
|
||||||
|
seminar_body_za_cislo as akt_body
|
||||||
|
inner join seminar_body_za_cislo as min_body on
|
||||||
|
(akt_body.resitel_id = min_body.resitel_id and
|
||||||
|
(akt_body.rocnik = min_body.rocnik and akt_body.cislo >= min_body.cislo)
|
||||||
|
)
|
||||||
|
group by akt_body.id, akt_body.cislo_id, akt_body.resitel_id, akt_body.body
|
||||||
|
order by body_celkem desc;
|
||||||
|
|
||||||
|
create view seminar_body_k_cislu_odjakziva as
|
||||||
|
select
|
||||||
|
akt_body.id as id,
|
||||||
|
akt_body.cislo_id as cislo_id,
|
||||||
|
akt_body.resitel_id as resitel_id,
|
||||||
|
akt_body.body as body,
|
||||||
|
sum(min_body.body) as body_celkem
|
||||||
|
from
|
||||||
|
seminar_body_za_cislo as akt_body
|
||||||
|
inner join seminar_body_za_cislo as min_body on
|
||||||
|
(akt_body.resitel_id = min_body.resitel_id and
|
||||||
|
((akt_body.rocnik = min_body.rocnik and akt_body.cislo >= min_body.cislo) or
|
||||||
|
(akt_body.rocnik < min_body.rocnik)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
group by akt_body.id, akt_body.cislo_id, akt_body.resitel_id, akt_body.body
|
||||||
|
order by body_celkem desc;
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [("seminar", "0027_export_flag_a_typ_akce")]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RunSQL(sql=CREATE_VIEWS)
|
||||||
|
]
|
||||||
|
|
51
seminar/migrations/0029_fix_body_celkem_views.py
Normal file
51
seminar/migrations/0029_fix_body_celkem_views.py
Normal file
|
@ -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)
|
||||||
|
]
|
||||||
|
|
|
@ -650,9 +650,9 @@ class VysledkyBase(SeminarModelBase):
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return force_unicode(u"%s: %sb (%s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo)))
|
return force_unicode(u"%s: %sb (%s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo)))
|
||||||
# NOTE: DB HOG (ale nepouzivany)
|
# NOTE: DB zatez pri vypisu (ale nepouzivany)
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
|
||||||
class VysledkyZaCislo(VysledkyBase):
|
class VysledkyZaCislo(VysledkyBase):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -660,25 +660,27 @@ class VysledkyZaCislo(VysledkyBase):
|
||||||
abstract = False
|
abstract = False
|
||||||
managed = False
|
managed = False
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
# NOTE: DB HOG (ale nepouzivany)
|
|
||||||
return force_unicode(u"%s: %sb (za %s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo)))
|
|
||||||
|
|
||||||
|
class VysledkyKCisluZaRocnik(VysledkyBase):
|
||||||
@python_2_unicode_compatible
|
|
||||||
class VysledkyKCislu(VysledkyBase):
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'seminar_body_k_cislu'
|
db_table = 'seminar_body_k_cislu_rocnik'
|
||||||
abstract = False
|
abstract = False
|
||||||
managed = False
|
managed = False
|
||||||
|
|
||||||
body_celkem = models.DecimalField(max_digits=8, decimal_places=1, db_column='body_celkem',
|
# body = models.DecimalField(max_digits=8, decimal_places=1, db_column='body',
|
||||||
verbose_name=u'body celkem do čísla')
|
# verbose_name=u'body do čísla (za ročník)')
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
# NOTE: DB HOG (ale nepouzivany)
|
class VysledkyKCisluOdjakziva(VysledkyBase):
|
||||||
return force_unicode(u"%s: %sb / %sb (do %s)" % (self.resitel.plne_jmeno(), self.body, self.body_celkem, str(self.cislo)))
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'seminar_body_k_cislu_odjakziva'
|
||||||
|
abstract = False
|
||||||
|
managed = False
|
||||||
|
|
||||||
|
# body = models.DecimalField(max_digits=8, decimal_places=1, db_column='body',
|
||||||
|
# verbose_name=u'body do čísla (i minulé ročníky)')
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
|
|
|
@ -34,17 +34,19 @@
|
||||||
{% for p in problemy %}
|
{% for p in problemy %}
|
||||||
<th class='border-r'><a href="{{ p.verejne_url }}">{{ p.cislo_zadani.cislo }}.{{ p.kod }}</a>
|
<th class='border-r'><a href="{{ p.verejne_url }}">{{ p.cislo_zadani.cislo }}.{{ p.kod }}</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<th class='border-r'>Sum
|
<th class='border-r'>Sum<sup>-1</sup>
|
||||||
<th>Celkem
|
<th>Celkem
|
||||||
|
<th>Odjakživa
|
||||||
{% for rv in vysledkovka %}
|
{% for rv in vysledkovka %}
|
||||||
<tr>
|
<tr>
|
||||||
<td class='border-r'>{{ rv.poradi }}
|
<td class='border-r'>{{ rv.poradi }}
|
||||||
<th class='border-r'>{{ rv.resitel.plne_jmeno }} [{{ rv.resitel.id }}]
|
<th class='border-r'>{{ rv.resitel.plne_jmeno }} {{ rv.titul }}
|
||||||
{% for b in rv.body %}
|
{% for b in rv.body %}
|
||||||
<td class='border-r'>{{ b }}
|
<td class='border-r'>{{ b }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<td class='border-r'>{{ rv.vysledek.body |default:0 }}
|
<td class='border-r'>{{ rv.body_minule }}
|
||||||
<td>{{ rv.vysledek.body_celkem }}
|
<td><b>{{ rv.body_celkem_rocnik }}</b>
|
||||||
|
<td>{{ rv.body_celkem_odjakziva }}
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -22,12 +22,12 @@
|
||||||
{% for rv in vysledkovka %}
|
{% for rv in vysledkovka %}
|
||||||
{{ rv.poradi }} &
|
{{ rv.poradi }} &
|
||||||
{% if rv.resitel.titul %}
|
{% if rv.resitel.titul %}
|
||||||
\titul{ {{ rv.resitel.titul }} }
|
\titul{ {{ rv.titul }} }
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ rv.resitel.plne_jmeno }} & {{ rv.resitel.rocnik |default:"" }} & {{ rv.body_minule }}
|
{{ rv.resitel.plne_jmeno }} & {{ rv.resitel.rocnik |default:"" }} & {{ rv.body_minule }}
|
||||||
{% for b in rv.body %}
|
{% for b in rv.body %}
|
||||||
{{ b }} &
|
{{ b }} &
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{{ rv.vysledek.body |default:0 }} & {{ rv.vysledek.body_celkem }} \\
|
{{ rv.body_celkem_rocnik |default:0 }} & {{ rv.body_celkem_minule }} \\
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
\end{longtable}
|
\end{longtable}
|
||||||
|
|
24
seminar/templates/seminar/stav_databaze.html
Normal file
24
seminar/templates/seminar/stav_databaze.html
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div>
|
||||||
|
<h2>Stav databáze</h2>
|
||||||
|
|
||||||
|
<h3>Řešitelé</h3>
|
||||||
|
|
||||||
|
<div>Řešitelů: {{ resitele |length}} ({{ muzi |length}} mužů, {{ zeny |length}} žen)</div>
|
||||||
|
<div>Křestní jména mužů:</div>
|
||||||
|
<p><code>{% for n, c in jmena_muzu.items %}{{ n }} ({{ c }}), {% endfor %}</code>
|
||||||
|
<div>Křestní jména žen:</div>
|
||||||
|
<p><code>{% for n, c in jmena_zen.items %}{{ n }} ({{ c }}), {% endfor %}</code>
|
||||||
|
|
||||||
|
<h3>Nastavení</h3>
|
||||||
|
|
||||||
|
<h3>Problémy</h3>
|
||||||
|
{% for p in problemy %}
|
||||||
|
<div>{{ p |safe }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
||||||
|
|
|
@ -17,6 +17,8 @@ urlpatterns = patterns('',
|
||||||
|
|
||||||
url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'),
|
url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'),
|
||||||
|
|
||||||
|
url(r'^stav$', views.StavDatabazeView, name='stav_databaze'),
|
||||||
|
|
||||||
url(r'^aesop-export/mam-rocnik-(?P<prvni_rok>\d+)\.csv$', export.ExportRocnikView.as_view(), name='seminar_export_rocnik'),
|
url(r'^aesop-export/mam-rocnik-(?P<prvni_rok>\d+)\.csv$', export.ExportRocnikView.as_view(), name='seminar_export_rocnik'),
|
||||||
url(r'^aesop-export/mam-sous-(?P<datum_zacatku>[\d-]+)\.csv$', export.ExportSousView.as_view(), name='seminar_export_sous'),
|
url(r'^aesop-export/mam-sous-(?P<datum_zacatku>[\d-]+)\.csv$', export.ExportSousView.as_view(), name='seminar_export_sous'),
|
||||||
url(r'^aesop-export/index.csv$', export.ExportIndexView.as_view(), name='seminar_export_index'),
|
url(r'^aesop-export/index.csv$', export.ExportIndexView.as_view(), name='seminar_export_index'),
|
||||||
|
|
|
@ -1,5 +1,17 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
|
def histogram(seznam):
|
||||||
|
d = {}
|
||||||
|
for i in seznam:
|
||||||
|
if i not in d:
|
||||||
|
d[i] = 0
|
||||||
|
d[i] += 1
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
roman_numerals = zip((1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
|
roman_numerals = zip((1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
|
||||||
('M', 'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I'))
|
('M', 'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I'))
|
||||||
|
|
||||||
|
@ -18,3 +30,49 @@ def from_roman(rom):
|
||||||
return i + from_roman(rom[len(n):])
|
return i + from_roman(rom[len(n):])
|
||||||
raise Exception('Invalid roman numeral: "%s"', rom)
|
raise Exception('Invalid roman numeral: "%s"', rom)
|
||||||
|
|
||||||
|
|
||||||
|
def seznam_problemu():
|
||||||
|
from .models import Problem, Resitel, Rocnik, Reseni, Cislo
|
||||||
|
problemy = []
|
||||||
|
|
||||||
|
# Pomocna fce k formatovani problemovych hlasek
|
||||||
|
def prb(cls, msg, objs=None):
|
||||||
|
s = u'<b>%s:</b> %s' % (cls.__name__, msg)
|
||||||
|
if objs:
|
||||||
|
s += u' ['
|
||||||
|
for o in objs:
|
||||||
|
try:
|
||||||
|
url = o.admin_url()
|
||||||
|
except:
|
||||||
|
url = None
|
||||||
|
if url:
|
||||||
|
s += u'<a href="%s">%s</a>, ' % (url, o.pk, )
|
||||||
|
else:
|
||||||
|
s += u'%s, ' % (o.pk, )
|
||||||
|
s = s[:-2] + u']'
|
||||||
|
problemy.append(s)
|
||||||
|
|
||||||
|
# Duplicita jmen
|
||||||
|
jmena = {}
|
||||||
|
for r in Resitel.objects.all():
|
||||||
|
j = r.plne_jmeno()
|
||||||
|
if j not in jmena:
|
||||||
|
jmena[j] = []
|
||||||
|
jmena[j].append(r)
|
||||||
|
for j in jmena:
|
||||||
|
if len(jmena[j]) > 1:
|
||||||
|
prb(Resitel, u'Duplicitní jméno "%s"' % (j, ), jmena[j])
|
||||||
|
|
||||||
|
# Data maturity a narození
|
||||||
|
for r in Resitel.objects.all():
|
||||||
|
if not r.rok_maturity:
|
||||||
|
prb(Resitel, u'Neznámý rok maturity', [r])
|
||||||
|
if r.rok_maturity and (r.rok_maturity < 1990 or r.rok_maturity > datetime.date.today().year + 10):
|
||||||
|
prb(Resitel, u'Podezřelé datum maturity', [r])
|
||||||
|
if r.datum_narozeni and (r.datum_narozeni.year < 1970 or r.datum_narozeni.year > datetime.date.today().year - 12):
|
||||||
|
prb(Resitel, u'Podezřelé datum narození', [r])
|
||||||
|
# if not r.email:
|
||||||
|
# prb(Resitel, u'Neznámý email', [r])
|
||||||
|
|
||||||
|
return problemy
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,9 @@ from django.views import generic
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
|
|
||||||
from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni, Organizator
|
from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel
|
||||||
|
from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva
|
||||||
|
from . import utils
|
||||||
|
|
||||||
def AktualniZadaniView(request):
|
def AktualniZadaniView(request):
|
||||||
nastaveni = get_object_or_404(Nastaveni)
|
nastaveni = get_object_or_404(Nastaveni)
|
||||||
|
@ -146,7 +147,7 @@ class CisloView(generic.DetailView):
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(CisloView, self).get_context_data(**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")
|
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))
|
problemy = sorted(list(set([r.problem for r in reseni])), key=lambda x:(0 if x.typ==Problem.TYP_ULOHA else 1,x.kod))
|
||||||
|
@ -168,17 +169,22 @@ class CisloView(generic.DetailView):
|
||||||
v = vysledky[vi]
|
v = vysledky[vi]
|
||||||
tv = RadekVysledkovky()
|
tv = RadekVysledkovky()
|
||||||
tv.resitel = v.resitel
|
tv.resitel = v.resitel
|
||||||
tv.rocnik = tv.resitel.rocnik(context['cislo'].datum_vydani)
|
|
||||||
tv.resitel.titul = tv.resitel.titul(v.body_celkem)
|
tv.resitel.titul = tv.resitel.titul(v.body_celkem)
|
||||||
|
tv.rocnik = tv.resitel.rocnik(context['cislo'].rocnik)
|
||||||
tv.vysledek = v
|
tv.vysledek = v
|
||||||
#odkazuje na VysledkyKCislu
|
#odkazuje na VysledkyKCislu
|
||||||
tv.body = ['']*len(problemy)
|
tv.body = ['']*len(problemy)
|
||||||
#pole bodu za ulohy
|
#pole bodu za ulohy
|
||||||
tv.poradi = ''
|
tv.poradi = ''
|
||||||
#defaultni poradi je prazdne - kvuli sdilenym mistum
|
#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
|
#pocet bodu do tohoto cisla
|
||||||
if posledni_body > v.body_celkem:
|
if posledni_body > tv.body_celkem_rocnik:
|
||||||
if stejne_body.get(posledni_body):
|
if stejne_body.get(posledni_body):
|
||||||
konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body]
|
konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body]
|
||||||
#druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body
|
#druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body
|
||||||
|
@ -187,16 +193,16 @@ class CisloView(generic.DetailView):
|
||||||
elif predchozi_poradi :
|
elif predchozi_poradi :
|
||||||
predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi)
|
predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi)
|
||||||
#pokud nebyl rozsah hodnot, pridam tecku za cislo
|
#pokud nebyl rozsah hodnot, pridam tecku za cislo
|
||||||
posledni_body = v.body_celkem
|
posledni_body = tv.body_celkem_rocnik
|
||||||
tv.poradi = vi + 1
|
tv.poradi = vi + 1
|
||||||
#poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly
|
#poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly
|
||||||
predchozi_poradi = tv
|
predchozi_poradi = tv
|
||||||
elif posledni_body == v.body_celkem:
|
elif posledni_body == tv.body_celkem_rocnik:
|
||||||
if not stejne_body.get(v.body_celkem):
|
if not stejne_body.get(tv.body_celkem_rocnik):
|
||||||
stejne_body[v.body_celkem] = 1
|
stejne_body[tv.body_celkem_rocnik] = 1
|
||||||
#pokud klic neexistuje, zalozim novy pro tohoto resitele
|
#pokud klic neexistuje, zalozim novy pro tohoto resitele
|
||||||
else:
|
else:
|
||||||
stejne_body[v.body_celkem] += 1
|
stejne_body[tv.body_celkem_rocnik] += 1
|
||||||
#rozsirim pocet resitelu sdilejici stejnou pozici
|
#rozsirim pocet resitelu sdilejici stejnou pozici
|
||||||
vysledky_resitele[v.resitel.id] = tv
|
vysledky_resitele[v.resitel.id] = tv
|
||||||
#odkaz na radek vysledkovky patrici danemu resiteli
|
#odkaz na radek vysledkovky patrici danemu resiteli
|
||||||
|
@ -204,10 +210,6 @@ class CisloView(generic.DetailView):
|
||||||
|
|
||||||
for r in reseni:
|
for r in reseni:
|
||||||
vysledky_resitele[r.resitel.id].body[problem_index[r.problem.id]] = r.body
|
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
|
context['vysledkovka'] = vysledkovka
|
||||||
|
@ -242,3 +244,22 @@ class SoustredeniListView(generic.ListView):
|
||||||
class SoustredeniView(generic.DetailView):
|
class SoustredeniView(generic.DetailView):
|
||||||
model = Soustredeni
|
model = Soustredeni
|
||||||
template_name = 'seminar/archiv/soustredeni.html'
|
template_name = 'seminar/archiv/soustredeni.html'
|
||||||
|
|
||||||
|
### Status
|
||||||
|
|
||||||
|
def StavDatabazeView(request):
|
||||||
|
# nastaveni = Nastaveni.objects.get()
|
||||||
|
problemy = utils.seznam_problemu()
|
||||||
|
muzi = Resitel.objects.filter(pohlavi_muz=True)
|
||||||
|
zeny = Resitel.objects.filter(pohlavi_muz=False)
|
||||||
|
return render(request, 'seminar/stav_databaze.html',
|
||||||
|
{
|
||||||
|
# 'nastaveni': nastaveni,
|
||||||
|
'problemy': problemy,
|
||||||
|
|
||||||
|
'resitele': Resitel.objects.all(),
|
||||||
|
'muzi': muzi,
|
||||||
|
'zeny': zeny,
|
||||||
|
'jmena_muzu': utils.histogram([r.jmeno for r in muzi]),
|
||||||
|
'jmena_zen': utils.histogram([r.jmeno for r in zeny]),
|
||||||
|
})
|
||||||
|
|
Loading…
Reference in a new issue