Skip to content
Snippets Groups Projects
Commit bb4a9939 authored by Martin Mareš's avatar Martin Mareš
Browse files

Diplomy/UI: Zbytek DesignParams

parent e7a3f22b
No related branches found
No related tags found
1 merge request!137Sazba diplomů
......@@ -14,6 +14,7 @@ from tempfile import NamedTemporaryFile
from typing import Tuple, Optional, Dict
import werkzeug.exceptions
import wtforms
from wtforms import validators
import mo
import mo.db as db
......@@ -73,7 +74,7 @@ def send_certificate(ct_id: int, cert_type: str, user_filename: str, user_id: Op
return send_file(open(tmp_file.name, 'rb'), mimetype='application/pdf')
def validate_background(form, field):
def validate_background(form: 'CertSetForm', field: wtforms.Field) -> None:
if not field.data:
return
......@@ -86,6 +87,17 @@ def validate_background(form, field):
raise wtforms.ValidationError(str(e))
class SpaceField(wtforms.FloatField):
def __init__(self, label: str, **kwargs):
super().__init__(label,
validators=[validators.InputRequired(),
validators.NumberRange(-10, 200, "Hodnota musí být mezi %(min)s a %(max)s")],
**kwargs)
default_design = DesignParams()
class CertSetForm(FlaskForm):
signer1_name = mo_fields.String("1. podepisující: jméno")
signer1_title = mo_fields.String("1. podepisující: funkce", render_kw={'placeholder': 'např. Předseda okresní komise MO'})
......@@ -97,11 +109,31 @@ class CertSetForm(FlaskForm):
upload_background = flask_wtf.file.FileField(validators=[validate_background],
render_kw={'accept': 'application/pdf'},
description="Zde můžete nahrát obrázek ve formátu PDF, který se použije jako pozadí diplomu.")
space1 = SpaceField("Mezera 1", description=f"Mezera mezi horním okrajem a hlavičkou (default: {default_design.space1}).")
space2 = SpaceField("Mezera 2", description=f"Mezera mezi hlavičkou a jménem (default: {default_design.space2}).")
space3 = SpaceField("Mezera 3", description=f"Mezera mezi jménem a umístěním (default: {default_design.space3}).")
space4 = SpaceField("Mezera 4", description=f"Mezera mezi umístěním a podpisy (default: {default_design.space4}).")
space5 = SpaceField("Mezera 5", description=f"Mezera mezi podpisy a patičkou (default: {default_design.space5}).")
space6 = SpaceField("Mezera 6", description=f"Mezera mezi patičkou a dolním okrajem (default: {default_design.space6}).")
logo_visible = wtforms.BooleanField("Logo MO a JČMF v patičce")
tex_hacks = mo_fields.String("Nastavení sazby") # description se nastavuje později
generate = wtforms.SubmitField("Vytvořit diplomy")
save = wtforms.SubmitField("Pouze uložit nastavení")
delete = wtforms.SubmitField("Smazat diplomy")
def osmo_validate(self, cset) -> bool:
ok = True
if self.background_type.data == BackgroundType.custom and self.upload_background.data is None and not cset.background_file:
self.upload_background.errors.append('Nahrajte obrázek na pozadí.') # FIXME: typing
ok = False
if all(getattr(self, key).data >= 0 for key in DesignParams.SPACE_PARAMS):
self.space1.errors.append('Alespoň jedna z mezer musí být pružná.') # FIXME: typing
ok = False
return ok
@app.route('/org/contest/c/<int:ct_id>/certificates', methods=('GET', 'POST'))
def org_certificates(ct_id: int):
......@@ -140,15 +172,12 @@ def org_certificates(ct_id: int):
else:
form = None
form_ok = False
if form and form.validate_on_submit():
if form.background_type.data == BackgroundType.custom and form.upload_background.data is None and not cset.background_file:
form.upload_background.errors.append('Nahrajte obrázek na pozadí.') # FIXME: typing
else:
form_ok = True
if form and form_ok:
if not new_cset and form.delete.data:
if form:
if not form.is_submitted():
pass
elif not form.validate() or not form.osmo_validate(cset):
flash('V nastavení diplomů byly nalezeny chyby.', 'danger')
elif not new_cset and form.delete.data:
sess.delete(cset)
mo.util.log(
type=db.LogType.cert_set,
......@@ -166,7 +195,7 @@ def org_certificates(ct_id: int):
if dparams.background_type == BackgroundType.custom:
if form.upload_background.data:
old_background = cset.background_file
out_dir = os.path.join(ctx.master_round.round_code_short(), str(contest.contest_id))
out_dir = cset.dir_path()
cset.background_file = mo.util.link_to_dir(form.upload_background.data.stream.name,
out_dir,
base_dir=mo.util.data_dir('certs'),
......@@ -238,6 +267,7 @@ def org_certificates(ct_id: int):
certs_by_uid_type=certs_by_uid_type,
settings_changed=(cset.changed_at is not None and (cset.certs_issued_at is None or cset.certs_issued_at < cset.changed_at)),
scoretable_changed=(cset.scoretable != contest.scoretable),
form_has_errors=form and form.is_submitted(),
)
......
......@@ -154,9 +154,26 @@
</div>
{# Detailní nastavení vzhledu #}
<div class="collapsible"><input type="checkbox" class="toggle" id="design-params-toggle">
<div class="collapsible">
<input type="checkbox" class="toggle" id="design-params-toggle"{% if form_has_errors %} checked{% endif %}>
<label for="design-params-toggle" class="toggle toggle-small">Detaily vzhledu</label>
<div class="collapsible-inner"><div class="form-horiz-frame">
<div class="form-group">
<p class="col-lg-9 col-lg-offset-3 help-block">
Pokud používáte vlastní obrázek na pozadí, může se hodit posunout text diplomu.
Proto je možné nastavovat mezery mezi jednotlivými částmi textu.
Kladná čísla odpovídají velikostem v milimetrech.
Záporná čísla určují pružné mezery, které vyplní zbylé místo na stránce
v zadaném poměru (např. -3 je třikrát větší mezera než -1).
</p>
</div>
{{ field(form.space1) }}
{{ field(form.space2) }}
{{ field(form.space3) }}
{{ field(form.space4) }}
{{ field(form.space5) }}
{{ field(form.space6) }}
{{ field(form.logo_visible) }}
{% if 'tex_hacks' in form %}
{{ field(form.tex_hacks) }}
{% endif %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment