Merge branch 'data_migrations' into test
This commit is contained in:
commit
7ecf2ae9ff
5 changed files with 57 additions and 23 deletions
19
seminar/migrations/0092_auto_20210309_2049.py
Normal file
19
seminar/migrations/0092_auto_20210309_2049.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# Generated by Django 2.2.15 on 2021-03-09 19:49
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('seminar', '0091_resitel_zasilat_cislo_emailem'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='tema',
|
||||||
|
name='rocnik',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='temata', to='seminar.Rocnik', verbose_name='ročník'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -962,6 +962,7 @@ class Clanek(Problem):
|
||||||
cislo = models.ForeignKey(Cislo, blank=True, null=True, on_delete=models.PROTECT,
|
cislo = models.ForeignKey(Cislo, blank=True, null=True, on_delete=models.PROTECT,
|
||||||
verbose_name='číslo vydání', related_name='vydane_clanky')
|
verbose_name='číslo vydání', related_name='vydane_clanky')
|
||||||
|
|
||||||
|
@cached_property
|
||||||
def kod_v_rocniku(self):
|
def kod_v_rocniku(self):
|
||||||
if self.stav == 'zadany':
|
if self.stav == 'zadany':
|
||||||
# Nemělo by být potřeba
|
# Nemělo by být potřeba
|
||||||
|
|
|
@ -22,12 +22,12 @@ function sousdeadline() {
|
||||||
{% if typ_deadline == 'soustredeni' %}
|
{% if typ_deadline == 'soustredeni' %}
|
||||||
<a href="" onClick="sousdeadline()"
|
<a href="" onClick="sousdeadline()"
|
||||||
title="Body za řešení, která nám přijdou do tohoto deadlinu, se ještě započítají pro účast na připravovaném soustředění.">
|
title="Body za řešení, která nám přijdou do tohoto deadlinu, se ještě započítají pro účast na připravovaném soustředění.">
|
||||||
deadlinu</a> odeslání <a href="/zadani/aktualni/">řešení
|
deadlinu</a> odeslání <a href="/aktualni/zadani/">řešení
|
||||||
</a> pro účast na soustředění
|
</a> pro účast na soustředění
|
||||||
|
|
||||||
{% elif typ_deadline == 'preddeadline' %} <a href="" onClick="preddeadline()"
|
{% elif typ_deadline == 'preddeadline' %} <a href="" onClick="preddeadline()"
|
||||||
title="Řešení, která nám přijdou do tohoto deadlinu, se pokusíme opravit co nejdříve, abyste měli ještě šanci si je ještě opravit před definitivním deadlinem čísla.">1. deadlinu</a> aktuálního <a href="/zadani/aktualni/">čísla</a>
|
title="Řešení, která nám přijdou do tohoto deadlinu, se pokusíme opravit co nejdříve, abyste měli ještě šanci si je ještě opravit před definitivním deadlinem čísla.">1. deadlinu</a> aktuálního <a href="/aktualni/zadani/">čísla</a>
|
||||||
{% else %} deadlinu aktuálního <a href="/zadani/aktualni/">čísla</a>
|
{% else %} deadlinu aktuálního <a href="/aktualni/zadani/">čísla</a>
|
||||||
{% endif %}zbývá:
|
{% endif %}zbývá:
|
||||||
{{nejblizsi_deadline|timeuntil}}</big></b></p>
|
{{nejblizsi_deadline|timeuntil}}</big></b></p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -48,27 +48,31 @@ function sousdeadline() {
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
M&M je korespondenční seminář. Vydáváme časopis a v něm zajímavé podněty k přemýšlení. Ty na ně můžeš reagovat,
|
M&M je korespondenční seminář pro středoškoláky. Vydáváme časopis, v němž najdeš různá témata z matematiky, fyziky a informatiky.
|
||||||
experimentovat a objevovat s námi fascinující zákoutí matiky, fyziky a informatiky.
|
Součástí témat jsou problémy a úlohy, nad kterými se můžeš zamyslet, experimentovat a bádat.
|
||||||
<a href="prihlaska/?"> <div class="button"> Zaregistruj se! </div> </a>
|
<a href="prihlaska/?"> <div class="button"> Zaregistruj se! </div> </a>
|
||||||
M&M je taky soutěž. Za svá řešení dostaneš body a můžeš vyhrát zajímavé ceny, dostat se
|
</div>
|
||||||
na Matfyz bez přijímaček a především, můžeš s námi jet na skvělé soustředění.
|
|
||||||
<a href="cojemam/odmeny"> <div class="button"> Co můžeš vyhrát? </div> </a> {# FIXME odkaz #}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="temata_titulka">
|
<div class="temata_titulka">
|
||||||
|
|
||||||
<h1>
|
<h1>
|
||||||
Řeš témata!
|
Vyřeš to!
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
M&M je taky soutěž. Řešení, která nám pošleš, opravíme, a dostaneš za ně body. Můžeš vyhrát zajímavé ceny, dostat se
|
||||||
|
na Matfyz bez přijímaček a především, můžeš s námi jet na skvělé soustředění.
|
||||||
|
<br><br>
|
||||||
|
<a href="cojemam/odmeny"> <div class="button"> Co můžeš vyhrát? </div> </a> {# FIXME odkaz #}
|
||||||
|
|
||||||
|
<!--
|
||||||
Přidej se k nám! Pusť se do řešení témát.
|
Přidej se k nám! Pusť se do řešení témát.
|
||||||
{% for tema in aktualni_temata %}
|
{% for tema in aktualni_temata %}
|
||||||
<a href="{{ tema.url }}"> <div class="button"> {{ tema.nazev }} </div> </a>
|
<a href="{{ tema.url }}"> <div class="button"> {{ tema.nazev }} </div> </a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
-->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -230,7 +230,7 @@ def cisla_rocniku(rocnik, jen_verejne=True):
|
||||||
seznam objektů typu Cislo
|
seznam objektů typu Cislo
|
||||||
"""
|
"""
|
||||||
if jen_verejne:
|
if jen_verejne:
|
||||||
return rocnik.verejna_cisla()
|
return rocnik.verejne_vysledkovky_cisla()
|
||||||
else:
|
else:
|
||||||
return rocnik.cisla.all().order_by('poradi')
|
return rocnik.cisla.all().order_by('poradi')
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ def sloupec_s_poradim(setrizene_body):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def body_resitelu(resitele, za, odjakziva=True):
|
def body_resitelu(resitele, za, odjakziva=True, jen_verejne=False):
|
||||||
""" Funkce počítající počty bodů pro zadané řešitele,
|
""" Funkce počítající počty bodů pro zadané řešitele,
|
||||||
buď odjakživa do daného ročníku/čísla anebo za daný ročník/číslo.
|
buď odjakživa do daného ročníku/čísla anebo za daný ročník/číslo.
|
||||||
Parametry:
|
Parametry:
|
||||||
|
@ -94,12 +94,22 @@ def body_resitelu(resitele, za, odjakziva=True):
|
||||||
body_k_zapocteni = Sum('reseni__hodnoceni__body',
|
body_k_zapocteni = Sum('reseni__hodnoceni__body',
|
||||||
filter=( Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok=rok,
|
filter=( Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok=rok,
|
||||||
reseni__hodnoceni__cislo_body__poradi__lte=cislo.poradi) ))
|
reseni__hodnoceni__cislo_body__poradi__lte=cislo.poradi) ))
|
||||||
elif rocnik and odjakziva: # Spočítáme body za starší ročníky až do zadaného včetně.
|
elif rocnik and odjakziva: # Spočítáme body za starší ročníky až do zadaného včetně.
|
||||||
body_k_zapocteni = Sum('reseni__hodnoceni__body',
|
if jen_verejne:
|
||||||
filter= Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lte=rok))
|
body_k_zapocteni = Sum('reseni__hodnoceni__body',
|
||||||
|
filter= Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lte=rok,
|
||||||
|
reseni__hodnoceni__cislo_body__verejna_vysledkovka=True))
|
||||||
|
else:
|
||||||
|
body_k_zapocteni = Sum('reseni__hodnoceni__body',
|
||||||
|
filter= Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lte=rok))
|
||||||
elif rocnik and not odjakziva: # Spočítáme body za daný ročník.
|
elif rocnik and not odjakziva: # Spočítáme body za daný ročník.
|
||||||
body_k_zapocteni = Sum('reseni__hodnoceni__body',
|
if jen_verejne:
|
||||||
filter= Q(reseni__hodnoceni__cislo_body__rocnik=rocnik))
|
body_k_zapocteni = Sum('reseni__hodnoceni__body',
|
||||||
|
filter=Q(reseni__hodnoceni__cislo_body__rocnik=rocnik,
|
||||||
|
reseni__hodnoceni__cislo_body__verejna_vysledkovka=True))
|
||||||
|
else:
|
||||||
|
body_k_zapocteni = Sum('reseni__hodnoceni__body',
|
||||||
|
filter=Q(reseni__hodnoceni__cislo_body__rocnik=rocnik))
|
||||||
else:
|
else:
|
||||||
assert True, "body_resitelu: Neplatná kombinace za a odjakživa."
|
assert True, "body_resitelu: Neplatná kombinace za a odjakživa."
|
||||||
|
|
||||||
|
@ -149,14 +159,14 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
||||||
body_cisla_slov[cislo.id] = cislobody
|
body_cisla_slov[cislo.id] = cislobody
|
||||||
|
|
||||||
# získáme body za ročník, seznam obsahuje dvojice (řešitel_id, body) setřízené sestupně
|
# získáme body za ročník, seznam obsahuje dvojice (řešitel_id, body) setřízené sestupně
|
||||||
resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele)
|
resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele, jen_verejne=jen_verejne)
|
||||||
|
|
||||||
# setřídíme řešitele podle počtu bodů a získáme seznam s body od nejvyšších po nenižší
|
# setřídíme řešitele podle počtu bodů a získáme seznam s body od nejvyšších po nenižší
|
||||||
setrizeni_resitele_id, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn)
|
setrizeni_resitele_id, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn)
|
||||||
poradi = sloupec_s_poradim(setrizene_body)
|
poradi = sloupec_s_poradim(setrizene_body)
|
||||||
|
|
||||||
# získáme body odjakživa
|
# získáme body odjakživa
|
||||||
resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, rocnik)
|
resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, rocnik, jen_verejne=jen_verejne)
|
||||||
|
|
||||||
# vytvoříme jednotlivé sloupce výsledkovky
|
# vytvoříme jednotlivé sloupce výsledkovky
|
||||||
radky_vysledkovky = []
|
radky_vysledkovky = []
|
||||||
|
@ -216,7 +226,7 @@ def pricti_body(slovnik, resitel, body):
|
||||||
|
|
||||||
slovnik[resitel.id] += body
|
slovnik[resitel.id] += body
|
||||||
|
|
||||||
def secti_body_za_rocnik(za, aktivni_resitele):
|
def secti_body_za_rocnik(za, aktivni_resitele, jen_verejne):
|
||||||
""" Spočítá body za ročník (celý nebo do daného čísla),
|
""" Spočítá body za ročník (celý nebo do daného čísla),
|
||||||
setřídí je sestupně a vrátí jako seznam.
|
setřídí je sestupně a vrátí jako seznam.
|
||||||
Parametry:
|
Parametry:
|
||||||
|
@ -224,7 +234,7 @@ def secti_body_za_rocnik(za, aktivni_resitele):
|
||||||
daného čísla
|
daného čísla
|
||||||
"""
|
"""
|
||||||
# spočítáme všem řešitelům jejich body za ročník (False => ne odjakživa)
|
# spočítáme všem řešitelům jejich body za ročník (False => ne odjakživa)
|
||||||
resitel_rocnikbody_slov = body_resitelu(aktivni_resitele, za, False)
|
resitel_rocnikbody_slov = body_resitelu(aktivni_resitele, za, False, jen_verejne=jen_verejne)
|
||||||
# zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně
|
# zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně
|
||||||
resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(),
|
resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(),
|
||||||
key = lambda x: x[1], reverse = True)
|
key = lambda x: x[1], reverse = True)
|
||||||
|
@ -380,10 +390,10 @@ def vysledkovka_cisla(cislo, context=None):
|
||||||
hlavni_problemy_slovnik, cislobody = secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy)
|
hlavni_problemy_slovnik, cislobody = secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy)
|
||||||
|
|
||||||
# získáme body za ročník, seznam obsahuje dvojice (řešitel_id, body) setřízené sestupně
|
# získáme body za ročník, seznam obsahuje dvojice (řešitel_id, body) setřízené sestupně
|
||||||
resitel_rocnikbody_sezn = secti_body_za_rocnik(cislo, aktivni_resitele)
|
resitel_rocnikbody_sezn = secti_body_za_rocnik(cislo, aktivni_resitele, jen_verejne=True)
|
||||||
|
|
||||||
# získáme body odjakživa
|
# získáme body odjakživa
|
||||||
resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, cislo)
|
resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, cislo, jen_verejne=True)
|
||||||
|
|
||||||
# řešitelé setřídění podle bodů za číslo sestupně
|
# řešitelé setřídění podle bodů za číslo sestupně
|
||||||
setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn]
|
setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn]
|
||||||
|
|
Loading…
Reference in a new issue