79 lines
2.5 KiB
Plaintext
79 lines
2.5 KiB
Plaintext
from PDAPI import *
|
|
import datetime
|
|
|
|
__metadata__ = {
|
|
"methods": ["POST"],
|
|
"blueprint": "GERP",
|
|
"permission": 1.0,
|
|
"attributes": [],
|
|
"limit": "3 per minute",
|
|
}
|
|
|
|
def HandleRequest(_CleanedData):
|
|
current_user = UGM.GetELTUser()
|
|
if not current_user:
|
|
return {"code": 401, "msg": "未登录"}, 401
|
|
|
|
has_admin = GERPUserABAC.query.filter(sqlalchemy.and_(
|
|
GERPUserABAC.UserUUID == current_user.UserUUID,
|
|
GERPUserABAC.HierarchicalPermissionIdentifiers == "admin:workorder_create"
|
|
)).first()
|
|
|
|
if not has_admin:
|
|
last_order = GERPWorkOrder.query.filter(
|
|
GERPWorkOrder.CreatorUUID == current_user.UserUUID
|
|
).order_by(GERPWorkOrder.CreateTime.desc()).first()
|
|
if last_order and last_order.CreateTime:
|
|
elapsed = (datetime.datetime.utcnow() - last_order.CreateTime).total_seconds()
|
|
if elapsed < 300:
|
|
remaining = int(300 - elapsed)
|
|
return {"code": 1, "msg": f"提交过于频繁,请等待 {remaining} 秒"}, 429
|
|
|
|
data = flask.request.get_json(silent=True) or {}
|
|
title = data.get("title", "").strip()
|
|
description = data.get("description", "").strip()
|
|
category = data.get("category", "other").strip()
|
|
priority = data.get("priority", 0)
|
|
|
|
if not title:
|
|
return {"code": 1, "msg": "标题不能为空"}, 400
|
|
if len(title) > 256:
|
|
return {"code": 1, "msg": "标题过长"}, 400
|
|
|
|
valid_categories = ["bug", "feature", "question", "account", "other"]
|
|
if category not in valid_categories:
|
|
category = "other"
|
|
|
|
if priority not in [0, 1, 2, 3]:
|
|
priority = 0
|
|
|
|
order_uuid = NewBUUID()
|
|
order = GERPWorkOrder()
|
|
order.OrderUUID = order_uuid
|
|
order.Title = title
|
|
order.Description = description
|
|
order.Category = category
|
|
order.Priority = priority
|
|
order.Status = 0
|
|
order.CreatorUUID = current_user.UserUUID
|
|
|
|
try:
|
|
db.session.add(order)
|
|
db.session.commit()
|
|
except:
|
|
db.session.rollback()
|
|
return {"code": 1, "msg": "创建失败"}, 200
|
|
|
|
return {
|
|
"code": 0,
|
|
"msg": "工单已提交",
|
|
"data": {
|
|
"orderUUID": UUIDObj(order_uuid).UpperStr,
|
|
"title": order.Title,
|
|
"category": order.Category,
|
|
"priority": order.Priority,
|
|
"status": order.Status,
|
|
"createTime": order.CreateTime.strftime("%Y-%m-%d %H:%M:%S") if order.CreateTime else None,
|
|
}
|
|
}, 201
|