diff --git a/seminar/migrations/0092_auto_20210309_2049.py b/seminar/migrations/0092_auto_20210309_2049.py
new file mode 100644
index 00000000..3dbb7358
--- /dev/null
+++ b/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'),
+ ),
+ ]
diff --git a/seminar/models.py b/seminar/models.py
index f2c418e6..b7147106 100644
--- a/seminar/models.py
+++ b/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
diff --git a/seminar/templates/seminar/titulnistrana.html b/seminar/templates/seminar/titulnistrana.html
index 6e929965..db34b71c 100644
--- a/seminar/templates/seminar/titulnistrana.html
+++ b/seminar/templates/seminar/titulnistrana.html
@@ -22,12 +22,12 @@ function sousdeadline() {
{% if typ_deadline == 'soustredeni' %}
- deadlinu odeslání řešení
+ deadlinu odeslání řešení
pro účast na soustředění
{% elif typ_deadline == 'preddeadline' %} 1. deadlinu aktuálního čísla
- {% else %} deadlinu aktuálního čísla
+ 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 aktuálního čísla
+ {% else %} deadlinu aktuálního čísla
{% endif %}zbývá:
{{nejblizsi_deadline|timeuntil}}
@@ -48,27 +48,31 @@ function sousdeadline() {
- 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,
- experimentovat a objevovat s námi fascinující zákoutí matiky, fyziky a informatiky.
+ 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.
+ Součástí témat jsou problémy a úlohy, nad kterými se můžeš zamyslet, experimentovat a bádat.
Zaregistruj se!
- M&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í.
-
Co můžeš vyhrát?
{# FIXME odkaz #}
-
+
- Řeš témata!
+ Vyřeš to!
+ 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í.
+
+
Co můžeš vyhrát?
{# FIXME odkaz #}
+
+
diff --git a/seminar/utils.py b/seminar/utils.py
index e28f3cbc..26d52665 100644
--- a/seminar/utils.py
+++ b/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')
diff --git a/seminar/views/vysledkovka.py b/seminar/views/vysledkovka.py
index f4fa5edb..6a5da6a9 100644
--- a/seminar/views/vysledkovka.py
+++ b/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]