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" } }