diff --git a/seminar/forms.py b/seminar/forms.py
index 8f6950fa..4db77c18 100644
--- a/seminar/forms.py
+++ b/seminar/forms.py
@@ -142,6 +142,28 @@ class PrihlaskaForm(forms.Form):
elif data.get('skola_adresa')=='':
self.add_error('skola_adresa',forms.ValidationError('Je nutné vyplnit adresu školy'))
+# Editační formulář bez řešitele.
+class ProfileEditFormPoMat(forms.Form):
+ username = forms.CharField(label='Přihlašovací jméno',
+ max_length=256,
+ required=True)
+
+ jmeno = forms.CharField(label='Jméno', max_length=256, required=True)
+ prijmeni = forms.CharField(label='Příjmení', max_length=256, required=True)
+ pohlavi_muz = forms.ChoiceField(label='Pohlaví',
+ choices = ((True,'muž'),(False,'žena')), required=True)
+ email = forms.EmailField(label='E-mail',max_length=256, required=True)
+ telefon = forms.CharField(widget=TelInput(),label='Telefon',max_length=256, required=False)
+ datum_narozeni = forms.DateField(widget=DateInput(),label='Datum narození', required=False)
+ ulice = forms.CharField(label='Ulice', max_length=256, required=False)
+ mesto = forms.CharField(label='Město', max_length=256, required=False)
+ psc = forms.CharField(label='PSČ', max_length=32, required=False)
+ stat = forms.ChoiceField(label='Stát',
+ choices = (('CZ', 'Česká Republika'),
+ ('SK', 'Slovenská Republika'),
+ ('other', 'Jiné')),
+ required=False)
+ stat_text = forms.CharField(label='Stát', max_length=256, required=False)
class ProfileEditForm(forms.Form):
username = forms.CharField(label='Přihlašovací jméno',
@@ -181,7 +203,7 @@ class ProfileEditForm(forms.Form):
rok_maturity = forms.IntegerField(
label='Rok maturity',
- min_value=date.today().year,
+ min_value=date.today().year,
max_value=date.today().year+8,
required=True)
zasilat = forms.ChoiceField(label='Kam zasílat čísla a řešení',choices = Resitel.ZASILAT_CHOICES, required=True)
diff --git a/seminar/models.py b/seminar/models.py
index 63c9bdfa..afa54367 100644
--- a/seminar/models.py
+++ b/seminar/models.py
@@ -602,13 +602,18 @@ class Cislo(SeminarModelBase):
png_filename = pathlib.Path(tempfile.mkdtemp(), 'nahled.png')
subprocess.run([
- "convert",
- "-density", "300x300",
- "-geometry", "{}x{}".format(VYSKA, sirka),
- "-background", "white",
- "-flatten",
- "{}[0]".format(self.pdf.path), # titulní strana
- png_filename
+ "gs",
+ "-sstdout=%stderr",
+ "-dSAFER",
+ "-dNOPAUSE",
+ "-dBATCH",
+ "-dNOPROMPT",
+ "-sDEVICE=pngalpha",
+ "-r{}x{}".format(VYSKA, sirka),
+ "-dFirstPage=1d",
+ "-dLastPage=1d",
+ "-sOutputFile=" + str(png_filename),
+ "-f%s" % self.pdf.path
],
check=True,
capture_output=True
diff --git a/seminar/templates/seminar/odevzdavatko/seznam.html b/seminar/templates/seminar/odevzdavatko/seznam.html
index b58dcb54..2b3f332a 100644
--- a/seminar/templates/seminar/odevzdavatko/seznam.html
+++ b/seminar/templates/seminar/odevzdavatko/seznam.html
@@ -1,11 +1,15 @@
{% extends "base.html" %}
+{% load deadliny %}
{% block content %}
+{% for dl, mnozina_reseni in reseni_podle_deadlinu.items %}
+
{{ dl.2 | deadline_html }}
- {% for obj in object_list %}
+ {% for obj in mnozina_reseni %}
- {{ obj }} ({{ obj.get_forma_display }} {{ obj.cas_doruceni }})
{% endfor %}
+{% endfor %}
{% endblock %}
diff --git a/seminar/templates/seminar/profil/edit.html b/seminar/templates/seminar/profil/edit.html
index 9f94090e..89ad6b8c 100644
--- a/seminar/templates/seminar/profil/edit.html
+++ b/seminar/templates/seminar/profil/edit.html
@@ -61,6 +61,7 @@
{% include "seminar/profil/prihlaska_field.html" with field=form.stat_text id="id_li_stat_text"%}
+{% if not PoMat %} {# Vysloužilým účastníkům skrýt editaci školy apod. #}
@@ -95,6 +96,7 @@
+{% endif %}
diff --git a/seminar/views/odevzdavatko.py b/seminar/views/odevzdavatko.py
index 5c64bc11..3aa7e469 100644
--- a/seminar/views/odevzdavatko.py
+++ b/seminar/views/odevzdavatko.py
@@ -8,12 +8,13 @@ from django.db import transaction
from dataclasses import dataclass
import datetime
+from itertools import groupby
import logging
import seminar.models as m
import seminar.forms as f
from seminar.forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm
-from seminar.utils import aktivniResitele, resi_v_rocniku
+from seminar.utils import aktivniResitele, resi_v_rocniku, deadline
logger = logging.getLogger(__name__)
@@ -169,7 +170,14 @@ class ReseniProblemuView(MultipleObjectTemplateResponseMixin, MultipleObjectMixi
return redirect(reverse("odevzdavatko_detail_reseni", kwargs={"pk": jedine_reseni.id}))
context = self.get_context_data()
return self.render_to_response(context)
- # Kontext automaticky?
+
+ def get_context_data(self, *args, **kwargs):
+ ctx = super().get_context_data(*args, **kwargs)
+ # XXX: Předat groupby do template nejde: https://stackoverflow.com/questions/6906593/itertools-groupby-in-a-django-template
+ # Django má {% regroup %}, ale ten potřebuje, aby klíč byl atribut položky: https://docs.djangoproject.com/en/3.2/ref/templates/builtins/#regroup
+ # Takže rozbalíme groupby do slovníku klíč → seznam sami (dictionary comphrehension)
+ ctx['reseni_podle_deadlinu'] = {k: list(v) for k,v in groupby(ctx['object_list'], lambda r: deadline(r.cas_doruceni))}
+ return ctx
## XXX: https://docs.djangoproject.com/en/3.1/topics/class-based-views/mixins/#avoid-anything-more-complex
class DetailReseniView(DetailView):
diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py
index 49180550..81a15071 100644
--- a/seminar/views/views_all.py
+++ b/seminar/views/views_all.py
@@ -26,7 +26,7 @@ import seminar.models as m
from seminar.models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Tema, Clanek, Osoba, Skola # Tohle je stare a chceme se toho zbavit. Pouzivejte s.ToCoChci
#from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva
from seminar import utils, treelib
-from seminar.forms import PrihlaskaForm, LoginForm, ProfileEditForm
+from seminar.forms import PrihlaskaForm, LoginForm, ProfileEditForm, ProfileEditFormPoMat
import seminar.forms as f
import seminar.templatetags.treenodes as tnltt
import seminar.views.views_rest as vr
@@ -1095,15 +1095,21 @@ def resitelEditView(request):
user_edit = osoba_edit.user
## Vytvoření slovníku, kterým předvyplním formulář
prefill_1=model_to_dict(user_edit)
- if resitel_edit:
+ if resitel_edit and resitel_edit.rok_maturity >= date.today().year:
prefill_2=model_to_dict(resitel_edit)
prefill_1.update(prefill_2)
prefill_3=model_to_dict(osoba_edit)
prefill_1.update(prefill_3)
- form = ProfileEditForm(initial=prefill_1)
+ if resitel_edit and resitel_edit.rok_maturity < date.today().year:
+ form = ProfileEditFormPoMat(initial=prefill_1)
+ else:
+ form = ProfileEditForm(initial=prefill_1)
## Změna údajů a jejich uložení
if request.method == 'POST':
- form = ProfileEditForm(request.POST)
+ if resitel_edit and resitel_edit.rok_maturity < date.today().year:
+ form = ProfileEditFormPoMat(request.POST)
+ else:
+ form = ProfileEditForm(request.POST)
if form.is_valid():
## Změny v osobě
fcd = form.cleaned_data
@@ -1124,7 +1130,7 @@ def resitelEditView(request):
## Neznámá země
msg = "Unknown country {}".format(fcd['stat_text'])
- if resitel_edit:
+ if resitel_edit and resitel_edit.rok_maturity >= date.today().year:
## Změny v řešiteli
resitel_edit.skola = fcd['skola']
resitel_edit.rok_maturity = fcd['rok_maturity']
@@ -1140,7 +1146,7 @@ def resitelEditView(request):
return formularOKView(request)
else:
## Stránka před odeslaním formuláře = předvyplněný formulář
- return render(request, 'seminar/profil/edit.html', {'form': form})
+ return render(request, 'seminar/profil/edit.html', {'form': form, 'PoMat': resitel_edit and resitel_edit.rok_maturity < date.today().year})
def prihlaskaView(request):
generic_logger = logging.getLogger('seminar.prihlaska')