From 35f0395af9ce949dd4f111b610e78481fa15243c Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Tue, 16 Nov 2021 22:58:55 +0100
Subject: [PATCH] =?UTF-8?q?Automatick=C3=A9=20o=C5=99ez=C3=A1v=C3=A1n?=
=?UTF-8?q?=C3=AD=20stringov=C3=BDch=20pol=C3=AD=20ve=20formul=C3=A1=C5=99?=
=?UTF-8?q?=C3=ADch?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
V modulu mo.web.fields zavádím typy String a Password, které
se od StringField a PasswordField liší automatickým ořezáváním.
Ostatní stringovité typy odvozujeme od nich.
Viz #254.
---
mo/web/fields.py | 35 ++++++++++++++++++++++++++---------
1 file changed, 26 insertions(+), 9 deletions(-)
diff --git a/mo/web/fields.py b/mo/web/fields.py
index 85eeb71f..5fcbb6b0 100644
--- a/mo/web/fields.py
+++ b/mo/web/fields.py
@@ -9,6 +9,19 @@ import mo.users
import mo.db as db
+class Stripped:
+ """Zkombinuje se s třídou z WTForms a přidá automatické ořezávání mezer."""
+
+ def process_formdata(self, valuelist):
+ if valuelist:
+ valuelist = [x.strip() for x in valuelist]
+ super().process_formdata(valuelist)
+
+
+class String(Stripped, wtforms.StringField):
+ pass
+
+
class OptionalInt(wtforms.IntegerField):
widget = NumberInput()
@@ -40,7 +53,7 @@ class Decimal(wtforms.DecimalField):
return super(Decimal, self)._value()
-class IntList(wtforms.StringField):
+class IntList(String):
list = None
def __init__(self, label="", validators=None, **kwargs):
@@ -54,13 +67,13 @@ class IntList(wtforms.StringField):
except mo.CheckError as e:
raise wtforms.ValidationError(str(e))
+
class Points(Decimal):
def __init__(self, label="Body", validators=None, **kwargs):
super().__init__(label, validators, **kwargs)
-
-class Email(EmailField):
+class Email(Stripped, EmailField):
def __init__(self, label="E-mail", validators=None, **kwargs):
super().__init__(label, validators, **kwargs)
@@ -72,7 +85,7 @@ class Email(EmailField):
raise wtforms.ValidationError(str(e))
-class Grade(wtforms.StringField):
+class Grade(String):
"""Pro validaci hledá ve formuláři form.school a podle ní rozlišuje SŠ a ZŠ """
default_description = "Pro základní školy je to číslo od 1 do 9, pro <var>k</var>-tý ročník <var>r</var>-leté střední školy má formát <var>k</var>/<var>r</var>."
validate_grade = True
@@ -104,7 +117,7 @@ class BirthYear(OptionalInt):
raise wtforms.ValidationError(str(e))
-class Name(wtforms.StringField):
+class Name(String):
def pre_validate(field, form):
# XXX: Tato kontrola úmyslně není striktní, aby prošla i jména jako 'de Beer'
if field.data:
@@ -124,7 +137,7 @@ class LastName(Name):
super().__init__(label, validators, **kwargs)
-class Place(wtforms.StringField):
+class Place(String):
def __init__(self, label="Místo", validators=None, **kwargs):
super().__init__(label, validators, **kwargs)
self.render_kw = {"placeholder": "Kód"}
@@ -142,7 +155,7 @@ class Place(wtforms.StringField):
field.place_error = "Zadané místo nenalezeno."
def get_place(field) -> Optional[db.Place]:
- """ Kešuje výsledek v field.place"""
+ """Kešuje výsledek v field.place"""
if not field.place_loaded:
field.place_loaded = True
field.load_place()
@@ -182,7 +195,11 @@ class School(Place):
field.place_error = str(e)
-class NewPassword(wtforms.PasswordField):
+class Password(Stripped, wtforms.PasswordField):
+ pass
+
+
+class NewPassword(Password):
def __init__(self, label="Nové heslo", validators=None, **kwargs):
super().__init__(label, validators, **kwargs)
@@ -192,7 +209,7 @@ class NewPassword(wtforms.PasswordField):
raise wtforms.ValidationError(mo.users.password_help)
-class RepeatPassword(wtforms.PasswordField):
+class RepeatPassword(Password):
"""Pro validaci hledá ve formuláři form.new_passwd a s ním porovnává."""
def __init__(self, label="Zopakujte heslo", validators=None, **kwargs):
--
GitLab