Files
SMANAGE/_api_backup/TempLateAPI/GERP/API/FormAPI/Modify.api
T
2026-06-16 11:55:14 +08:00

146 lines
5.1 KiB
Plaintext

from PDAPI import *
import TempLateAPI.GERP.API.FormAPI.FormData as FormData
def VerifyForm(TableName, **kwargs):
Table = FormData.GetTable(TableName)
if not Table:
return {"code": 1, "msg": "找不到表格"}, 404
fields = Table.Get()
for field in fields:
field["PassEmpty"] = True
return fields
__metadata__ = {
"route": "{DEFAULT_ROUTE}/<TableName>/<id>",
"methods": ["PUT"],
"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": 1, "msg": "找不到表格"}, 404
ctx = FormData.PM._build_context(Table, _CleanedData["params"]["TableName"], _CleanedData)
if not FormData.PM.check_permission("modify", ctx):
return {"code": 403, "msg": "无修改权限"}, 403
skip, custom_result = FormData.PM.run_before_modify(ctx)
if skip:
return custom_result
pk_value = _CleanedData["params"].get("id") or _CleanedData["form"].get(Table.PrimaryKey)
if not pk_value:
return {"code": 1, "msg": "缺少主键"}, 400
pk_parts = [p.strip() for p in str(pk_value).split(',')]
if len(pk_parts) > 1:
filters = []
for i, pk_name in enumerate(Table.PrimaryKeys):
if i < len(pk_parts):
filters.append(
getattr(Table.Model, pk_name) == Table.KeyToUUIDConversion(
pk_name, pk_parts[i], bytes
)
)
Model = Table.Model.query.filter(*filters).first()
else:
Model = Table.Model.query.filter(
getattr(Table.Model, Table.PrimaryKey) == Table.KeyToUUIDConversion(
Table.PrimaryKey, pk_value, bytes
)
).first()
if not Model:
return {"code": 1, "msg": "找不到记录"}, 404
for i in Table.RangeItem():
if i == Table.PrimaryKey:
continue
if i not in _CleanedData["form"]:
continue
field_config = Table.GetItem(i)
value = _CleanedData["form"][i]
if value is None or (isinstance(value, str) and not value.strip()):
if field_config and field_config.get("Type") == "UUID":
setattr(Model, i, None)
continue
if field_config:
field_type = field_config.get("Type")
if field_type == "int":
try:
value = int(value)
except (ValueError, TypeError):
continue
elif field_type == "float":
try:
value = float(value)
except (ValueError, TypeError):
continue
elif field_type == "bool":
value = bool(value)
elif field_type == "UUID":
if not value:
setattr(Model, i, None)
continue
value = Table.KeyToUUIDConversion(i, value, bytes)
elif field_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:
continue
elif field_type == "json":
if isinstance(value, str):
try:
import json
value = json.loads(value)
except json.JSONDecodeError:
continue
setattr(Model, i, value)
else:
if value is not None and not (isinstance(value, str) and not value.strip()):
try:
int(value)
setattr(Model, i, value)
except (ValueError, TypeError):
setattr(Model, i, Table.KeyToUUIDConversion(i, value, bytes))
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" and field not in _CleanedData["form"]:
setattr(Model, field, Get16toBytes(current_user.GetUserUUID()))
try:
db.session.commit()
result = {"code": 0, "msg": "更新成功"}, 200
except Exception as e:
db.session.rollback()
import traceback
traceback.print_exc()
result = {"code": 1, "msg": f"更新失败:{str(e)}"}, 500
modified_result, skip_response = FormData.PM.run_after_modify(ctx, result)
if skip_response:
return modified_result
return result