Browse Source

Merge branch 'data_migrations' into test

middleware_test
Jonas Havelka 4 years ago
parent
commit
7ecf2ae9ff
  1. 19
      seminar/migrations/0092_auto_20210309_2049.py
  2. 1
      seminar/models.py
  3. 24
      seminar/templates/seminar/titulnistrana.html
  4. 2
      seminar/utils.py
  5. 34
      seminar/views/vysledkovka.py

19
seminar/migrations/0092_auto_20210309_2049.py

@ -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'),
),
]

1
seminar/models.py

@ -962,6 +962,7 @@ class Clanek(Problem):
cislo = models.ForeignKey(Cislo, blank=True, null=True, on_delete=models.PROTECT,
verbose_name='číslo vydání', related_name='vydane_clanky')
@cached_property
def kod_v_rocniku(self):
if self.stav == 'zadany':
# Nemělo by být potřeba

24
seminar/templates/seminar/titulnistrana.html

@ -22,12 +22,12 @@ function sousdeadline() {
{% if typ_deadline == 'soustredeni' %}
<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í.">
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í
{% 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>
{% else %} deadlinu 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="/aktualni/zadani/">čísla</a>
{% endif %}zbývá:
{{nejblizsi_deadline|timeuntil}}</big></b></p>
</div>
@ -48,27 +48,31 @@ function sousdeadline() {
</h1>
<div>
M&amp;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,
experimentovat a objevovat s námi fascinující zákoutí matiky, fyziky a informatiky.
M&amp;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.
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>
M&amp;M je taky soutěž. Za svá řešení dostaneš body a 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í.
<a href="cojemam/odmeny"> <div class="button"> Co můžeš vyhrát? </div> </a> {# FIXME odkaz #}
</div>
</div>
</div>
<div class="temata_titulka">
<h1>
Řeš témata!
Vyřeš to!
</h1>
<div>
M&amp;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.
{% for tema in aktualni_temata %}
<a href="{{ tema.url }}"> <div class="button"> {{ tema.nazev }} </div> </a>
{% endfor %}
-->
</div>
</div>

2
seminar/utils.py

@ -230,7 +230,7 @@ def cisla_rocniku(rocnik, jen_verejne=True):
seznam objektů typu Cislo
"""
if jen_verejne:
return rocnik.verejna_cisla()
return rocnik.verejne_vysledkovky_cisla()
else:
return rocnik.cisla.all().order_by('poradi')

34
seminar/views/vysledkovka.py

@ -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,
buď odjakživa do daného ročníku/čísla anebo za daný ročník/číslo.
Parametry:
@ -94,12 +94,22 @@ def body_resitelu(resitele, za, odjakziva=True):
body_k_zapocteni = Sum('reseni__hodnoceni__body',
filter=( Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok=rok,
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ě.
body_k_zapocteni = Sum('reseni__hodnoceni__body',
filter= Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lte=rok))
elif rocnik and odjakziva: # Spočítáme body za starší ročníky až do zadaného včetně.
if jen_verejne:
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.
body_k_zapocteni = Sum('reseni__hodnoceni__body',
filter= Q(reseni__hodnoceni__cislo_body__rocnik=rocnik))
if jen_verejne:
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:
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
# 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žší
setrizeni_resitele_id, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn)
poradi = sloupec_s_poradim(setrizene_body)
# 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
radky_vysledkovky = []
@ -216,7 +226,7 @@ def pricti_body(slovnik, resitel, 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),
setřídí je sestupně a vrátí jako seznam.
Parametry:
@ -224,7 +234,7 @@ def secti_body_za_rocnik(za, aktivni_resitele):
daného čísla
"""
# 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ě
resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(),
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)
# 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
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ě
setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn]

Loading…
Cancel
Save