project后端问题修改完成。

This commit is contained in:
高子兴 2024-11-21 16:38:41 +08:00
parent 7077658a9b
commit 2d597bdeae

View File

@ -3,6 +3,7 @@
# @FileName: manage_project.py # @FileName: manage_project.py
# @Software: PyCharm # @Software: PyCharm
from datetime import datetime from datetime import datetime
from typing import List
from fastapi import APIRouter from fastapi import APIRouter
from sqlalchemy import delete from sqlalchemy import delete
@ -56,7 +57,7 @@ async def create_project(data: dict, session: SessionDep, current_user: User = D
if current_user.role != 1: if current_user.role != 1:
raise HTTPException(status_code=403, detail="Only Tenant admin users can add or update projects.") raise HTTPException(status_code=403, detail="Only Tenant admin users can add or update projects.")
project_id = data.get("project_id") # project_id = data.get("project_id")
name = data.get("name") name = data.get("name")
requirement = data.get("requirement") requirement = data.get("requirement")
start_time_str = data.get("start_time") start_time_str = data.get("start_time")
@ -82,39 +83,26 @@ async def create_project(data: dict, session: SessionDep, current_user: User = D
# 验证是否有传入评估/审核员 # 验证是否有传入评估/审核员
if not estimators or not auditors: if not estimators or not auditors:
raise HTTPException(status_code=400, detail="Need more estimators or auditors") raise HTTPException(status_code=400, detail="Need more estimators or auditors")
users: List[User] = []
# 验证评估审核员是否存在 # 验证评估审核员是否存在
query_estimators = select(User).where(User.username.in_(estimators)) for username in estimators + auditors:
users_estimators = session.exec(query_estimators).all() query_estimator = select(User).where(User.username == username)
query_auditors = select(User).where(User.username.in_(auditors)) if user := session.exec(query_estimator).first():
users_auditors = session.exec(query_auditors).all() users.append(user)
# 提取出所有查询到的
existing_estimators = {user.username for user in users_estimators}
existing_auditors = {user.username for user in users_auditors}
# 验证是否所有的username都存在于数据库中 project = session.exec(select(Project).where(Project.name == name)).first()
missing_usernames = (set(auditors) | set(estimators)) - existing_estimators - existing_auditors if project and project.owner_id != current_user.tenant_id:
raise HTTPException(status_code=403, detail="You do not have permission to modify this project.")
if missing_usernames:
raise HTTPException(status_code=404, detail=f"Missing usernames:{missing_usernames}")
# 更新项目还是新增项目 # 更新项目还是新增项目
if project_id: if project:
# 查找现有项目
project = session.get(Project, project_id)
if not project:
raise HTTPException(status_code=404, detail="Project not found")
# 更新项目内容 # 更新项目内容
project.name = name project.name = name
project.requirement = requirement project.requirement = requirement
project.start_time = start_time project.start_time = start_time
project.deadline = deadline project.deadline = deadline
else: else:
# 新增项目
exist_project = session.exec(select(Project).where(Project.name == name)).first()
if exist_project:
raise HTTPException(status_code=404, detail="Project already exists")
project = Project( project = Project(
name=name, name=name,
requirement=requirement, requirement=requirement,
@ -122,27 +110,14 @@ async def create_project(data: dict, session: SessionDep, current_user: User = D
deadline=deadline, deadline=deadline,
owner_id=current_user.tenant_id, owner_id=current_user.tenant_id,
) )
session.add(project)
# 处理项目和用户的关联 # 处理项目和用户的关联
# 先清除现有的关联 # 先清除现有的关联
# 生成删除语句并执行 # 生成删除语句并执行
stmt = delete(ProjectUserLink).where(ProjectUserLink.project_id == project.id) project.users = []
session.execute(stmt) project.users = users
session.commit() # 提交事务 session.add(project)
session.commit()
# 重新建立与评估员和审核员的关系
for username in estimators:
user = next((user for user in users_estimators if user.username == username), None)
if user:
project_user_link = ProjectUserLink(project_id=project.id, user_id=user.id)
session.add(project_user_link)
for username in auditors:
user = next((user for user in users_auditors if user.username == username), None)
if user:
project_user_link = ProjectUserLink(project_id=project.id, user_id=user.id)
session.add(project_user_link)
# 提交事务 # 提交事务
session.commit() session.commit()
@ -155,11 +130,12 @@ async def create_project(data: dict, session: SessionDep, current_user: User = D
# 删除项目 # 删除项目
@router.delete("/api/s1/project") @router.delete("/api/s1/project")
async def delete_project(data: dict, session: SessionDep, current_user: User = Depends(get_current_user)): async def delete_project(name: str, session: SessionDep, current_user: User = Depends(get_current_user)):
if current_user.role != 1: if current_user.role != 1:
raise HTTPException(status_code=403, detail="Only Tenant admin users can delete projects.") raise HTTPException(status_code=403, detail="Only Tenant admin users can delete projects.")
project_name = data.get("name") # project_name = data.get("name")
project_name = name
if not project_name: if not project_name:
raise HTTPException(status_code=400, detail="Project name is required") raise HTTPException(status_code=400, detail="Project name is required")