130 lines
4.7 KiB
Plaintext
130 lines
4.7 KiB
Plaintext
from PDAPI import *
|
|
import TempLateAPI.GERP.API.FormAPI.FormData as FormData
|
|
|
|
CLEARABLE_UUID_FIELDS = {"CompanyUUID", "TenantUUID", "DeptUUID", "ParentCompanyUUID", "ReviewerUUID"}
|
|
|
|
|
|
def VerifyForm(TableName):
|
|
Table = FormData.GetTable(TableName)
|
|
if not Table:
|
|
return {"code": 1, "msg": "找不到表格"}, 404
|
|
|
|
Table.SetRequired(["PrimaryKey", "MechanicalItem"], False)
|
|
|
|
fields = Table.Get()
|
|
for field in fields:
|
|
field_type = field.get("Type", "")
|
|
field_name = field.get("Name", "")
|
|
if field_type == "UUID" and field_name in CLEARABLE_UUID_FIELDS:
|
|
field["AllowedEmpty"] = True
|
|
else:
|
|
field["PassEmpty"] = True
|
|
return fields
|
|
|
|
|
|
__metadata__ = {
|
|
"route": "{DEFAULT_ROUTE}/<TableName>",
|
|
"methods": ["POST"],
|
|
"blueprint": "GERP",
|
|
"permission": 3.0,
|
|
"attributes": [],
|
|
"limit": "1 per second",
|
|
"form": VerifyForm
|
|
}
|
|
|
|
|
|
def HandleRequest(_CleanedData):
|
|
Table = FormData.GetTable(_CleanedData["params"]["TableName"])
|
|
if not Table:
|
|
return {"code": 404, "msg": "找不到表格"}, 404
|
|
|
|
ctx = FormData.PM._build_context(Table, _CleanedData["params"]["TableName"], _CleanedData)
|
|
|
|
if not FormData.PM.check_permission("add", ctx):
|
|
return {"code": 403, "msg": "无新增权限"}, 403
|
|
|
|
skip, custom_result = FormData.PM.run_before_add(ctx)
|
|
if skip:
|
|
return custom_result
|
|
|
|
extension = FormData.get_table_extension(_CleanedData["params"]["TableName"])
|
|
if extension and hasattr(extension, "add"):
|
|
extension_result = extension.add(Table, _CleanedData)
|
|
if extension_result:
|
|
return extension_result
|
|
|
|
Model = Table.GetModel()
|
|
CheckUniqueResult, CheckUniqueCause = Table.CheckAllUniqueFieldsDuplicate(flask.request.form)
|
|
if not CheckUniqueResult:
|
|
return {"code": 409, "msg": f"项重复:{CheckUniqueCause}"}, 409
|
|
for i in Table.RangeItem():
|
|
if i not in _CleanedData["form"]:
|
|
continue
|
|
field_config = Table.GetItem(i)
|
|
value = _CleanedData["form"][i]
|
|
if value is None or value == '':
|
|
continue
|
|
if field_config:
|
|
if field_config.get("Type") == "int":
|
|
try:
|
|
value = int(value)
|
|
except ValueError:
|
|
pass
|
|
elif field_config.get("Type") == "float":
|
|
try:
|
|
value = float(value)
|
|
except ValueError:
|
|
pass
|
|
elif field_config.get("Type") == "bool":
|
|
value = bool(value)
|
|
elif field_config.get("Type") == "UUID":
|
|
value = Table.KeyToUUIDConversion(i, value, bytes)
|
|
elif field_config.get("Type") == "timestampstr":
|
|
utc_str = FormData.user_tz_to_utc(value)
|
|
ts_format = field_config.get("TimestampFormat", "%Y-%m-%d %H:%M:%S")
|
|
try:
|
|
value = datetime.datetime.strptime(utc_str, "%Y-%m-%d %H:%M:%S")
|
|
except ValueError:
|
|
try:
|
|
value = datetime.datetime.strptime(utc_str, ts_format)
|
|
except ValueError:
|
|
pass
|
|
|
|
setattr(Model, i, value)
|
|
else:
|
|
setattr(Model, i, value)
|
|
|
|
table_data = FormData.data.get(_CleanedData["params"]["TableName"])
|
|
if table_data and "config" in table_data and "autoFill" in table_data["config"]:
|
|
auto_fill = table_data["config"]["autoFill"]
|
|
current_user = GetELTUser()
|
|
if current_user:
|
|
for field, value in auto_fill.items():
|
|
if value == "current_user":
|
|
setattr(Model, field, Get16toBytes(current_user.GetUserUUID()))
|
|
|
|
gen_func = Table.PrimaryKeyGenerationFunction()
|
|
if gen_func:
|
|
gen_value = gen_func() if callable(gen_func) else gen_func
|
|
gen_value = Table.KeyToUUIDConversion(Table.PrimaryKey, gen_value, bytes)
|
|
setattr(Model, Table.PrimaryKey, gen_value)
|
|
try:
|
|
db.session.add(Model)
|
|
db.session.commit()
|
|
pk_value = getattr(Model, Table.PrimaryKey, None)
|
|
pk_value = Table.KeyToUUIDConversion(Table.PrimaryKey, pk_value, str)
|
|
result = {"code": 0, "msg": "创建成功", "id": pk_value}, 201
|
|
except sqlalchemy.exc.IntegrityError as e:
|
|
db.session.rollback()
|
|
err_msg = str(e.orig) if e.orig else str(e)
|
|
result = {"code": 409, "msg": f"数据冲突:{err_msg}"}, 409
|
|
except:
|
|
print(traceback.print_exc())
|
|
db.session.rollback()
|
|
result = {"code": 1, "msg": "SQL 提交失败"}, 500
|
|
|
|
modified_result, skip_response = FormData.PM.run_after_add(ctx, result)
|
|
if skip_response:
|
|
return modified_result
|
|
return result
|