- Added rules to discount field: required, number, min:0, max:1 - Frontend: Form validates on submit, shows error below field - Backend: auto-generated dspy validates before DB write
99 lines
2.4 KiB
Plaintext
99 lines
2.4 KiB
Plaintext
|
|
ns = params_kw.copy()
|
|
for k,v in ns.items():
|
|
if v == 'NaN' or v == 'null':
|
|
ns[k] = None
|
|
id = params_kw.id
|
|
if not id or len(id) > 32:
|
|
id = uuid()
|
|
ns['id'] = id
|
|
|
|
|
|
|
|
userorgid = await get_userorgid()
|
|
if not userorgid:
|
|
return {
|
|
"widgettype":"Error",
|
|
"options":{
|
|
"title":"Authorization Error",
|
|
"timeout":3,
|
|
"cwidth":16,
|
|
"cheight":9,
|
|
"message":"Please login"
|
|
}
|
|
}
|
|
ns['ownerid'] = userorgid
|
|
|
|
|
|
_validation_rules = json.loads(r'''{"discount": [{"type": "required", "message": "折扣不能为空"}, {"type": "number", "message": "折扣必须是数字"}, {"type": "min", "value": 0, "message": "折扣不能小于0"}, {"type": "max", "value": 1, "message": "折扣不能大于1"}]}''')
|
|
import re as _re
|
|
_errors = []
|
|
for _fname, _rules in _validation_rules.items():
|
|
_val = params_kw.get(_fname, '')
|
|
if _val is None: _val = ''
|
|
_val = str(_val)
|
|
for _rule in _rules:
|
|
_rt = _rule.get('type', '')
|
|
_rm = _rule.get('message', _fname)
|
|
_rv = _rule.get('value')
|
|
if _rt == 'required':
|
|
if not _val or _val.strip() == '':
|
|
_errors.append(_rm)
|
|
break
|
|
elif _rt == 'minlength':
|
|
if _val and len(_val) < int(_rv):
|
|
_errors.append(_rm)
|
|
break
|
|
elif _rt == 'maxlength':
|
|
if len(_val) > int(_rv):
|
|
_errors.append(_rm)
|
|
break
|
|
elif _rt in ('min', 'max'):
|
|
if _val:
|
|
try:
|
|
_n = float(_val)
|
|
if _rt == 'min' and _n < float(_rv): _errors.append(_rm); break
|
|
if _rt == 'max' and _n > float(_rv): _errors.append(_rm); break
|
|
except (ValueError, TypeError):
|
|
_errors.append(_rm)
|
|
break
|
|
elif _rt == 'pattern':
|
|
if _val and not _re.match(_rv, _val):
|
|
_errors.append(_rm)
|
|
break
|
|
elif _rt == 'email':
|
|
if _val and not _re.match(r'^[^\s@]+@[^\s@]+\.[^\s@]+$', _val):
|
|
_errors.append(_rm)
|
|
break
|
|
elif _rt == 'number':
|
|
if _val:
|
|
try: float(_val)
|
|
except (ValueError, TypeError): _errors.append(_rm); break
|
|
if _errors:
|
|
return {"widgettype":"Error","options":{"title":"Validation Failed","cwidth":16,"cheight":9,"timeout":3,"message":"; ".join(_errors)}}
|
|
|
|
db = DBPools()
|
|
dbname = get_module_dbname('pricing')
|
|
async with db.sqlorContext(dbname) as sor:
|
|
r = await sor.C('pricing_program', ns.copy())
|
|
return {
|
|
"widgettype":"Message",
|
|
"options":{
|
|
"cwidth":16,
|
|
"cheight":9,
|
|
"title":"Add Success",
|
|
"timeout":3,
|
|
"message":"ok"
|
|
}
|
|
}
|
|
|
|
return {
|
|
"widgettype":"Error",
|
|
"options":{
|
|
"title":"Add Error",
|
|
"cwidth":16,
|
|
"cheight":9,
|
|
"timeout":3,
|
|
"message":"failed"
|
|
}
|
|
} |