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. 32
      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, 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

24
seminar/templates/seminar/titulnistrana.html

@ -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&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, 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.
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&amp;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&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. 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>

2
seminar/utils.py

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

32
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, """ 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:
@ -95,11 +95,21 @@ def body_resitelu(resitele, za, odjakziva=True):
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…
Cancel
Save