1570 lines
84 KiB
Python
1570 lines
84 KiB
Python
from tools import *
|
||
from Utils.Config import *
|
||
from Utils.Lib import *
|
||
"""
|
||
|
||
已被废弃,仅供参考
|
||
|
||
"""
|
||
|
||
Manage=flask.Blueprint("Manage", __name__, static_folder = JoinPath(FlaskTempLate, "Manage"), static_url_path = "/", subdomain = "manage")
|
||
|
||
#response = client.chat.completions.create(
|
||
# model="deepseek-chat",
|
||
# messages=[
|
||
# {"role": "system", "content": "You are a helpful assistant"},
|
||
# {"role": "user", "content": "你好"},
|
||
# ],
|
||
# stream=False
|
||
#)
|
||
#print(response.choices[0].message.content)
|
||
|
||
#https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ww36e7f50aa690169a&corpsecret=-r2vvpDpqX8DIUbHOuA5GjEyiniWLrSFfnKNyvZ88yQ
|
||
access_token="DpsH1Vt9Hg7cd-4VGQij2zQ9fQ7G9sREK5ugxs52bDUA46f3tJLjVxzbkqxFG91WRRlL7GaEdAx1E5UPAgL7O05psZqDQK8wm3OWR4ixLvx4M2LU6Pi5UfgqhKi53mhKe1IyxbOJLNkT7BdnYBW2WgKXO8mlhC6_jqpQgKDrDKF7U0i1KU9B6ZWlGlJz06caeK7J5ji4ADqheCokL2oByw"
|
||
|
||
def GetWeekStartDate(day=None, week_start=0, week_seek=0):
|
||
if week_seek != 0:
|
||
day = date.today()
|
||
day += timedelta(weeks=week_seek)
|
||
else: day = day or date.today()
|
||
return (day - timedelta(days=(day.weekday() - week_start) % 7)).strftime('%Y-%m-%d 00:00:00')
|
||
|
||
def PermissionsToStrPermissions(ADMIN):
|
||
ADMIN = str(ADMIN)
|
||
if "." not in ADMIN:return "未知"
|
||
main, sub = ADMIN.split(".", 1)
|
||
permissions_map = {
|
||
"5": ["工作室创始人", {
|
||
"0": "",
|
||
"2": "(没有认真阅读文档加入)(这个状态码在工作室创始人换人前不会出现)",
|
||
"9": "(劳动合同未签署或失效)(这个状态码在工作室创始人换人前不会出现)",
|
||
}],
|
||
"4": ["组代理", {
|
||
"01": "(临时)",
|
||
"0": "",
|
||
"5": "(4~5的中间级)(正常情况下不会出现)"
|
||
}],
|
||
"3": ["委代理", {
|
||
"01": "(临时)",
|
||
"0": ""
|
||
}],
|
||
"2": ["", {
|
||
"0": "组员",
|
||
"5": "组长",
|
||
"9": "特权"
|
||
}],
|
||
"1": ["", {
|
||
"0": "网站注册人员/普通人员/测试用户/工作室用户暂时权限未更改"
|
||
}],
|
||
}
|
||
invalid_msg = f"{main}没有这个状态码"
|
||
if main not in permissions_map: return "未知"
|
||
if sub in permissions_map[main][1]: return permissions_map[main][0] + permissions_map[main][1].get(sub)
|
||
else: return invalid_msg
|
||
|
||
TaskTypeLib={"1":"图像(纯图像文件)","2":"图像工程文件","3":"视频(纯视频文件)","4":"视频工程文件","5":"代码源文件","6":"编译后文件(exe)","7":"编译后文件(elf)","8":"编译后文件(app)","9":"编译后文件(apk)","10":"编译后文件(其它)(库文件)","11":"网络资源文件(exe)","12":"网络资源文件(elf)","13":"网络资源文件(app)","14":"网络资源文件(apk)","15":"网络资源文件(其它)(库文件)","16":"文稿(纯文字)","17":"文稿(网页文件)(富文本)(HTML5)","18":"文稿(标记语言)(MarkDown)","19":"文稿(故事剧情)","20":"停职恢复考察"}
|
||
TaskAnswerLib={"1":"上传文件","2":"填写长信息(多次换行)","3":"填写短信息(不可换行)","4":"填写链接","5":"其它链接(如考试题答题界面链接)"}
|
||
def LISTTOTASKTYPE(I):
|
||
s=[]
|
||
for i in I:
|
||
if str(i) in TaskTypeLib:s.append(TaskTypeLib[str(i)])
|
||
else:s.append("未知")
|
||
return s
|
||
def LISTTOTASKANSWER(I):
|
||
s=[]
|
||
for i in I:
|
||
if str(i) in TaskAnswerLib:s.append(TaskAnswerLib[str(i)])
|
||
else:s.append("未知")
|
||
return s
|
||
|
||
def INTTOTASKTYPE(I):
|
||
if I in TaskTypeLib:return TaskTypeLib[I]
|
||
else:return "未知"
|
||
def INTTOTASKANSWER(I):
|
||
if I in TaskAnswerLib:return TaskAnswerLib[I]
|
||
else:return "未知"
|
||
|
||
|
||
"""def GetSMTM():
|
||
res=[]
|
||
for i in SQLUsers.selectashead(NSQL.MOD.ALL,FROM="SMTM"):
|
||
if not Is_User(GetBytesto16(i["UserUUID"])):
|
||
SQLUsers.delete(FROM="UserSub", WHERE=("UserUUID=%s", i["UserUUID"]))
|
||
continue
|
||
res.append({"UserUUID":GetBytesto16(i["UserUUID"]), "UserParent": GetBytesto16(i["UserParent"])})
|
||
return res
|
||
|
||
def SearchChilds(UUID: str, SMTM):
|
||
if not UUID or not SMTM:
|
||
return False
|
||
l=[]
|
||
for i in SMTM:
|
||
if i["UserParent"] == UUID:
|
||
l.append(i["UserUUID"])
|
||
return l
|
||
|
||
def SearchFutureGenerations(UUID: str, SMTM):
|
||
# 搜索某个UUID在SMTM下的所有子类
|
||
ASMTM=GetSMTM()
|
||
d={str(SearchChilds("0"*32, ASMTM)[0]):{"Member":{}}}
|
||
def Recursion(d, U):
|
||
for i in SearchChilds(U, SMTM):
|
||
d["Member"][i]=Recursion({"Member": {}}, i)
|
||
return d
|
||
for i in SearchChilds(UUID, SMTM):
|
||
d[SearchChilds("0"*32, ASMTM)[0]]["Member"][i]=Recursion({"Member": {}}, i)
|
||
return d"""
|
||
|
||
def GetSMTM():
|
||
result = []
|
||
for user in SQLUsers.selectashead(NSQL.MOD.ALL, FROM="SMTM"):
|
||
UserUUID = GetBytesto16(user["UserUUID"])
|
||
#if not Is_User(userUuid):
|
||
# SQLUsers.delete(FROM="UserSub", WHERE=("UserUUID=%s", user["UserUUID"]))
|
||
# continue
|
||
result.append({"UserUUID": UserUUID, "UserParent": GetBytesto16(user["UserParent"])})
|
||
return result
|
||
def SearchChilds(UserUUID, smtm):
|
||
if not UserUUID or not smtm: return False
|
||
return [child["UserUUID"] for child in smtm if child["UserParent"] == UserUUID]
|
||
def SearchFutureGenerations(UserUUID, smtm):
|
||
if not UserUUID or not smtm: return {}
|
||
RootUUID = SearchChilds("0"*32, smtm)[0]
|
||
result = {RootUUID: {"Member": {}}}
|
||
directChildren = SearchChilds(UserUUID, smtm)
|
||
if not directChildren: return result
|
||
stack = [(childUuid, result[RootUUID]["Member"]) for childUuid in directChildren]
|
||
while stack:
|
||
currentUuid, parentMember = stack.pop()
|
||
currentMember = {"Member": {}}
|
||
parentMember[currentUuid] = currentMember
|
||
children = SearchChilds(currentUuid, smtm)
|
||
for childUuid in children:
|
||
stack.append((childUuid, currentMember["Member"]))
|
||
return result
|
||
|
||
# Tasks
|
||
def Is_Task(u):
|
||
return SQLTasks.istrue("Tasks", ("TaskUUID=%s", Get16toBytes(u)))
|
||
def Is_UserInTask(u, UserUUID):
|
||
return SQLTasks.istrue("Answer", ("TaskUUID=%s AND UserUUID=%s" , (Get16toBytes(u), Get16toBytes(UserUUID))))
|
||
def GetTaskInFo(u):
|
||
return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Tasks", WHERE=("TaskUUID=%s", Get16toBytes(u)), _limit=1)[0]
|
||
def GetTaskAnswerInFo(TaskUUID, UserUUID):
|
||
return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Answer", WHERE=("TaskUUID=%s AND UserUUID=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID))), _limit=1)[0]
|
||
def GetTaskUsers(u):
|
||
return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Answer", WHERE=("TaskUUID=%s", Get16toBytes(u)))
|
||
def GetTaskUserInFo(u, UserUUID):
|
||
return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Answer", WHERE=("TaskUUID=%s AND UserUUID=%s", (Get16toBytes(u), Get16toBytes(UserUUID))), _limit=1)[0]
|
||
def GetTasksByOne(UserUUID):
|
||
return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Tasks", WHERE=("TaskPublisher=%s", Get16toBytes(UserUUID)))
|
||
def GetTasksNeedDo(UserUUID):
|
||
return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Answer", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)))
|
||
|
||
#占用额外资源,可以给删了
|
||
def GetTaskAlowDev(TaskUUID, UserUUID):
|
||
return UserUUID == GetBytesto16(GetTaskInFo(TaskUUID)["TaskPublisher"]) or SubIsIn(UserUUID, GetBytesto16(GetTaskInFo(TaskUUID)["TaskPublisher"]))
|
||
|
||
def SubIsInOrIs(ParentUUID, SubUserUUID):
|
||
return ParentUUID == SubUserUUID or SubIsIn(ParentUUID, SubUserUUID)
|
||
|
||
|
||
|
||
def SearchParent(UUID: str, SMTM):
|
||
if not UUID or not SMTM:return False
|
||
for i in SMTM:
|
||
if "UserParent" in i and "UserUUID" in i and i["UserUUID"] == UUID: return i["UserParent"]
|
||
return False
|
||
|
||
def SubIsIn(ParentUUID,SubUserUUID):
|
||
s=0
|
||
ASMTM=GetSMTM()
|
||
while True:
|
||
if (SubUserUUID:=SearchParent(SubUserUUID, ASMTM)) == ParentUUID: return True
|
||
if SubUserUUID == "0"*32: return False
|
||
if s == 500: return False
|
||
s+=1
|
||
|
||
def SearchAndDelChildRen(Member: list, LDI: str):
|
||
indices = [int(index) for index in LDI.split("-")]
|
||
current_list = Member
|
||
for index in indices[:-1]:
|
||
current_list = current_list[index]["Member"]
|
||
del current_list[indices[-1]]
|
||
return current_list
|
||
|
||
def Str2Sex(c):
|
||
if c == -1: return "未更改"
|
||
elif c == 1: return "男"
|
||
elif c == 0: return "女"
|
||
else: return "错误"
|
||
|
||
def PersonnelTemplate(UUID, MEMB, SmtmUser):
|
||
res={}
|
||
c=next((item for item in SmtmUser if GetBytesto16(item["UserUUID"]) == UUID), None)
|
||
#c=ReadUserConfig(UUID)
|
||
res["name"]=c["UserName"]
|
||
res["UserJobNumber"]=GetBytesto16(c["UserJobNumber"]) if c["UserJobNumber"] else "未启用工号"
|
||
res["UserRealName"]=c["UserRealName"]
|
||
res["UserSex"]=Str2Sex(c["UserSex"])
|
||
res["UserUUID"]=GetBytesto16(c["UserUUID"])
|
||
res["UserHeadPng"]="https://ugm.gvsds.com/GetArgsUserHeadPng.api?UserUUID="+res["UserUUID"]
|
||
res["UserPermissions"]=c["UserPermissions"]
|
||
res["UserPermissionstr"]=PermissionsToStrPermissions(c["UserPermissions"])
|
||
res["UserJob"]=c["UserJob"]
|
||
res["UserLastCheckInDate"]=c["UserLastCheckInDate"].strftime("%Y-%m-%d %H:%M:%S") if c["UserLastCheckInDate"] else "从未签到"
|
||
if c["UserPositionStatus"] == 1: res["UserPositionStatus"]="在职"
|
||
elif c["UserPositionStatus"] == 0: res["UserPositionStatus"]="停职"
|
||
elif c["UserPositionStatus"] == 2: res["UserPositionStatus"]="在职合作"
|
||
elif c["UserPositionStatus"] == 3: res["UserPositionStatus"]="停职合作"
|
||
else: res["UserPositionStatus"]="未知代码"
|
||
if "Member" in MEMB and MEMB["Member"] != {}:
|
||
res["type"]=4
|
||
res["children"]=[]
|
||
for i in MEMB["Member"]:
|
||
res["children"].append(PersonnelTemplate(i, MEMB["Member"][i], SmtmUser))
|
||
res["isParent"]=True
|
||
else:
|
||
res["type"]=6
|
||
res["children"]=[]
|
||
res["isParent"]=False
|
||
return res
|
||
|
||
class _i18n:
|
||
def __init__(self): pass
|
||
#def __getattribute__(self, name): pass
|
||
def __t(self, args1, *args2): return f"{", ".join(args1+args2)}" # TempLateMore
|
||
def illegal(self, *args): return "%s 违法" % self.__t(args)
|
||
def DataError(self, Name, Type): return "%s 应当为 %s 类型" % (Name, Type)
|
||
#User
|
||
def NoUser(self, *args): return "%s 用户不存在" % self.__t(args)
|
||
def NoIn(self, ParentUser, SubUser): return "%s 不受 %s 管理" % (ParentUser, SubUser)
|
||
def NoPower(self, Permission): return "无 %s 操作权限" % Permission
|
||
# Task
|
||
def NoTask(self, *args): return "%s 任务不存在" % self.__t(args)
|
||
def NoAnswer(self, *args): return "%s 成员任务回答不存在" % self.__t(args)
|
||
# PersonPage
|
||
YouNeverRegisterPersonalPage="你没有注册过个人主页,填写并提交表单以应用"
|
||
# Other
|
||
def NoParameter(self, *args): return "%s 参数不存在" % self.__t(args)
|
||
def NoUUID(self, Name): return "%s 不符合 UUID 格式" % Name
|
||
def Abnormal(self, *args): return "%s 异常" % self.__t(args)
|
||
def NoFound(self, *args): return "%s 不存在" % self.__t(args)
|
||
def NotLegalChar(self, Name): return "%s 含有禁止字符" % Name
|
||
def TooBigMsg(self, Name, Max): return "%s 过大,理应不超过 %s" % (Name, Max)
|
||
def BeMostValue(self, Name): return "%s 为必填项" % Name
|
||
def NotAZ09(self, Name): return "%s 只允许大写字母、数字和下划线" % Name
|
||
def Notaz09(self, Name): return "%s 只允许小写字母、数字和下划线" % Name
|
||
def NotAZaz09(self, Name): return "%s 只允许字母、数字和下划线" % Name
|
||
def AgainstSystem(self, Name): return "%s 占用系统资源" % Name
|
||
def Repeat(self, Name): return "%s 重复" % Name
|
||
CodeError="状态码异常"
|
||
AddSuccess="添加成功"
|
||
AddError="添加失败"
|
||
DelSuccess="删除成功"
|
||
DelError="删除失败"
|
||
OperateSuccess="操作成功"
|
||
OperateError="操作失败"
|
||
RegisterSuccess="注册成功"
|
||
RegisterError="注册失败"
|
||
ChangeSuccess="修改成功"
|
||
ChangeError="修改失败"
|
||
AdminMode="管理模式"
|
||
NoTime="无时间"
|
||
ModeError="模式错误"
|
||
Yes="是"
|
||
No="否"
|
||
GetError="数据取值异常"
|
||
NoPermission="无权限"
|
||
TooBig="数据过大"
|
||
AlreadyExist="已存在"
|
||
NotExist="不存在"
|
||
Cancelled="已注销"
|
||
# Task
|
||
ThisTaskNotBelongToYou="你无需做这个任务,这个任务不属于你"
|
||
YouVeSubmitted="你已提交该任务"
|
||
YouDontHavePermissionToperate="你无权操作该任务"
|
||
YouDontHavaPermissionToSeeit="你无权查看"
|
||
TaskTimeOut="任务已超时"
|
||
TaskAlreadyExist="任务已存在"
|
||
TimeAbnormal="时间戳异常"
|
||
TimeBeMostOver2Hour="任务时间必须大于2小时"
|
||
# Score
|
||
InitialAssessmentScore="初始考核分"
|
||
LWSIAWU="上上周签到考核不合格"#Last week, the sign-in assessment was unqualified
|
||
LWSAF="上周签到考核不合格"#Last week's sign-in assessment failed
|
||
# CheckIn
|
||
CheckInError="签到失败!CSRF无效,也许您应该刷新网页!"
|
||
AlreadyCheckIn="您已签到"
|
||
i18n=_i18n()
|
||
|
||
"""
|
||
API统一管理
|
||
|
||
验证所有参数是否为None
|
||
验证所有参数是否达到最基本的合法(UUID)
|
||
验证所有参数是否合法
|
||
做好SMTM继承保护
|
||
_limit=1必要条件
|
||
if not _ 必要条件才能执行取0
|
||
if None:赋值直接在get里写
|
||
|
||
执行
|
||
返回
|
||
"""
|
||
|
||
|
||
#给删了
|
||
def HightLight(l, s=" "):
|
||
return s.join(list(map(lambda x: '<span class="layui-btn layui-btn-normal layui-btn-mini">%s</span>' % x, l)))
|
||
|
||
#给删了
|
||
def GetUserPositionStatusStr(UserPositionStatus):
|
||
if UserPositionStatus == 1: return "<span class=\"layui-btn layui-btn-normal layui-btn-mini\">在职</span>"
|
||
else: return "<span class=\"layui-btn layui-btn-danger layui-btn-mini layui-btn-disabled\">停职</span>"
|
||
|
||
|
||
@Manage.route("/")
|
||
def ManageIndex():
|
||
UserConfig=GetELTUserConfig()
|
||
return flask.render_template("/Manage/index.html",
|
||
UserName=StrMinus(UserConfig["UserName"], 15),
|
||
UserPersonalSignature=StrMinus(UserConfig["UserPersonalSignature"], 15),
|
||
UserEmail=StrMinus(UserConfig["UserEmail"], 15),
|
||
UserPermissions=float(UserConfig["UserPermissions"]),
|
||
UserJob=UserConfig["UserJob"],
|
||
UserBook=False if flask.request.args.get("UserBook") else True)
|
||
|
||
@Manage.route("/index.html")
|
||
def MainIndexHtml():
|
||
return flask.redirect(flask.url_for("Manage.ManageIndex"))
|
||
|
||
@Manage.route("/User/ChangePasswd.html")
|
||
def UserChangePasswd():
|
||
return flask.render_template("/Manage/User/ChangePasswd.html")
|
||
|
||
@Manage.route("/API/UserHeadCard.api")
|
||
def UserHeadCard():
|
||
UserConfig=GetELTUserConfig()
|
||
return {"UserHeadCard_UserName": StrMinus(UserConfig["UserName"], 15),
|
||
"UserHeadCard_UserPersonalSignature": StrMinus(UserConfig["UserPersonalSignature"], 15),
|
||
"UserHeadCard_UserEmail": StrMinus(UserConfig["UserEmail"], 15)}
|
||
|
||
@Manage.route("/API/IdCard.api")
|
||
@PreRequirements(1.0)
|
||
def UserIdCard():
|
||
UserConfig=GetELTUserConfig()
|
||
return {"UserName": UserConfig["UserName"],
|
||
"UserRealName": UserConfig["UserRealName"],
|
||
"UserUUID": GetBytesto16(UserConfig["UserUUID"]),
|
||
"UserPermissions": float(UserConfig["UserPermissions"]),
|
||
"UserStrPermissions": PermissionsToStrPermissions(float(UserConfig["UserPermissions"])),
|
||
"UserJob": UserConfig["UserJob"],
|
||
"UserPosition": UserConfig["UserPositionStatus"]}
|
||
|
||
@Manage.route("/API/SubMemIdCard.api")
|
||
@PreRequirements(1.0, mod=[PRMODS.OVERPERMISSION], c="ag/UserUUID")
|
||
def UserSubMemIdCardAPI():
|
||
UserUUID=flask.request.args.get("UserUUID")
|
||
if not Is_User(UserUUID): return {"code":1,"msg":"NOT USER"}
|
||
UserConfig=ReadUserConfig(UserUUID)
|
||
return {"code":0,
|
||
"UserName": GetUUIDUser(UserUUID),
|
||
"UserRealName": UserConfig["UserRealName"],
|
||
"UserSex": Str2Sex(UserConfig["UserSex"]),
|
||
"UserUUID": UserUUID,
|
||
"UserPermissions": UserConfig["UserPermissions"],
|
||
"UserStrPermissions": PermissionsToStrPermissions(UserConfig["UserPermissions"]),
|
||
"UserJob": UserConfig["UserJob"],
|
||
"UserPosition": UserConfig["UserPositionStatus"]}
|
||
|
||
@Manage.route("/API/GetSubMem.api")
|
||
@PreRequirements(2.0)
|
||
def UserGetSubMemApi():
|
||
SMTM=GetSMTM()
|
||
User=SearchFutureGenerations(GetELTUserUUID(), SMTM)
|
||
SmtmUser=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="UserSub", WHERE=("UserPermissions>=2.0"))
|
||
if User == False: User={"Member":[]}
|
||
data=[]
|
||
for i in (Member:=User[SearchChilds("0"*32, SMTM)[0]]["Member"]):
|
||
data.append(PersonnelTemplate(i, Member[i], SmtmUser))
|
||
return flask.jsonify({"code":0, "count":1000, "data":data})
|
||
|
||
@Manage.route("/API/SetPositionStatus.api", methods=["POST"])
|
||
@PreRequirements(1.0)
|
||
def UserRePositionStatus():
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
Code=flask.request.form.get("Code")
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if Code not in ["1","0"]: return {"code":1,"msg":i18n.CodeError}
|
||
if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser("UserUUID")}
|
||
if not SubIsIn(GetELTUserUUID(), UserUUID): return {"code":1,"msg":i18n.NoIn("ELTUserUUID", "UserUUID")}
|
||
WriteUserConfigI(UserUUID, "UserPositionStatus", Code)
|
||
return {"code":0,"msg":i18n.AddSuccess}
|
||
|
||
@Manage.route("/API/AddChildRen.api", methods=["POST"])
|
||
def UserAddChildRen():
|
||
ELTUserUUID=GetELTUserUUID()
|
||
SubUserUUID=flask.request.form.get("SubUserUUID")
|
||
ParentUserUUID=flask.request.form.get("ParentUserUUID", ELTUserUUID)
|
||
if not Is_UUID(SubUserUUID): return {"code":1,"msg":i18n.NoUUID("SubUserUUID")}
|
||
if not Is_UUID(ParentUserUUID): return {"code":1,"msg":i18n.NoUUID("ParentUserUUID")}
|
||
if not Is_User(SubUserUUID): return {"code":1,"msg":i18n.NoUser("SubUserUUID")}
|
||
if not Is_User(ParentUserUUID): return {"code":1,"msg":i18n.NoUser("ParentUserUUID")}
|
||
# if not SubIsIn(ELTUserUUID, SubUserUUID): return {"code":1,"msg":i18n.NoIn("ELTUserUUID", "SubUserUUID")}
|
||
# if not SubIsInOrIs(ELTUserUUID, ParentUserUUID): return {"code":1,"msg":i18n.NoIn("ELTUserUUID", "ParentUserUUID")}
|
||
if GetELTUserPermissions() < 4.0: return {"code":1,"msg":i18n.NoPower(4.0)}
|
||
SQLUsers.delete("SMTM", WHERE=("UserUUID=%s", Get16toBytes(SubUserUUID)))
|
||
SQLUsers.insert("SMTM", UserUUID=Get16toBytes(SubUserUUID), UserParent=Get16toBytes(ParentUserUUID))
|
||
return {"code":0,"msg":i18n.AddSuccess}
|
||
|
||
|
||
@Manage.route("/Post/SubMemberManagementDelete.api", methods=["POST"])
|
||
@PreRequirements(2.0)
|
||
def UserSubMemberManagementDeleteApi():# 调试!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
#LDI=flask.request.form.get("LAY_DATA_INDEX")
|
||
#_=GetSMTM()
|
||
#_["Member"]=SearchAndDelChildRen(Search(GetSMTM()["Member"],GetELTUserUUID())["Member"],LDI)
|
||
#print(_)
|
||
return "1"
|
||
|
||
|
||
@Manage.route("/Takes/TaskFinish.html")
|
||
@PreRequirements(1.0)
|
||
def UserTaskFinish():
|
||
if Is_Task((TaskUUID:=flask.request.args.get("TaskUUID"))): return flask.render_template("/Manage/TaskFinish.html",TaskName=GetTaskInFo(TaskUUID)["TaskName"],TaskUUID=TaskUUID)
|
||
flask.abort(404)
|
||
|
||
@Manage.route("/Tasks/TaskToDo.html")
|
||
@PreRequirements(1.0)
|
||
def UserTaskToDo():
|
||
TaskUUID=flask.request.args.get("TaskUUID")
|
||
if TaskUUID==None:
|
||
return "Error: TaskUUID Is None"
|
||
if not Is_Task(TaskUUID):
|
||
return "Error: UUID NOT IN TASKS"
|
||
TaskInFo=GetTaskInFo(TaskUUID)
|
||
TaskAnswerInFo=None
|
||
TaskEndTime = TaskInFo["TaskEndTime"]
|
||
TaskAnswerList=-1
|
||
if (int(TaskEndTime.timestamp()) - time.time()) <= 0: ReLoad=0
|
||
else: ReLoad=1
|
||
if Is_UserInTask(TaskUUID, GetELTUserUUID()):
|
||
TaskAnswerInFo=GetTaskAnswerInFo(TaskUUID, GetELTUserUUID())
|
||
if GetTaskUserInFo(TaskUUID, GetELTUserUUID())["UserDo"] == 1:
|
||
if flask.request.args.get("detailed"): TaskDo=3
|
||
else: return flask.redirect(f"/Tasks/TaskFinish.html?TaskUUID={TaskUUID}&TaskName={TaskInFo["TaskName"]}")
|
||
else:
|
||
TaskDo=1
|
||
TaskAnswerList=TaskInFo["TaskAnswer"]
|
||
else:
|
||
if GetTaskAlowDev(TaskUUID, GetELTUserUUID()): TaskDo=0
|
||
else: flask.abort(503)
|
||
return flask.render_template("/Manage/Tasks/TaskToDo.html",
|
||
TaskName=TaskInFo["TaskName"],
|
||
TaskPublisher=GetUUIDUser(GetBytesto16(TaskInFo["TaskPublisher"])),
|
||
TaskUUID=TaskUUID,
|
||
TaskStartTime=TaskInFo["TaskStartTime"],
|
||
TaskEndTime=TaskInFo["TaskEndTime"],
|
||
TaskAddTime=i18n.AdminMode if not TaskAnswerInFo else (i18n.NoTime if not TaskAnswerInFo["TaskAddTime"] else TaskAnswerInFo["TaskAddTime"].strftime("%Y-%m-%d %H:%M:%S")),
|
||
TaskFinishTime=i18n.AdminMode if not TaskAnswerInFo else (i18n.NoTime if not TaskAnswerInFo["TaskFinishTime"] else TaskAnswerInFo["TaskFinishTime"].strftime("%Y-%m-%d %H:%M:%S")),
|
||
TaskCCGOID=TaskInFo["TaskCCGOID"],
|
||
TaskNeed=TaskInFo["TaskNeed"].replace(r"\n","<br>"),
|
||
TaskOther=TaskInFo["TaskOther"].replace(r"\n","<br>"),
|
||
CountYear=TaskEndTime.year,
|
||
CountMonth=TaskEndTime.month,
|
||
CountDay=TaskEndTime.day,
|
||
CountHour=TaskEndTime.hour,
|
||
CountMinute=TaskEndTime.minute,
|
||
CountSecond=TaskEndTime.second,
|
||
ReLoad=ReLoad,
|
||
TaskDo=TaskDo,
|
||
TaskAnswerList=TaskAnswerList,
|
||
TaskType=LISTTOTASKTYPE(TaskInFo["TaskType"]),
|
||
TaskAnswer=LISTTOTASKANSWER(TaskInFo["TaskAnswer"]))
|
||
|
||
|
||
@Manage.route("/API/UserTaskSubmit.api", methods=["POST"])
|
||
@PreRequirements(1.0)
|
||
def UserTaskSubmit():
|
||
TaskUUID=flask.request.form.get("TaskUUID")
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
if not UserUUID: UserUUID = GetELTUserUUID()
|
||
File=flask.request.files.get("File")
|
||
LongInFo=flask.request.form.get("LongInFo")
|
||
ShortInFo=flask.request.form.get("ShortInFo")
|
||
LinkInFo=flask.request.form.get("LinkInFo")
|
||
if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")}
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not Is_Task(TaskUUID): return i18n.NoTask(TaskUUID)
|
||
if not Is_UserInTask(TaskUUID, UserUUID): return {"code":1,"msg":i18n.ThisTaskNotBelongToYou}
|
||
TaskInFo=GetTaskInFo(TaskUUID)
|
||
if GetTaskUserInFo(TaskUUID, UserUUID)["UserDo"] == 1: return {"code":1,"msg":i18n.YouVeSubmitted}
|
||
if not TaskInFo["TaskEndTime"].timestamp() >= time.time(): return {"code":1,"msg":i18n.TaskTimeOut}
|
||
UserAnswer={"UserUpLoadFileName":"","UserUpLoadFile":"","UserLong":"","UserShort":"","UserDo":0,"UserPass":0,"TaskFinishTime":TimeFormatStr("%Y-%m-%d %H:%M:%S")}
|
||
#File ReName is System for it 's UUID
|
||
for i in TaskInFo["TaskAnswer"]:
|
||
if i == 1:
|
||
#if not File.content_length >= 1024*1024*1024:
|
||
# return f"文件或过小过大,无法上传,请重新打开页面后重试,File.content_length: {File.content_length}"
|
||
UserAnswer["UserUpLoadFileName"]=File.filename
|
||
UserAnswer["UserUpLoadFile"]=NSQL.Func.insertbytes(File.stream.read())
|
||
if i == 2:
|
||
UserAnswer["UserLong"]=LongInFo
|
||
if i == 3:
|
||
UserAnswer["UserShort"]=ShortInFo
|
||
if i == 4:
|
||
UserAnswer["UserLink"]=LinkInFo
|
||
UserAnswer["UserDo"]=1
|
||
SQLTasks.update(**UserAnswer,
|
||
WHERE=("TaskUUID=%s AND UserUUID=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID))),
|
||
FROM="Answer"
|
||
)
|
||
resp = flask.redirect(f"/Tasks/TaskFinish.html?TaskUUID={TaskUUID}")
|
||
return resp
|
||
|
||
|
||
@Manage.route("/API/TaskUpload.api", methods=["POST"])
|
||
@PreRequirements(2.0)
|
||
def UserUpTask():
|
||
TaskName=flask.request.form.get("TaskName")
|
||
TaskEndTime=flask.request.form.get("TaskEndTime")
|
||
TaskCCGOID=flask.request.form.get("TaskCCGOID")
|
||
TaskNeed=flask.request.form.get("TaskNeed")
|
||
TaskManual=flask.request.form.get("TaskManual")
|
||
TaskShop=flask.request.form.get("TaskShop")
|
||
TaskOther=flask.request.form.get("TaskOther")
|
||
try:time.mktime(time.strptime(TaskEndTime, "%Y-%m-%d %H:%M:%S"))
|
||
except:return {"code": 1, "msg": i18n.TimeAbnormal}
|
||
#if (int(TaskEndTime) - time.time()) < 7200:
|
||
# return {"code":1,"msg":i18n.TimeBeMostOver2Hour}
|
||
TaskType=[]
|
||
TaskAnswer=[]
|
||
for i in range(1,20+1):
|
||
if flask.request.form.get(f"TaskType[{i}]") != None:
|
||
TaskType.append(i)
|
||
for i in range(1,5+1):
|
||
if flask.request.form.get(f"TaskAnswer[{i}]") != None:
|
||
TaskAnswer.append(i)
|
||
SQLTasks.insert("Tasks",
|
||
TaskUUID=Get16toBytes(NewUUID()),
|
||
TaskName=TaskName,
|
||
TaskPublisher=Get16toBytes(GetELTUserUUID()),
|
||
TaskStartTime=TimeFormatStr("%Y-%m-%d %H:%M:%S"),
|
||
TaskEndTime=TaskEndTime,
|
||
TaskType="%s" % TaskType,
|
||
TaskAnswer="%s" % TaskAnswer,
|
||
TaskCCGOID=TaskCCGOID,
|
||
TaskNeed=TaskNeed,
|
||
TaskOther=TaskOther,
|
||
TaskManual=bool(TaskManual),
|
||
TaskShop=bool(TaskShop),
|
||
)
|
||
return {"code": 0}
|
||
|
||
|
||
@Manage.route("/API/UserTaskAdd.api", methods=["POST"])
|
||
@PreRequirements(1.0)
|
||
def UserAddTask():
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
TaskUUID=flask.request.form.get("TaskUUID")
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not TaskUUID: return {"code":1,"msg":i18n.NoParameter("TaskUUID")}
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")}
|
||
if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)}
|
||
if not GetTaskAlowDev(TaskUUID, GetELTUserUUID()): return {"code":1,"msg":i18n.YouDontHavePermissionToperate}
|
||
if Is_UserInTask(TaskUUID, UserUUID): return {"code":1,"msg":i18n.TaskAlreadyExist}
|
||
SQLTasks.insert("Answer",
|
||
UserUUID=Get16toBytes(UserUUID),
|
||
TaskUUID=Get16toBytes(TaskUUID),
|
||
TaskAddTime=TimeFormatStr("%Y-%m-%d %H:%M:%S"),
|
||
UserDo=0,
|
||
UserPass=0
|
||
)
|
||
return {"code":0,"msg":i18n.AddSuccess}
|
||
|
||
@Manage.route("/API/GetMakeTasks.api")
|
||
@PreRequirements(1.0)
|
||
def UserGetMakeTasks():
|
||
ELTUserUUID=GetELTUserUUID()
|
||
UserUUID=flask.request.args.get("UserUUID", ELTUserUUID)
|
||
TasksReturn=[]
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not SubIsInOrIs(ELTUserUUID, UserUUID): return {"code":1,"count":1000,"data":i18n.YouDontHavaPermissionToSeeit}
|
||
for i in GetTasksByOne(GetELTUserUUID()):
|
||
TasksReturn.append(
|
||
{"TaskUUID":GetBytesto16(i["TaskUUID"]),
|
||
"TaskPublisher":GetBytesto16(i["TaskPublisher"]),
|
||
"TaskName":i["TaskName"],
|
||
"TaskEndTime":i["TaskEndTime"].strftime("%Y-%m-%d %H:%M:%S"),
|
||
"TaskType":LISTTOTASKTYPE(i["TaskType"]),
|
||
"TaskAnswer":LISTTOTASKANSWER(i["TaskAnswer"]),
|
||
"TaskCCGOID":i["TaskCCGOID"],
|
||
"TaskNeed":i["TaskNeed"],
|
||
"TaskOther":i["TaskOther"],
|
||
"TaskManual":i18n.Yes if i["TaskManual"] else i18n.No,
|
||
"TaskShop":i18n.Yes if i["TaskShop"] else i18n.No})
|
||
return {"code":0,"count":1000,"data":TasksReturn}
|
||
|
||
@Manage.route("/API/GetTasks.api")
|
||
@PreRequirements(1.0)
|
||
def UserGetTasks():
|
||
ELTUserUUID=GetELTUserUUID()
|
||
UserUUID=flask.request.args.get("UserUUID", ELTUserUUID)
|
||
TaskMod =flask.request.args.get("TaskMod", "0")
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if TaskMod not in ["1", 0]: return {"code":1,"msg":i18n.ModeError}
|
||
if not SubIsInOrIs(GetELTUserUUID(), UserUUID): return {"code":1,"count":1000,"data":i18n.YouDontHavaPermissionToSeeit}
|
||
TasksReturn=[]
|
||
for i in GetTasksNeedDo(UserUUID):
|
||
TaskUUID=GetBytesto16(i["TaskUUID"])
|
||
TaskInFo=GetTaskInFo(TaskUUID)
|
||
TaskAnswerInFo=GetTaskAnswerInFo(TaskUUID, UserUUID)
|
||
if i["UserDo"] != (0 if TaskMod == "0" else 1): continue
|
||
TasksReturn.append({"TaskUUID": TaskUUID,
|
||
"TaskPublisher": GetUUIDUser(GetBytesto16(TaskInFo["TaskPublisher"])),
|
||
"TaskName": TaskInFo["TaskName"],
|
||
"TaskDo": i["UserDo"],
|
||
"TaskPass": i["UserPass"],
|
||
"TaskStartTime": TaskInFo["TaskStartTime"].strftime("%Y-%m-%d %H:%M:%S"),
|
||
"TaskEndTime": TaskInFo["TaskEndTime"].strftime("%Y-%m-%d %H:%M:%S"),
|
||
"TaskAddTime": "未完成" if not TaskAnswerInFo["TaskAddTime"] else TaskAnswerInFo["TaskAddTime"].strftime("%Y-%m-%d %H:%M:%S"),
|
||
"TaskFinishTime": "未完成" if not TaskAnswerInFo["TaskFinishTime"] else TaskAnswerInFo["TaskFinishTime"].strftime("%Y-%m-%d %H:%M:%S"),
|
||
"TaskType": LISTTOTASKTYPE(TaskInFo["TaskType"]),
|
||
"TaskAnswer": LISTTOTASKANSWER(TaskInFo["TaskAnswer"]),
|
||
"TaskCCGOID": TaskInFo["TaskCCGOID"]})
|
||
return {"code":0,"count":1000,"data":TasksReturn}
|
||
|
||
@Manage.route("/API/GetTasksDevReceiver.api")
|
||
@PreRequirements(1.0)
|
||
def UserGetTasksDevReceiver():
|
||
TaskUUID=flask.request.args.get("TaskUUID")
|
||
if not TaskUUID: return {"code":0,"count":1000,"data":i18n.NoParameter("TaskUUID")}
|
||
if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")}
|
||
if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)}
|
||
TaskInFo=GetTaskInFo(TaskUUID)
|
||
TaskPublisher=GetBytesto16(TaskInFo["TaskPublisher"])
|
||
if not GetELTUserUUID() == TaskPublisher and not SubIsIn(GetELTUserUUID(), TaskPublisher): return {"code":0,"count":1000,"data":i18n.YouDontHavePermissionToperate}
|
||
if not GetTaskAlowDev(TaskUUID, GetELTUserUUID()): return {"code":1,"msg":i18n.YouDontHavePermissionToperate}
|
||
s=[]
|
||
for i in GetTaskUsers(TaskUUID):
|
||
s.append(
|
||
{"ReceiverUUID": GetBytesto16(i["UserUUID"]),
|
||
"ReceiverName": GetUUIDUser(GetBytesto16(i["UserUUID"])),
|
||
"ReceiverFinishFlan": i["UserDo"],
|
||
"PublisherFinishFlan": i["UserPass"],
|
||
"ReceiverFile": i["UserUpLoadFileName"]
|
||
})
|
||
return {"code":0,"count":1000,"data":s}
|
||
|
||
|
||
@Manage.route("/API/TasksDevPass.api", methods=["POST"])
|
||
@PreRequirements(1.0)
|
||
def UserTasksDevPass():
|
||
TaskUUID=flask.request.form.get("TaskUUID")
|
||
PassMod=flask.request.form.get("PassMod")
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
if not TaskUUID: return {"code":1,"msg":i18n.NoParameter("TaskUUID")}
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")}
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)}
|
||
if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)}
|
||
if PassMod not in ["1", "0", "-1"]: return {"code":1,"msg":i18n.ModeError}
|
||
if not GetTaskAlowDev(TaskUUID, GetELTUserUUID()): return {"code":1,"msg":i18n.YouDontHavaPermissionToSeeit}
|
||
SQLTasks.update(UserPass=int(PassMod), WHERE=("TaskUUID=%s AND UserUUID=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID))), FROM="Answer")
|
||
return {"code":0,"msg":i18n.OperateSuccess}
|
||
|
||
@Manage.route("/API/UserTasksDelete.api", methods=["POST"])
|
||
@PreRequirements(1.0)
|
||
def UserGroupTasksDelete():
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
TaskUUID=flask.request.form.get("TaskUUID")
|
||
PassMod=flask.request.form.get("PassMod")
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not TaskUUID: return {"code":1,"msg":i18n.NoParameter("TaskUUID")}
|
||
if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")}
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)}
|
||
if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)}
|
||
if PassMod not in ["Task", "TaskFinish"]: return {"code":1,"msg":i18n.ModeError}
|
||
PassMod="0" if PassMod == "Task" else "1"
|
||
if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)}
|
||
if not GetTaskAlowDev(TaskUUID, GetELTUserUUID()): return {"code":1,"msg":i18n.YouDontHavePermissionToperate}
|
||
if not SQLTasks.istrue("Answer", WHERE=("TaskUUID=%s AND UserUUID=%s AND UserDo=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID), PassMod))): return {"code":1,"msg":i18n.NoAnswer(TaskUUID)}
|
||
SQLTasks.delete("Answer", WHERE=("TaskUUID=%s AND UserUUID=%s AND UserDo=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID), PassMod)))
|
||
return {"code":0,"msg":i18n.OperateSuccess}
|
||
|
||
|
||
@Manage.route("/API/TasksDelete.api", methods=["POST"])
|
||
@PreRequirements(1.0)
|
||
def UserTasksDelete():
|
||
TaskUUID=flask.request.form.get("TaskUUID")
|
||
ELTUserUUID=GetELTUserUUID()
|
||
if not TaskUUID: return {"code":1,"data":i18n.NoParameter("TaskUUID")}
|
||
if not Is_UUID(TaskUUID): return {"code":1,"data":i18n.NoUUID("TaskUUID")}
|
||
if not Is_Task(TaskUUID): return {"code":1,"data":i18n.NoTask(TaskUUID)}
|
||
if not GetTaskAlowDev(TaskUUID, ELTUserUUID): return {"code":1,"msg":i18n.YouDontHavePermissionToperate}
|
||
SQLTasks.delete("Tasks", WHERE=("TaskUUID=%s", Get16toBytes(TaskUUID)))
|
||
SQLTasks.delete("Answer", WHERE=("TaskUUID=%s", Get16toBytes(TaskUUID)))
|
||
return {"code":0,"msg":i18n.OperateSuccess}
|
||
|
||
|
||
@Manage.route("/API/TalentPlanSubCard.api")
|
||
@PreRequirements(4.0)
|
||
def TalentPlanSubCardAPI():
|
||
UserUUID=str(flask.request.args.get("UserUUID"))
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
_=SQLPlans.selectashead(NSQL.MOD.ALL, FROM="TalentPlan", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)), _limit=1)
|
||
if not _: return {"code":1,"msg":i18n.GetError}
|
||
_=_[0]
|
||
return {"UserName": _["UserName"],
|
||
"UserUUID": UserUUID,
|
||
"UserEcho": _["UserEcho"],
|
||
"Other": _["Other"],
|
||
"UserWork": _["UserWork"],
|
||
"UserWillWork": _["UserWillWork"],
|
||
"UserBornTime": str(_["UserBornTime"]),
|
||
"UserIDCard": _["UserIDCard"],
|
||
"UserBilibili": _["UserBilibili"],
|
||
"UserTikTok": _["UserTikTok"],
|
||
"UserTel": _["UserTel"],
|
||
"UserKuaiShou": _["UserKuaiShou"],
|
||
"UserWX": _["UserWX"]}
|
||
|
||
@Manage.route("/API/TalentPlan.api")
|
||
@PreRequirements(4.0)
|
||
def UserTalentPlanApi():
|
||
Label=[]
|
||
for i in SQLPlans.selectashead(NSQL.MOD.ALL, FROM="TalentPlan"):
|
||
i["UserUUID"]=GetBytesto16(i["UserUUID"])
|
||
i["UserWork"]=HightLight(i["UserWork"])
|
||
i["UserWillWork"]=HightLight(i["UserWillWork"])
|
||
Label.append(i)
|
||
return {"code":0,"count":1000,"data":Label}
|
||
|
||
@Manage.route("/API/TalentPlanEcho.api")
|
||
def UserTalentPlanEchoApi():
|
||
Label=[]
|
||
for i in SQLPlans.selectashead(NSQL.MOD.ALL, FROM="TalentPlan"):
|
||
if i["UserEcho"] == "on":
|
||
i["UserUUID"]=GetBytesto16(i["UserUUID"])
|
||
i["UserBornTime"]="xxx"
|
||
i["UserIDCard"]="xxx"
|
||
i["UserWX"]="xxx"
|
||
i["UserTel"]="xxx"
|
||
i["UserWork"]=HightLight(i["UserWork"])
|
||
i["UserWillWork"]=HightLight(i["UserWillWork"])
|
||
Label.append(i)
|
||
return {"code":0,"count":1000,"data":Label}
|
||
|
||
@Manage.route("/API/TalentPlanUpSub.api", methods=["POST"])
|
||
@PreRequirements(4.0)
|
||
def UserTalentPlanUpSub():
|
||
_=flask.request.form.to_dict()
|
||
try:time.mktime(time.strptime(_["UserBornTime"], "%Y-%m-%d %H:%M:%S"))
|
||
except:return {"code":1,"msg":i18n.TimeAbnormal}
|
||
if not isinstance(ast.literal_eval(_["UserWork"]), list): return {"code":1,"msg":i18n.DataError("UserWork", "List")}
|
||
if not isinstance(ast.literal_eval(_["UserWillWork"]), list): return {"code":1,"msg":i18n.DataError("UserWillWork", "List")}
|
||
SQLPlans.insert("TalentPlan",
|
||
UserName=_["UserName"],
|
||
UserUUID=Get16toBytes(NewUUID()),
|
||
UserEcho=_["UserEcho"],
|
||
UserWork=_["UserWork"],
|
||
UserWillWork=_["UserWillWork"],
|
||
UserBornTime=_["UserBornTime"],
|
||
UserIDCard=_["UserIDCard"],
|
||
UserBilibili=_["UserBilibili"],
|
||
UserTikTok=_["UserTikTok"],
|
||
UserKuaiShou=_["UserKuaiShou"],
|
||
UserTel=_["UserTel"],
|
||
UserWX=_["UserWX"],
|
||
Other=_["Other"])
|
||
return {"code":0,"msg":i18n.OperateSuccess}
|
||
|
||
@Manage.route("/API/TalentPlanDelSub.api", methods=["POST"])
|
||
@PreRequirements(4.0)
|
||
def UserTalentPlanDelSub():
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)}
|
||
if SQLPlans.istrue("TalentPlan", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))):
|
||
SQLPlans.delete("TalentPlan", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)))
|
||
return {"code":0,"msg":i18n.OperateSuccess}
|
||
else:
|
||
return {"code":0,"msg":i18n.OperateError}
|
||
|
||
|
||
|
||
|
||
|
||
@Manage.route("/API/GetArchives.api")
|
||
@PreRequirements(2.0)
|
||
def UserGetArchives():
|
||
UserUUID=flask.request.args.get("UserUUID", GetELTUserUUID())
|
||
if not UserUUID: return {"code":1,"count":1000,"data":i18n.NoParameter("UserUUID")}
|
||
if not Is_UUID(UserUUID): return {"code":0,"count":1000,"data":i18n.NoUUID("UserUUID")}
|
||
if not Is_User(UserUUID): return {"code":0,"count":1000,"data":i18n.NoUser(UserUUID)}
|
||
if not SubIsInOrIs(GetELTUserUUID(), UserUUID): return {"code":0,"count":1000,"data":i18n.NoPermission}
|
||
if not (Archives:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="archives", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)))): return {"code":0,"count":1000,"data":[]}
|
||
_=[]
|
||
for i in Archives:
|
||
i["UserUUID"]=GetBytesto16(i["UserUUID"])
|
||
i["ArchivesUUID"]=GetBytesto16(i["ArchivesUUID"])
|
||
i["ArchivesID"]=GetBytesto16(i["ArchivesID"])
|
||
i["ArchivesAuthorUUID"]=GetBytesto16(i["ArchivesAuthorUUID"])
|
||
if Is_User(i["ArchivesAuthorUUID"]):
|
||
i["ArchivesAuthorName"]=ReadUserConfig(i["ArchivesAuthorUUID"])["UserName"]
|
||
i["ArchivesCreateTime"]=i["ArchivesCreateTime"].strftime("%Y-%m-%d %H:%M:%S")
|
||
i["ArchivesTextName"]=""
|
||
i["ArchivesTextDesc"]=""
|
||
if (ArchivesText:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="archivestext", WHERE=("ArchivesID=%s", Get16toBytes(i["ArchivesID"])), _limit=1)):
|
||
i["ArchivesTextName"]=ArchivesText[0]["ArchivesName"]
|
||
i["ArchivesTextDesc"]=ArchivesText[0]["ArchivesDesc"]
|
||
_.append(i)
|
||
return {"code":0,"count":1000,"data":_}
|
||
|
||
@Manage.route("/API/GetArchivesText.api")
|
||
@PreRequirements(4.0)
|
||
def UserGetArchivesText():
|
||
if not (ArchivesText:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="archivestext", WHERE="1=1")): return {"code":0,"count":1000,"data":[]}
|
||
_=[]
|
||
for i in ArchivesText:
|
||
i["ArchivesID"]=GetBytesto16(i["ArchivesID"])
|
||
_.append(i)
|
||
return {"code":0,"count":1000,"data":_}
|
||
|
||
@Manage.route("/API/AddArchivesText.api", methods=["POST"])
|
||
@PreRequirements(4.0)
|
||
def UserAddArchivesText():
|
||
ArchivesName=flask.request.form.get("ArchivesName")
|
||
ArchivesDesc=flask.request.form.get("ArchivesDesc")
|
||
ArchivesID=flask.request.form.get("ArchivesID", GUUID())
|
||
if not ArchivesName: return {"code":1,"msg":i18n.NoParameter("ArchivesName")}
|
||
if not ArchivesDesc: return {"code":1,"msg":i18n.NoParameter("ArchivesDesc")}
|
||
if not Is_UUID(ArchivesID): {"code":1,"msg":i18n.NoUUID("ArchivesID")}
|
||
if len(ArchivesName) > 1024 or len(ArchivesDesc) > 1024*1024: return {"code":1,"msg":i18n.TooBig}
|
||
if SQLUsers.istrue("archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID))):
|
||
SQLUsers.update(FROM="archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID)), ArchivesName=ArchivesName, ArchivesDesc=ArchivesDesc)
|
||
else:
|
||
SQLUsers.insert("archivestext", ArchivesName=ArchivesName, ArchivesDesc=ArchivesDesc, ArchivesID=Get16toBytes(ArchivesID))
|
||
return {"code":0,"msg":i18n.AddSuccess}
|
||
|
||
@Manage.route("/API/DelArchivesText.api", methods=["POST"])
|
||
@PreRequirements(4.0)
|
||
def UserDelArchivesText():
|
||
ArchivesID=flask.request.form.get("ArchivesID")
|
||
if not ArchivesID: {"code":1,"msg":i18n.NoParameter("ArchivesID")}
|
||
if not Is_UUID(ArchivesID): return {"code":1,"msg":i18n.NoUUID("ArchivesID")}
|
||
if not SQLUsers.istrue("archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID))): return {"code":1,"msg":i18n.NoFound("ArchivesID")}
|
||
SQLUsers.delete(FROM="archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID)))
|
||
return {"code":0,"msg":i18n.DelSuccess}
|
||
|
||
@Manage.route("/API/AddArchives.api", methods=["POST"])
|
||
@PreRequirements(2.0)
|
||
def UserAddArchives():
|
||
ArchivesUUID=flask.request.form.get("ArchivesUUID", GUUID())
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
ArchivesName=flask.request.form.get("ArchivesName")
|
||
ArchivesDesc=flask.request.form.get("ArchivesDesc")
|
||
ArchivesPoints=flask.request.form.get("ArchivesPoints")
|
||
ArchivesID=flask.request.form.get("ArchivesID", "0"*16)
|
||
ArchivesAuthorUUID=GetELTUserUUID()
|
||
ArchivesCreateTime=TimeFormatInt()
|
||
try: ArchivesPoints=int(ArchivesPoints)
|
||
except: return {"code":1,"msg":i18n.DataError("ArchivesPoints", "Int")}
|
||
if not ArchivesUUID: return {"code":1,"msg":i18n.NoParameter("ArchivesUUID")}
|
||
if not ArchivesID: return {"code":1,"msg":i18n.NoParameter("ArchivesID")}
|
||
if not ArchivesName: return {"code":1,"msg":i18n.NoParameter("ArchivesName")}
|
||
if not ArchivesDesc: return {"code":1,"msg":i18n.NoParameter("ArchivesDesc")}
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if len(ArchivesName) > 1024 or len(ArchivesDesc) > 1024*1024: return {"code":1,"msg":i18n.No}
|
||
if not SubIsIn(GetELTUserUUID(), UserUUID): return {"code":1,"count":1000,"data":i18n.NoIn("ELTUserUUID", "UserUUID")}
|
||
if not Is_UUID(ArchivesUUID): {"code":1,"msg":i18n.NoUUID("ArchivesUUID")}
|
||
if not Is_UUID(ArchivesID): {"code":1,"msg":i18n.NoUUID("ArchivesID")}
|
||
if not SQLUsers.istrue("archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID))): return {"code":1,"msg":i18n.NoFound("ArchivesID")}
|
||
if SQLUsers.istrue("archives", WHERE=("ArchivesUUID=%s", Get16toBytes(ArchivesUUID))):
|
||
SQLUsers.update(FROM="archives", WHERE=("ArchivesUUID=%s", Get16toBytes(ArchivesUUID)),
|
||
ArchivesID=Get16toBytes(ArchivesID), ArchivesName=ArchivesName, ArchivesDesc=ArchivesDesc, ArchivesPoints=ArchivesPoints,
|
||
ArchivesAuthorUUID=Get16toBytes(ArchivesAuthorUUID))
|
||
else:
|
||
SQLUsers.insert("archives", UserUUID=Get16toBytes(UserUUID),
|
||
ArchivesUUID=Get16toBytes(ArchivesUUID), ArchivesID=Get16toBytes(ArchivesID), ArchivesName=ArchivesName, ArchivesDesc=ArchivesDesc, ArchivesPoints=ArchivesPoints,
|
||
ArchivesAuthorUUID=Get16toBytes(ArchivesAuthorUUID), ArchivesCreateTime=ArchivesCreateTime)
|
||
return {"code":0,"msg":i18n.AddSuccess}
|
||
|
||
@Manage.route("/API/DelArchives.api", methods=["POST"])
|
||
@PreRequirements(2.0)
|
||
def UserDelArchives():
|
||
ArchivesUUID=flask.request.form.get("ArchivesUUID")
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
if not ArchivesUUID: {"code":1,"msg":i18n.NoParameter("ArchivesUUID")}
|
||
if not UserUUID: {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not Is_UUID(ArchivesUUID): {"code":1,"msg":i18n.NoUUID("ArchivesUUID")}
|
||
if not Is_UUID(UserUUID): {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not Is_User(UserUUID): {"code":1,"msg":i18n.NoFound("UserUUID")}
|
||
if not SubIsIn(GetELTUserUUID(), UserUUID): return {"code":0,"count":1000,"data":i18n.NoIn("ELTUserUUID", "UserUUID")}
|
||
if SQLUsers.istrue("archives", WHERE=("ArchivesUUID=%s", Get16toBytes(ArchivesUUID))):
|
||
SQLUsers.delete(FROM="archives", WHERE=("ArchivesUUID=%s", Get16toBytes(ArchivesUUID)))
|
||
return {"code":0,"msg":"success"}
|
||
|
||
|
||
def process_checkin_data(checkin_records, week_start_date):
|
||
week_status = [0] * 7
|
||
if not checkin_records:
|
||
return week_status
|
||
try:
|
||
if isinstance(week_start_date, datetime.datetime):
|
||
start_date = week_start_date.date()
|
||
else:
|
||
date_str = str(week_start_date).split()[0]
|
||
year, month, day = map(int, date_str.split('-'))
|
||
start_date = datetime.datetime(year, month, day).date()
|
||
except:
|
||
return week_status
|
||
week_dates = [start_date + datetime.timedelta(days=i) for i in range(7)]
|
||
for record in checkin_records:
|
||
if not record or 'CheckInTime' not in record:
|
||
continue
|
||
try:
|
||
checkin_time = record['CheckInTime']
|
||
checkin_date = checkin_time.date()
|
||
if start_date <= checkin_date <= week_dates[-1]:
|
||
day_of_week = (checkin_date - start_date).days
|
||
if 0 <= day_of_week < 7:
|
||
week_status[day_of_week] = 1
|
||
except:
|
||
continue
|
||
return week_status
|
||
|
||
def days_between_today(target_date_str):
|
||
try:
|
||
today = datetime.datetime.now().date()
|
||
target_date = datetime.datetime.strptime(target_date_str, "%Y-%m-%d").date()
|
||
delta = abs((target_date - today).days)
|
||
return delta + 1
|
||
except ValueError:
|
||
return None
|
||
|
||
@Manage.route("/API/AssessmentScore.api")
|
||
@PreRequirements(2.0)
|
||
def UserAssessmentScore():
|
||
ELTUserUUID=GetELTUserUUID()
|
||
UserUUID=flask.request.args.get("UserUUID", ELTUserUUID)
|
||
if not SubIsInOrIs(ELTUserUUID, UserUUID) and GetPermissions(ELTUserUUID) < 4: return {"code":1,"msg":i18n.NoIn("ELTUserUUID", "UserUUID")}
|
||
CheckIn3=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="checkin", WHERE=("UserUUID=%s AND WeekFirstTime=%s", (Get16toBytes(UserUUID), GetWeekStartDate(week_seek=-2))), _limit=7)
|
||
CheckIn2=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="checkin", WHERE=("UserUUID=%s AND WeekFirstTime=%s", (Get16toBytes(UserUUID), GetWeekStartDate(week_seek=-1))), _limit=7)
|
||
CheckIn1=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="checkin", WHERE=("UserUUID=%s AND WeekFirstTime=%s", (Get16toBytes(UserUUID), GetWeekStartDate(week_seek=0))), _limit=7)
|
||
Archives=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="archives", WHERE=("UserUUID=%s AND ArchivesPoints!=0", Get16toBytes(UserUUID)))
|
||
last_week_data = process_checkin_data(CheckIn3, GetWeekStartDate(week_seek=-2))
|
||
current_week_data = process_checkin_data(CheckIn2, GetWeekStartDate(week_seek=-1))
|
||
next_week_data = process_checkin_data(CheckIn1, GetWeekStartDate(week_seek=0))
|
||
penaltyItems=[]
|
||
AMScore=100
|
||
bonusItems=[{"description": i18n.InitialAssessmentScore, "points": 100}]
|
||
last_week_minus_score = 5 if len(CheckIn3) < 3 else 0
|
||
current_week_minus_score = 5 if len(CheckIn2) < 3 else 0
|
||
AMScore -= last_week_minus_score
|
||
AMScore -= current_week_minus_score
|
||
if last_week_minus_score: penaltyItems.append({"description": i18n.LWSIAWU, "points": 5})
|
||
if current_week_minus_score: penaltyItems.append({"description": i18n.LWSAF, "points": 5})
|
||
for i in Archives:
|
||
_={"description": i["ArchivesName"], "points": i["ArchivesPoints"]}
|
||
AMScore+=i["ArchivesPoints"]
|
||
bonusItems.append(_) if i["ArchivesPoints"] > 0 else penaltyItems.append(_)
|
||
return {"success": True, "data": {
|
||
"score": AMScore if AMScore < 100 else 100,
|
||
"tscore": AMScore,
|
||
"attendance": {
|
||
"lastWeek": last_week_data,
|
||
"currentWeek": current_week_data,
|
||
"nextWeek": next_week_data,
|
||
},
|
||
"bonusItems": bonusItems,
|
||
"penaltyItems": penaltyItems
|
||
}}
|
||
|
||
@App.route("/API/GetWebSiteShowMembers.api")
|
||
@Manage.route("/API/GetWebSiteShowMembers.api")
|
||
def UserGetWebSiteShowMembersAPI():
|
||
Type=flask.request.args.get("Type")
|
||
if not Type: return {"code":1,"msg":i18n.NoParameter("Type")}
|
||
if Type not in ["Members", "AKS", "Collaborators"]: return {"code":1,"msg":i18n.ModeError}
|
||
_=SQLUsers.selectashead(NSQL.MOD.ALL, FROM=f"show_{Type.lower()}", WHERE="1=1")
|
||
_2=[]
|
||
for i in _:
|
||
i["UserUUID"]=GetBytesto16(i["UserUUID"])
|
||
UserConfig=ReadUserConfig(i["UserUUID"])
|
||
_2.append({
|
||
"UserUUID": i["UserUUID"],
|
||
"UserName": i["UserName"] if i["UserName"] else GetUUIDUser(i["UserUUID"]),
|
||
"UserBrInt": i["UserBrInt"] if i["UserBrInt"] else UserConfig["UserPersonalSignature"],
|
||
"UserPhotoPath": i["UserPhotoPath"] if i["UserPhotoPath"] else "https://ugm.gvsds.com/GetArgsUserHeadPng.api?UserUUID=%s" % i["UserUUID"],
|
||
"UserSoundPath": i["UserSoundPath"] if i["UserSoundPath"] else "",
|
||
"UserWork": "" if not i["UserWork"] else (UserConfig["UserJob"] if i["UserWork"] == "work" else i["UserWork"]),
|
||
"UserTel": "" if not i["UserTel"] else (RUserTele(GetBytesto16(UserConfig["UserTele"])) if i["UserTel"] == "tel" else i["UserTel"]),
|
||
"UserEmail": "" if not i["UserEmail"] else (UserConfig["UserEmail"] if i["UserEmail"] == "email" else i["UserEmail"]),
|
||
"UserQQName": "" if not i["UserQQName"] else i["UserQQName"],
|
||
"UserWXName": "" if not i["UserWXName"] else i["UserWXName"],
|
||
"UserQQ": "" if not i["UserQQ"] else (UserConfig["UserQQ"] if i["UserQQ"] == "qq" else i["UserQQ"]),
|
||
"UserWX": "" if not i["UserWX"] else (UserConfig["UserWX"] if i["UserWX"] == "wx" else i["UserWX"]),
|
||
"UserAccentColor": i["UserAccentColor"] if i["UserAccentColor"] else "#555"
|
||
})
|
||
return {"code":0,"count":1000,"data":_2}
|
||
|
||
@Manage.route("/API/WebSiteShowMembersDel.api", methods=["POST"])
|
||
@PreRequirements(4.0)
|
||
def UserWebSiteShowMembersDelAPI():
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
Type=flask.request.form.get("Type")
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not Type: return {"code":1,"msg":i18n.NoParameter("Type")}
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)}
|
||
if Type not in ["Members", "AKS", "Collaborators"]: return {"code":1,"msg":i18n.ModeError}
|
||
if not SQLUsers.istrue(f"show_{Type.lower()}", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))): return {"code":1,"msg":i18n.NoFound("UserUUID")}
|
||
SQLUsers.delete(f"show_{Type.lower()}", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)))
|
||
return {"code":0}
|
||
|
||
@Manage.route("/API/WebSiteShowMembersAdd.api", methods=["POST"])
|
||
@PreRequirements(4.0)
|
||
def UserWebSiteShowMembersAddAPI():
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
Type=flask.request.form.get("Type")
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not Type: return {"code":1,"msg":i18n.NoParameter("Type")}
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)}
|
||
if Type not in ["Members", "AKS", "Collaborators"]: return {"code":1,"msg":i18n.ModeError}
|
||
if SQLUsers.istrue(f"show_{Type.lower()}", WHERE=("UserUUID=%s", Get16toBytes(flask.request.form.get("UserUUID")))): return {"code":1,"msg":i18n.AlreadyExist}
|
||
SQLUsers.insert(f"show_{Type.lower()}",
|
||
UserUUID=Get16toBytes(UserUUID),
|
||
UserName=flask.request.form.get("UserName") if flask.request.form.get("UserName") else "",
|
||
UserBrInt=flask.request.form.get("UserBrInt") if flask.request.form.get("UserBrInt") else ReadUserConfig(flask.request.form.get("UserUUID"), "UserPersonalSignature"),
|
||
UserPhotoPath=flask.request.form.get("UserPhotoPath") if flask.request.form.get("UserPhotoPath") else "",
|
||
UserSoundPath=flask.request.form.get("UserSoundPath") if flask.request.form.get("UserSoundPath") else "",
|
||
UserWork=flask.request.form.get("UserWork") if flask.request.form.get("UserWork") else "",
|
||
UserTel=flask.request.form.get("UserTel") if flask.request.form.get("UserTel") else "",
|
||
UserEmail=flask.request.form.get("UserEmail") if flask.request.form.get("UserEmail") else "",
|
||
UserQQName=flask.request.form.get("UserQQName") if flask.request.form.get("UserQQName") else "",
|
||
UserWXName=flask.request.form.get("UserWXName") if flask.request.form.get("UserWXName") else "",
|
||
UserQQ=flask.request.form.get("UserQQ") if flask.request.form.get("UserQQ") else "",
|
||
UserWX=flask.request.form.get("UserWX") if flask.request.form.get("UserWX") else "",
|
||
UserAccentColor=flask.request.form.get("UserAccentColor") if flask.request.form.get("UserAccentColor") else ""
|
||
)
|
||
return {"code":0}
|
||
|
||
|
||
@Manage.route("/API/GetIdCard.api")
|
||
@PreRequirements(4.0)
|
||
def UserGetIdCard():
|
||
if not (IdCards:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="idcard", WHERE="1=1")): return {"code":0,"count":1000,"data":[]}
|
||
_=[]
|
||
for i in IdCards:
|
||
i["UserUUID"]=GetBytesto16(i["UserUUID"])
|
||
i["Born"]=i["Born"].strftime("%Y-%m-%d")
|
||
i["ChangeStudentStatus"]=json.dumps(i["ChangeStudentStatus"], ensure_ascii=False)
|
||
i["CorrespondenceAddress"]=json.dumps(i["CorrespondenceAddress"], ensure_ascii=False)
|
||
i["InformationAboutFamilyMembers"]=json.dumps(i["InformationAboutFamilyMembers"], ensure_ascii=False)
|
||
i["Appointments"]=json.dumps(i["Appointments"], ensure_ascii=False)
|
||
_.append(i)
|
||
return {"code":0,"count":1000,"data":_}
|
||
|
||
@Manage.route("/API/AddIdCard.api", methods=["POST"])
|
||
@PreRequirements(4.0)
|
||
def UserAddIdCard():
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
Name=flask.request.form.get("Name")
|
||
OldName=flask.request.form.get("OldName")
|
||
Born=flask.request.form.get("Born")
|
||
Sex=flask.request.form.get("Sex")
|
||
Ethnic=flask.request.form.get("Ethnic")
|
||
IdentificationNumber=flask.request.form.get("IdentificationNumber")
|
||
StudentRegistrationNumber=flask.request.form.get("StudentRegistrationNumber")
|
||
ChangeStudentStatus=flask.request.form.get("ChangeStudentStatus")
|
||
CorrespondenceAddress=flask.request.form.get("CorrespondenceAddress")
|
||
HeadImage=flask.request.form.get("HeadImage")
|
||
InformationAboutFamilyMembers=flask.request.form.get("InformationAboutFamilyMembers")
|
||
Appointments=flask.request.form.get("Appointments")
|
||
ReadmeReport=flask.request.form.get("ReadmeReport")
|
||
# ChangeStudentStatus #HeadImage #InformationAboutFamilyMembers #Appointments #ReadmeReport
|
||
if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not Name: return {"code":1,"msg":i18n.NoParameter("Name")}
|
||
if not OldName: OldName=""
|
||
if not Born: return {"code":1,"msg":i18n.NoParameter("Born")}
|
||
if not Sex: return {"code":1,"msg":i18n.NoParameter("Sex")}
|
||
if not Ethnic: return {"code":1,"msg":i18n.NoParameter("Ethnic")}
|
||
if not IdentificationNumber: return {"code":1,"msg":i18n.NoParameter("IdentificationNumber")}
|
||
if not StudentRegistrationNumber: return {"code":1,"msg":i18n.NoParameter("StudentRegistrationNumber")}
|
||
if not ChangeStudentStatus: ChangeStudentStatus="[]"
|
||
if not CorrespondenceAddress: CorrespondenceAddress="[]"
|
||
if not HeadImage: HeadImage=""
|
||
if not InformationAboutFamilyMembers: InformationAboutFamilyMembers="[]"
|
||
if not Appointments: Appointments="[]"
|
||
if not ReadmeReport: ReadmeReport=""
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)}
|
||
if len(Name) > 128: return {"code":1,"msg":i18n.TooBigMsg("Name", "128B")}
|
||
if len(OldName) > 128: return {"code":1,"msg":i18n.TooBigMsg("OldName", "128B")}
|
||
try: time.mktime(time.strptime(Born, "%Y-%m-%d"))
|
||
except: return {"code": 1, "msg": i18n.TimeAbnormal}
|
||
if len(Sex) > 10: return {"code":1,"msg":i18n.TooBigMsg("Sex", "10B")}
|
||
if len(Ethnic) > 20: return {"code":1,"msg":i18n.TooBigMsg("Ethnic", "20B")}
|
||
if len(IdentificationNumber) > 20: return {"code":1,"msg":i18n.TooBigMsg("IdentificationNumber", "20B")}
|
||
try: int(IdentificationNumber)
|
||
except:return {"code":1,"msg":i18n.DataError("IdentificationNumber", "int")}
|
||
if len(StudentRegistrationNumber) > 30: return {"code":1,"msg":i18n.TooBigMsg("StudentRegistrationNumber", "30B")}
|
||
if len(ChangeStudentStatus) > 4096: return {"code":1,"msg":i18n.TooBigMsg("ChangeStudentStatus", "4096B")}
|
||
try: json.loads(ChangeStudentStatus)
|
||
except: return {"code":1,"msg":i18n.DataError("ChangeStudentStatus", "dict")}
|
||
if len(CorrespondenceAddress) > 4096: return {"code":1,"msg":i18n.TooBigMsg("CorrespondenceAddress", "4096B")}
|
||
try: json.loads(CorrespondenceAddress)
|
||
except: return {"code":1,"msg":i18n.DataError("CorrespondenceAddress", "list")}
|
||
if len(HeadImage) > 4096: return {"code":1,"msg":i18n.TooBigMsg("HeadImage", "4096B")}
|
||
if len(InformationAboutFamilyMembers) > 4096: return {"code":1,"msg":i18n.TooBigMsg("InformationAboutFamilyMembers", "4096B")}
|
||
try: json.loads(InformationAboutFamilyMembers)
|
||
except: return {"code":1,"msg":i18n.DataError("InformationAboutFamilyMembers", "dict")}
|
||
if len(Appointments) > 4096: return {"code":1,"msg":i18n.TooBigMsg("Appointments", "4096B")}
|
||
try: json.loads(Appointments)
|
||
except: return {"code":1,"msg":i18n.DataError("Appointments", "dict")}
|
||
if len(ReadmeReport) > 4096: return {"code":1,"msg":i18n.TooBigMsg("ReadmeReport", "4096B")}
|
||
if SQLUsers.istrue("idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))):
|
||
SQLUsers.update(FROM="idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)),
|
||
Name=Name,
|
||
OldName=OldName,
|
||
Born=Born,
|
||
Sex=Sex,
|
||
Ethnic=Ethnic,
|
||
IdentificationNumber=IdentificationNumber,
|
||
StudentRegistrationNumber=StudentRegistrationNumber,
|
||
ChangeStudentStatus=ChangeStudentStatus,
|
||
CorrespondenceAddress=CorrespondenceAddress,
|
||
HeadImage=HeadImage,
|
||
InformationAboutFamilyMembers=InformationAboutFamilyMembers,
|
||
Appointments=Appointments,
|
||
ReadmeReport=ReadmeReport)
|
||
else:
|
||
SQLUsers.insert("idcard",
|
||
UserUUID=Get16toBytes(UserUUID),
|
||
Name=Name,
|
||
OldName=OldName,
|
||
Born=Born,
|
||
Sex=Sex,
|
||
Ethnic=Ethnic,
|
||
IdentificationNumber=IdentificationNumber,
|
||
StudentRegistrationNumber=StudentRegistrationNumber,
|
||
ChangeStudentStatus=ChangeStudentStatus,
|
||
CorrespondenceAddress=CorrespondenceAddress,
|
||
HeadImage=HeadImage,
|
||
InformationAboutFamilyMembers=InformationAboutFamilyMembers,
|
||
Appointments=Appointments,
|
||
ReadmeReport=ReadmeReport)
|
||
return {"code":0,"msg":i18n.AddSuccess}
|
||
|
||
@Manage.route("/API/DelIdCard.api", methods=["POST"])
|
||
@PreRequirements(4.0)
|
||
def UserDelIdCard():
|
||
UserUUID=flask.request.form.get("UserUUID")
|
||
if not UserUUID: {"code":1,"msg":i18n.NoParameter("UserUUID")}
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not SQLUsers.istrue("idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))): return {"code":1,"msg":i18n.NoFound("UserUUID")}
|
||
SQLUsers.delete(FROM="idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)))
|
||
return {"code":0,"msg":i18n.DelSuccess}
|
||
|
||
@Manage.route("/API/TIdCard.api")
|
||
def UserTIdCard():
|
||
UserUUID=flask.request.form.get("UserUUID", GetELTUserUUID())
|
||
if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")}
|
||
if not SQLUsers.istrue("idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))): return {"code":1,"msg":i18n.NoFound("IdCardUserUUID")}
|
||
_=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)), _limit=1)
|
||
if not _: return {"code":1,"msg":i18n.GetError}
|
||
_=_[0]
|
||
_["UserUUID"]=GetBytesto16(_["UserUUID"])
|
||
_["Born"]=_["Born"].strftime("%Y-%m-%d")
|
||
_["Year"]=_["Born"].split("-")[0]
|
||
_["Month"]=_["Born"].split("-")[1]
|
||
_["Day"]=_["Born"].split("-")[2]
|
||
_["ChangeStudentStatus"]=json.dumps(_["ChangeStudentStatus"], ensure_ascii=False)
|
||
_["CorrespondenceAddress"]=" ".join(_["CorrespondenceAddress"])
|
||
_["InformationAboutFamilyMembers"]=json.dumps(_["InformationAboutFamilyMembers"], ensure_ascii=False)
|
||
_["Appointments"]=json.dumps(_["Appointments"], ensure_ascii=False)
|
||
return {"code":0,"data":_}
|
||
|
||
|
||
|
||
|
||
|
||
@Manage.route("/API/Money.api")
|
||
@PreRequirements(1.0)
|
||
def UserGetMoney():
|
||
UserConfig = GetELTUserConfig()
|
||
UserMoneyIntegral = UserConfig["UserMoneyIntegral"]
|
||
UserMoneyLightCoin = UserConfig["UserMoneyLightCoin"]
|
||
UserMoneyBrightCoin = UserConfig["UserMoneyBrightCoin"]
|
||
UserMoneyDarkCoin = UserConfig["UserMoneyDarkCoin"]
|
||
return {"UserMoneyIntegral": UserMoneyIntegral,
|
||
"UserMoneyLightCoin": UserMoneyLightCoin,
|
||
"UserMoneyBrightCoin": UserMoneyBrightCoin,
|
||
"UserMoneyDarkCoin": UserMoneyDarkCoin}
|
||
|
||
|
||
|
||
|
||
PersonalForm=["PersonalPageName", "Subtitle", "BackgroundLink", "Classification", "Github", "WeChat", "QQ", "SelfIntroduction", "ProjectExperience", "SatisfiedCustomers", "ReceiveAward", "CoffeeCups",
|
||
"Achievement1Icon", "Achievement1Name", "Achievement1Time", "Achievement1Introduction",
|
||
"Achievement2Icon", "Achievement2Name", "Achievement2Time", "Achievement2Introduction",
|
||
"Achievement3Icon", "Achievement3Name", "Achievement3Time", "Achievement3Introduction",
|
||
"Achievement4Icon", "Achievement4Name", "Achievement4Time", "Achievement4Introduction",
|
||
"Tags", "MarkDown"]
|
||
|
||
@Manage.route("/API/WritePersonalInformation.api", methods=["POST"])
|
||
def UserWritePersonalInformation():
|
||
_=SQLUsers.selectashead(NSQL.MOD.ALL, WHERE=("PersonalPageUserUUID=%s", Get16toBytes(GetELTUserUUID())), FROM="personal", _limit=1)
|
||
r={}
|
||
for i in PersonalForm:
|
||
_r=str(flask.request.form.get(i))
|
||
if i != "MarkDown" and len(_r) > 256: return {"code": 1, "msg": i18n.TooBigMsg(i, "256B")}
|
||
if len(_r) > 64*1024: return {"code": 1, "msg": i18n.TooBigMsg("Markdown", "64KB")}
|
||
if i == "PersonalPageName" and not _r: return {"code": 1, "msg": i18n.BeMostValue("PersonalPageName")}
|
||
if i == "PersonalPageName" and not bool(re.fullmatch(r'^[a-z0-9_]+$', _r)): return {"code": 1, "msg": i18n.Notaz09("PersonalPageName")}
|
||
r[i]=_r
|
||
r["PersonalPageUserUUID"]=Get16toBytes(GetELTUserUUID())
|
||
if r["PersonalPageName"].lower() in BadH:
|
||
return {"code": 1, "msg": i18n.AgainstSystem("PersonalPageName")}
|
||
if not _:
|
||
if SQLUsers.selectashead(NSQL.MOD.ALL, WHERE=("PersonalPageName=%s", r["PersonalPageName"]), FROM="personal", _limit=1):
|
||
return {"code": 1, "msg": i18n.Repeat("PersonalPageName")}
|
||
SQLUsers.insert("personal", **r)
|
||
return {"code": 0, "msg": i18n.ChangeSuccess}
|
||
SQLUsers.update(WHERE=("PersonalPageUserUUID=%s", r["PersonalPageUserUUID"]), FROM="personal", **r)
|
||
return {"code": 0, "msg": i18n.ChangeSuccess}
|
||
|
||
|
||
@Manage.route("/API/RequestPersonalInformation.api")
|
||
def UserRequestPersonalInformation():
|
||
_=SQLUsers.selectashead(NSQL.MOD.ALL, WHERE=("PersonalPageUserUUID=%s", Get16toBytes(GetELTUserUUID())), FROM="personal", _limit=1)
|
||
if not _: return {"code": 1, "msg": i18n.YouNeverRegisterPersonalPage}
|
||
_=_[0]
|
||
del _["PersonalPageUserUUID"]
|
||
return {"code": 0, "data": _}
|
||
|
||
def GetPersonalPage(name):
|
||
if (r:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="personal", WHERE=("PersonalPageName=%s", name), _limit=1)): return r[0]
|
||
return False
|
||
|
||
@Manage.route("/API/JumpToPersonalPage.api")
|
||
def UserJumpToPersonalPage():
|
||
UserUUID=flask.request.form.get("UserUUID", GetELTUserUUID())
|
||
if not Is_UUID(UserUUID): flask.abort(404)
|
||
if not (r:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="personal", WHERE=("PersonalPageUserUUID=%s", Get16toBytes(UserUUID)), _limit=1)): flask.abort(404)
|
||
return flask.redirect(f"https://{r[0]["PersonalPageName"]}.gvsds.com")
|
||
|
||
@App.before_request
|
||
def PersonalBeforeRequest():
|
||
h=flask.request.host.lower().split(".")[0]
|
||
if h.lower() in BadH: return None
|
||
if (r:=GetPersonalPage(h)):
|
||
p=ReadUserConfig(GetBytesto16(r["PersonalPageUserUUID"]))
|
||
return flask.render_template("Personal/index.html",
|
||
UserName=p["UserName"],
|
||
UserUUID=GetBytesto16(p["UserUUID"]),
|
||
UserPersonalSignature=p["UserPersonalSignature"],
|
||
UserEmail=p["UserEmail"],
|
||
UserTele=RUserTele(GetBytesto16(p["UserTele"])),
|
||
Subtitle=r["Subtitle"],
|
||
BackgroundLink=r["BackgroundLink"],
|
||
Classification=r["Classification"],
|
||
Github=r["Github"],
|
||
WeChat=r["WeChat"],
|
||
QQ=r["QQ"],
|
||
SelfIntroduction=r["SelfIntroduction"],
|
||
ProjectExperience=r["ProjectExperience"],
|
||
SatisfiedCustomers=r["SatisfiedCustomers"],
|
||
ReceiveAward=r["ReceiveAward"],
|
||
CoffeeCups=r["CoffeeCups"],
|
||
Tags=r["Tags"],
|
||
MarkDown=markdown.markdown(r["MarkDown"]),
|
||
ChildHost=h,
|
||
Achievement1Icon=r["Achievement1Icon"],Achievement1Name=r["Achievement1Name"],Achievement1Time=r["Achievement1Time"],Achievement1Introduction=r["Achievement1Introduction"],
|
||
Achievement2Icon=r["Achievement2Icon"],Achievement2Name=r["Achievement2Name"],Achievement2Time=r["Achievement2Time"],Achievement2Introduction=r["Achievement2Introduction"],
|
||
Achievement3Icon=r["Achievement3Icon"],Achievement3Name=r["Achievement3Name"],Achievement3Time=r["Achievement3Time"],Achievement3Introduction=r["Achievement3Introduction"],
|
||
Achievement4Icon=r["Achievement4Icon"],Achievement4Name=r["Achievement4Name"],Achievement4Time=r["Achievement4Time"],Achievement4Introduction=r["Achievement4Introduction"],
|
||
)
|
||
|
||
@Manage.route("/API/RequestPersonalConfig.api")
|
||
def UserRequestPersonalConfig():
|
||
_=GetELTUserConfig()
|
||
return {
|
||
"UserName": _["UserName"],
|
||
"UserRealName": _["UserRealName"],
|
||
"UserSex": _["UserSex"],
|
||
"UserPersonalSignature": _["UserPersonalSignature"],
|
||
"UserEmail": _["UserEmail"],
|
||
"UserTele": RUserTele(GetBytesto16(_["UserTele"])),
|
||
"UserBornTime": _["UserBornTime"].strftime("%Y-%m-%d %H:%M:%S")
|
||
}
|
||
|
||
|
||
|
||
@Manage.route("/API/GetSeries.api")
|
||
def UserGetSeries():
|
||
_=[]
|
||
ELTUserUUID = GetELTUserUUID()
|
||
if SQLDocument.istrue("series", WHERE=("DocAuthorUserUUID=%s", Get16toBytes(ELTUserUUID))):
|
||
_=SQLDocument.selectashead(NSQL.MOD.ALL,WHERE=("DocAuthorUserUUID=%s", Get16toBytes(ELTUserUUID)), FROM="series")
|
||
_2=[]
|
||
for i in _: _2.append({"DocSerieUUID": GetBytesto16(i["DocSerieUUID"]), "DocSerieName": i["DocSerieName"], "DocAuthorUserUUID": GetBytesto16(i["DocAuthorUserUUID"]), "DocSerieCreateTime": i["DocSerieCreateTime"].strftime("%Y-%m-%d %H:%M:%S")})
|
||
return flask.jsonify({"code":0,"count":1000,"data":_2})
|
||
|
||
def gdfp(s, x):
|
||
if x >= len(s): return 0
|
||
pattern = r'^([0-9]+)'
|
||
match = re.match(pattern, s[x:])
|
||
if match:
|
||
m=match.group(1)
|
||
try: m=int(m)
|
||
except: pass
|
||
return m
|
||
else:
|
||
try: s=int(s)
|
||
except: pass
|
||
return s
|
||
|
||
def dsort(s):
|
||
if len(s) >= 3:
|
||
if s[0] == "第":
|
||
return gdfp(s, 1)
|
||
if s[0:1] == "No":
|
||
return gdfp(s, 2)
|
||
if s[0] in "1234567890":
|
||
return gdfp(s, 0)
|
||
return 0
|
||
|
||
@Manage.route("/API/GetSerieDoces.api")
|
||
def UserGetSerieDoces():
|
||
DocSerieUUID=flask.request.args.get("DocSerieUUID")
|
||
if not DocSerieUUID: return {"code":1,"msg":i18n.NoParameter("DocSerieUUID")}
|
||
if not Get16toBytes(DocSerieUUID, True): return {"code":1,"msg":i18n.NoUUID("DocSerieUUID")}
|
||
if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID(): return {"code":1,"msg":i18n.NoPermission}
|
||
_=[]
|
||
if SQLDocument.istrue("doc", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))):
|
||
_=SQLDocument.selectashead(NSQL.MOD.ALL,WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)), FROM="doc")
|
||
_2=[]
|
||
for i in _: _2.append({"DocUUID": GetBytesto16(i["DocUUID"]), "DocSerieUUID": GetBytesto16(i["DocSerieUUID"]), "DocTitle": i["DocTitle"], "DocCreateTime": i["DocCreateTime"].strftime("%Y-%m-%d %H:%M:%S")})
|
||
_2=sorted(_2, key=lambda x: dsort(x["DocTitle"]))
|
||
return flask.jsonify({"code":0,"count":1000,"data":_2})
|
||
|
||
@Manage.route("/API/addserie.api", methods=["POST"])
|
||
def UserAddSerie():
|
||
DocSerieName=flask.request.form.get("DocSerieName")
|
||
if not DocSerieName: return {"code":1,"msg":i18n.NoParameter("DocSerieName")}
|
||
if not NonLegalChar(DocSerieName): return {"code":1,"msg":i18n.NotLegalChar("DocSerieName")}
|
||
if len(DocSerieName) > 255: return {"code":1,"msg":i18n.TooBigMsg("DocSerieName", "256B")}
|
||
if SQLDocument.istrue("series", WHERE=("DocSerieName=%s", DocSerieName)): return {"code":1,"msg":i18n.AlreadyExist}
|
||
SQLDocument.insert("series", DocSerieUUID=Get16toInsert(NewUUID()), DocSerieName=DocSerieName, DocAuthorUserUUID=Get16toInsert(GetELTUserUUID()), DocSerieCreateTime=TimeFormatStr("%Y-%m-%d %H:%M:%S"))
|
||
return {"code":0,"msg":i18n.AddSuccess}
|
||
|
||
@Manage.route("/API/delserie.api", methods=["POST"])
|
||
def UserDelSerie():
|
||
DocSerieUUID=flask.request.form.get("DocSerieUUID")
|
||
if not DocSerieUUID: return {"code":1,"msg":i18n.NoParameter("DocSerieUUID")}
|
||
if not Get16toBytes(DocSerieUUID, True): return {"code":1,"msg":i18n.NoUUID("DocSerieUUID")}
|
||
if not Get16toBytes(DocSerieUUID, True): return {"code":1,"msg":i18n.NoUUID("DocSerieUUID")}
|
||
if not SQLDocument.istrue("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":i18n.NotExist}
|
||
SQLDocument.delete("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))
|
||
SQLDocument.delete("doc", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))
|
||
return {"code":1,"msg":i18n.DelSuccess}
|
||
|
||
|
||
@Manage.route("/API/addoc.api", methods=["POST"])
|
||
def UserAddoc():
|
||
DocTitle=flask.request.form.get("DocTitle")
|
||
DocSerieUUID=flask.request.form.get("DocSerieUUID")
|
||
if not DocTitle: return {"code":1,"msg":i18n.NoParameter("DocTitle")}
|
||
if not DocSerieUUID: return {"code":1,"msg":i18n.NoParameter("DocSerieUUID")}
|
||
if not Is_UUID(DocSerieUUID): return {"code":1,"msg":i18n.NoUUID("DocSerieUUID")}
|
||
if not NonLegalChar(DocTitle): return {"code":1,"msg":i18n.NotLegalChar("DocTitle")}
|
||
if len(DocTitle) > 255: return {"code":1,"msg":i18n.TooBigMsg("DocTitle","255B")}
|
||
if DocTitle != "__index" and SQLDocument.istrue("doc", ("DocTitle=%s" , DocTitle)): return {"code":1,"msg":i18n.AlreadyExist}
|
||
if not SQLDocument.istrue("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":i18n.NotExist}
|
||
if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID(): return {"code":1,"msg":i18n.NoPermission}
|
||
SQLDocument.insert("doc", DocUUID=Get16toBytes(NewUUID()), DocSerieUUID=Get16toBytes(DocSerieUUID), DocTitle=DocTitle, DocContent="", DocCreateTime=TimeFormatStr("%Y-%m-%d %H:%M:%S"))
|
||
return {"code":0,"msg":i18n.AddSuccess}
|
||
|
||
@Manage.route("/API/writedoc.api", methods=["POST"])
|
||
def UserWriteDoc():
|
||
DocUUID=flask.request.form.get("DocUUID")
|
||
DocContent=flask.request.form.get("DocContent")
|
||
if not DocUUID: return {"code":1,"msg":i18n.NoParameter("DocUUID")}
|
||
if not DocContent: return {"code":1,"msg":i18n.NoParameter("DocContent")}
|
||
if len(DocContent) > 50 * 1024 * 1024: return {"code":1,"msg":i18n.TooBigMsg("DocContent","50M")}
|
||
if not Get16toBytes(DocUUID, True): return {"code":1,"msg":i18n.NoUUID("DocUUID")}
|
||
if not SQLDocument.istrue("doc", ("DocUUID=%s", Get16toBytes(DocUUID))): return {"code":1,"msg":"DOC "+i18n.NotExist}
|
||
DocSerieUUID=GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="doc",WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))[0]["DocSerieUUID"])
|
||
if not SQLDocument.istrue("series", ("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":"SERIE "+i18n.NotExist}
|
||
if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID(): return {"code":1,"msg":i18n.NoPermission}
|
||
SQLDocument.update(DocContent=DocContent, FROM="doc", WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))
|
||
return {"code":0,"msg":i18n.AddSuccess}
|
||
|
||
@Manage.route("/API/readdoc.api", methods=["POST"])
|
||
def UserReadDoc():
|
||
DocUUID=flask.request.form.get("DocUUID")
|
||
if not DocUUID: return {"code":1,"msg":i18n.NoParameter("DocUUID")}
|
||
if not Get16toBytes(DocUUID, True): return {"code":1,"msg":i18n.NoUUID("DocUUID")}
|
||
if not SQLDocument.istrue("doc", WHERE=("DocUUID=%s", Get16toBytes(DocUUID))): return {"code":1,"msg":i18n.NotExist}
|
||
DocSerieUUID=GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="doc",WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))[0]["DocSerieUUID"])
|
||
if not SQLDocument.istrue("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":i18n.NotExist}
|
||
if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID(): return {"code":1,"msg":i18n.NoPermission}
|
||
_r=SQLDocument.selectashead(NSQL.MOD.ALL,FROM="doc",WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))[0]
|
||
return {"DocTitle": _r["DocTitle"], "DocContent": _r["DocContent"]}
|
||
|
||
@Manage.route("/API/deldoc.api", methods=["POST"])
|
||
def UserDelDoc():
|
||
DocUUID=flask.request.form.get("DocUUID")
|
||
if not DocUUID: return {"code":1,"msg":i18n.NoParameter("DocUUID")}
|
||
if not Get16toBytes(DocUUID, True): return {"code":1,"msg":i18n.NoUUID("DocUUID")}
|
||
if not SQLDocument.istrue("doc", WHERE=("DocUUID=%s", Get16toBytes(DocUUID))): return {"code":1,"msg":i18n.NotExist}
|
||
DocSerieUUID=GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="doc",WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))[0]["DocSerieUUID"])
|
||
if not SQLDocument.istrue("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":i18n.NotExist}
|
||
if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID():
|
||
return "此表单提供的系列不由cookie记录的账户管理"
|
||
SQLDocument.delete("doc", WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))
|
||
return {"code":0,"msg":i18n.DelSuccess}
|
||
|
||
|
||
|
||
from flask_wtf import FlaskForm
|
||
from flask_wtf.csrf import validate_csrf
|
||
from wtforms import SubmitField, HiddenField
|
||
from wtforms.validators import DataRequired
|
||
|
||
|
||
@Manage.route("/User/checkin.html")
|
||
def UserCheckInPage():
|
||
return flask.render_template("Manage/User/checkin.html")
|
||
|
||
@Manage.route("/API/CheckInStatus.api")
|
||
def UserCheckInStatusAPI():
|
||
_=GetELTUserConfig()["UserLastCheckInDate"]
|
||
if not _: return flask.jsonify({"code": 0, "checkin": False})
|
||
if _.date() == datetime.datetime.today().date(): return flask.jsonify({"code": 0, "checkin": True})
|
||
return flask.jsonify({"code": 0, "checkin": False})
|
||
|
||
class CheckInForm(FlaskForm):
|
||
csrf_token = HiddenField(validators=[DataRequired()])
|
||
|
||
@Manage.route("/API/CheckIn.api", methods=["POST"])
|
||
@PreRequirements(2.0)
|
||
def UserCheckInAPI():
|
||
checkin=CheckInForm()
|
||
if not checkin.validate_on_submit():
|
||
return flask.jsonify({"code": 1, "msg": i18n.CheckInError})
|
||
try: validate_csrf(checkin.csrf_token.data)
|
||
except: return flask.jsonify({"code": 1, "msg": i18n.CheckInError})
|
||
_ = GetELTUserConfig()["UserLastCheckInDate"]
|
||
if hasattr(_, "date") and _ and _.date() == datetime.datetime.today().date():
|
||
return flask.jsonify({"code": 1, "msg": i18n.AlreadyCheckIn})
|
||
WriteELTUserConfigI("UserLastCheckInDate", TimeFormatInt())
|
||
ELTUserUUID = GetELTUserUUID()
|
||
GC = -1
|
||
if (r:=GetMCMarketByGVSDSUUID(ELTUserUUID)):
|
||
GC = random.randint(0,500)
|
||
SQLMinecraft.update(FROM="server_market_balances", WHERE=("uuid=%s", r[0]["uuid"]), amount=r[0]["amount"] + GC)
|
||
SQLUsers.insert("checkin", UserUUID=Get16toBytes(ELTUserUUID), WeekFirstTime=GetWeekStartDate(), CheckInTime=TimeFormatStr())
|
||
return flask.jsonify({"code": 0, "GC": GC})
|
||
|
||
@Manage.route("/API/GetNewCheckIn.api")
|
||
@PreRequirements(2.0)
|
||
def UserGetNewCheckIn():
|
||
_r=[]
|
||
for i in SQLUsers.selectashead(NSQL.MOD.ALL, FROM="checkin", WHERE="1=1", _limit=16*3, WITH="ORDER BY CheckInTime DESC"):
|
||
if not (_u:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="usersub", WHERE=("UserUUID=%s", i["UserUUID"]))):
|
||
_r.append({"name":i18n.Cancelled, "avatar":"/assets/img/UserDefaultImg.png", "signin_time": i["CheckInTime"].strftime("%Y-%m-%d %H:%M:%S"), "firstweek_time": i["WeekFirstTime"].strftime("%Y-%m-%d")})
|
||
continue
|
||
_u=_u[0]
|
||
_r.append({"name":_u["UserName"], "avatar":f"https://ugm.gvsds.com/GetArgsUserHeadPng.api?UserUUID={GetBytesto16(_u["UserUUID"])}", "signin_time": i["CheckInTime"].strftime("%Y-%m-%d %H:%M:%S"), "firstweek_time": i["WeekFirstTime"].strftime("%Y-%m-%d")})
|
||
return {"code": 0, "data": _r}
|
||
|
||
|
||
@Manage.route("/API/GetLJUMPM.api")
|
||
def ManageGetLJUMPM():
|
||
return {"code": GetELTUserConfig()["UserLoginJump"]}
|
||
|
||
@Manage.route("/API/GetTheme.api")
|
||
def ManageGetTheme():
|
||
return {"code": GetELTUserConfig()["UserTheme"]}
|
||
|
||
@Manage.route("/API/GetPhotoViewPort.api")
|
||
def ManageGetPhotoViewPort():
|
||
return {"code": GetELTUserConfig()["UserPhotoViewPort"]}
|
||
|
||
@Manage.route("/API/SetLJUMPM.api", methods=["POST"])
|
||
def ManageSetLJUMPM():
|
||
Jump=flask.request.form.get("Jump")
|
||
if not Jump: return {"code": 1, "msg": i18n.NoParameter("Jump")}
|
||
if Jump not in ["0", "1"]: return {"code": 1, "msg": i18n.ModeError}
|
||
SQLUsers.update(UserLoginJump=int(Jump), FROM="usersub", WHERE=("UserUUID=%s", Get16toBytes(GetELTUserUUID())))
|
||
return {"code": 0, "msg": i18n.OperateSuccess}
|
||
|
||
@Manage.route("/API/SetTheme.api", methods=["POST"])
|
||
def ManageSetTheme():
|
||
Theme=flask.request.form.get("Theme")
|
||
if not Theme: return {"code": 1, "msg": i18n.NoParameter("Theme")}
|
||
if not os.path.isfile(os.path.join(TempLate, f"Manage/css/theme{str(Theme)}.css")): return {"code": 0, "msg": i18n.NoFound("ThemeCSS")}
|
||
SQLUsers.update(UserTheme=int(Theme), FROM="usersub", WHERE=("UserUUID=%s", Get16toBytes(GetELTUserUUID())))
|
||
return {"code": 0, "msg": i18n.OperateSuccess}
|
||
|
||
@Manage.route("/API/SetPhotoViewPort.api", methods=["POST"])
|
||
def ManageSetPhotoViewPort():
|
||
PhotoViewPort=flask.request.form.get("PhotoViewPort")
|
||
if not PhotoViewPort: return {"code": 1, "msg": i18n.NoParameter("PhotoViewPort")}
|
||
if PhotoViewPort not in ["0", "1"]: return {"code": 1, "msg": i18n.ModeError}
|
||
SQLUsers.update(UserPhotoViewPort=int(PhotoViewPort), FROM="usersub", WHERE=("UserUUID=%s", Get16toBytes(GetELTUserUUID())))
|
||
return {"code": 0, "msg": i18n.OperateSuccess}
|
||
|
||
@Manage.route("/css/theme.css")
|
||
def ManageThemeCSS():
|
||
return flask.Response(openr(os.path.join(TempLate, f"Manage/css/Theme{GetELTUserConfig()["UserTheme"]}.css")), mimetype="text/css")
|
||
|
||
@Manage.before_request
|
||
def ManageBeforeRequest():
|
||
#return flask.render_template("Manage/workonit.html")
|
||
allowsu=["txt", "png", "jpg", "gif", "js", "css", "eot", "svg", "tff", "woff", "woff2"]
|
||
if flask.request.url.split(".")[-1].lower() not in allowsu and not Is_ELTUser():
|
||
return flask.redirect(flask.url_for("MainLoginHTML"))
|
||
|
||
#App.jinja_env.globals.update
|
||
App.register_blueprint(Manage)
|
||
|
||
|
||
|
||
Verify=flask.Blueprint("verify", __name__, subdomain="verify",static_folder=TempLate + "/verify",static_url_path="/")
|
||
@Verify.route("/")
|
||
def VerifyIndex():
|
||
if not Is_ELTUser():
|
||
return flask.render_template("/Verify/index_de.html")
|
||
ELTUserConfig=GetELTUserConfig()
|
||
Permission=int(float(ELTUserConfig["UserPermissions"]))
|
||
PermissionWord={5: "A",4: "B",3: "C",2: "D",1: "E"}.get(Permission, "UK")
|
||
PermissionWork={5: ["系统管理员", "网络架构配置与管理", "防火墙与入侵检测系统管理", "安全事件响应与处置", "网络流量监控与分析", "最高权限"],4: ["组管理员", "网络架构配置与管理", "防火墙与入侵检测系统管理", "安全事件响应与处置", "网络流量监控与分析"],3: ["委员会成员", "可读取", "可修改", "禁止越权", "网络架构配置与管理", "防火墙与入侵检测系统管理", "安全事件响应与处置", "系统漏洞扫描与修复", "网络流量监控与分析"],2: ["组成员", "可读取", "禁止修改", "禁止越权"],1: ["用户", "可读取", "禁止修改", "禁止越权"]}.get(Permission, "UK")
|
||
PermissionWork2={5: ["允许修改全部 ELT 凭证", "可本地写入读取,可服务器写入读取"],4: ["允许修改全部 ELT 凭证", "可本地写入读取,可服务器写入读取"],3: ["允许修改部分 ELT 凭证", "可本地写入读取,可服务器写入读取"],2: ["禁止修改 ELT 凭证", "可本地写入读取"],1: ["禁止修改 ELT 凭证", "可本地写入读取"]}.get(Permission, "UK")
|
||
VerifyStatus={5: "SYSTEM OVERSEER",4: "GROUP AGENT",3: "COMMITTEE AGENT",2: "GROUP",1: "USER"}.get(Permission, "UK")
|
||
return flask.render_template("/Verify/index.html",
|
||
UserName=StrMinus(ELTUserConfig["UserName"], 20),
|
||
Permission=Permission,
|
||
PermissionWord=PermissionWord,
|
||
UserCreatime=ELTUserConfig["UserCreatime"].strftime("%Y-%m-%d %H:%M:%S"),
|
||
UserLastLoginDate=ELTUserConfig["UserLastLoginDate"].strftime("%Y-%m-%d %H:%M:%S"),
|
||
UserUUID=GetBytesto16(ELTUserConfig["UserUUID"]).upper(),
|
||
UserJob=ELTUserConfig["UserJob"],
|
||
VerifyStatus=VerifyStatus,
|
||
PermissionWork=PermissionWork,
|
||
PermissionWork2=PermissionWork2,
|
||
)
|
||
@Verify.route("/index.html")
|
||
def VerifyIndexHtml():
|
||
return flask.redirect(flask.url_for("Verify.VerifyIndex"))
|
||
App.register_blueprint(Verify) |