140 lines
4.7 KiB
Plaintext
140 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, **kwargs):
|
|
Table = FormData.GetTable(TableName)
|
|
Table.SetRequired(["ManualItem", "MechanicalItem"], False)
|
|
if not Table:
|
|
return {"code": 1, "msg": "找不到表格"}, 404
|
|
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>/<id>",
|
|
"methods": ["PATCH"],
|
|
"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_item", ctx):
|
|
return {"code": 403, "msg": "无修改权限"}, 403
|
|
|
|
skip, custom_result = FormData.PM.run_before_modify_item(ctx)
|
|
if skip:
|
|
return custom_result
|
|
|
|
pk_value = _CleanedData["params"]["id"]
|
|
|
|
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
|
|
|
|
merged_data = {**_CleanedData["form"], **_CleanedData["json"]}
|
|
form_keys = list(merged_data.keys())
|
|
|
|
update_count = 0
|
|
for Key in form_keys:
|
|
if Key == Table.PrimaryKey:
|
|
continue
|
|
|
|
value = merged_data[Key]
|
|
field_config = Table.GetItem(Key)
|
|
|
|
if field_config:
|
|
field_type = field_config.get("Type")
|
|
|
|
if field_type == "int":
|
|
try:
|
|
value = int(value) if value is not None else None
|
|
except (ValueError, TypeError):
|
|
continue
|
|
elif field_type == "float":
|
|
try:
|
|
value = float(value) if value is not None else None
|
|
except (ValueError, TypeError):
|
|
continue
|
|
elif field_type == "bool":
|
|
value = bool(value) if value is not None else None
|
|
elif field_type == "UUID":
|
|
if not value or (isinstance(value, str) and not value.strip()):
|
|
value = None
|
|
nullable = True
|
|
try:
|
|
col = getattr(Table.Model, Key)
|
|
if hasattr(col, 'property') and hasattr(col.property, 'columns'):
|
|
nullable = list(col.property.columns)[0].nullable
|
|
except:
|
|
pass
|
|
if nullable:
|
|
setattr(Model, Key, None)
|
|
update_count += 1
|
|
continue
|
|
else:
|
|
value = Table.KeyToUUIDConversion(Key, value, bytes)
|
|
elif field_type == "json":
|
|
if isinstance(value, str):
|
|
try:
|
|
import json
|
|
value = json.loads(value)
|
|
except json.JSONDecodeError:
|
|
continue
|
|
|
|
if value is not None:
|
|
setattr(Model, Key, value)
|
|
update_count += 1
|
|
|
|
if update_count == 0:
|
|
return {"code": 1, "msg": "没有字段需要更新"}, 400
|
|
|
|
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_item(ctx, result)
|
|
if skip_response:
|
|
return modified_result
|
|
return result
|