From 0b9110cf6841bb583c263a453879f75a915fea2f Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 6 Apr 2021 20:30:48 +0200 Subject: [PATCH 1/4] =?UTF-8?q?Odevzd=C3=A1v=C3=A1tko:=20shlukov=C3=A1n?= =?UTF-8?q?=C3=AD=20=C5=99e=C5=A1en=C3=AD=20podle=20deadline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/templates/seminar/odevzdavatko/seznam.html | 6 +++++- seminar/views/odevzdavatko.py | 10 ++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) 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 }}

+{% endfor %} {% endblock %} diff --git a/seminar/views/odevzdavatko.py b/seminar/views/odevzdavatko.py index 5c64bc11..4a58be05 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,12 @@ 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) + # FIXME: Lepší by bylo předat groupby do template. + 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): From 653a564bfdc34e0774d790d71c6867595932b475 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 6 Apr 2021 20:39:18 +0200 Subject: [PATCH 2/4] =?UTF-8?q?Odevzd=C3=A1v=C3=A1tko:=20pl=C3=A1=C4=8D=20?= =?UTF-8?q?v=20koment=C3=A1=C5=99=C3=ADch=20nad=20Django=20templates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/views/odevzdavatko.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/seminar/views/odevzdavatko.py b/seminar/views/odevzdavatko.py index 4a58be05..3aa7e469 100644 --- a/seminar/views/odevzdavatko.py +++ b/seminar/views/odevzdavatko.py @@ -173,7 +173,9 @@ class ReseniProblemuView(MultipleObjectTemplateResponseMixin, MultipleObjectMixi def get_context_data(self, *args, **kwargs): ctx = super().get_context_data(*args, **kwargs) - # FIXME: Lepší by bylo předat groupby do template. + # 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 From aa8bb6dde485d3a79356fef43a72799bf987a31f Mon Sep 17 00:00:00 2001 From: Jonas Havelka Date: Tue, 6 Apr 2021 22:32:42 +0200 Subject: [PATCH 3/4] =?UTF-8?q?Vyslou=C5=BEil=C3=BDm=20=C3=BA=C4=8Dastn?= =?UTF-8?q?=C3=ADk=C5=AFm=20zkrouhnout=20zm=C4=9Bnu=20=C3=BAdaj=C5=AF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Hlavně kvůli orgům, kteří nemohli editovat bez změny roku maturity) --- seminar/forms.py | 24 +++++++++++++++++++++- seminar/templates/seminar/profil/edit.html | 2 ++ seminar/views/views_all.py | 18 ++++++++++------ 3 files changed, 37 insertions(+), 7 deletions(-) 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/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/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') From 795ab3471475307d4d3482c32a6aaf0a19e85d8c Mon Sep 17 00:00:00 2001 From: Jonas Havelka Date: Tue, 6 Apr 2021 23:11:22 +0200 Subject: [PATCH 4/4] Fix convert to gs --- seminar/models.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) 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