CostEvalPlatform/api/manage_project.py

145 lines
5.1 KiB
Python
Raw Normal View History

2024-11-19 12:08:21 +00:00
# -*- coding: utf-8 -*-
# @Time : 2024/11/19 下午8:05
# @FileName: manage_project.py
# @Software: PyCharm
from fastapi import HTTPException, Response, Depends, APIRouter
from typing import Optional, Annotated
from datetime import datetime, timedelta
from jose import JWTError, jwt
from sqlalchemy import delete
2024-11-19 12:08:21 +00:00
from sqlmodel import select
from models import Tenant, User, Project, ProjectUserLink
2024-11-19 12:08:21 +00:00
from dependencies import *
from typing import List
2024-11-19 12:08:21 +00:00
router = APIRouter()
TenantRole = 1
2024-11-19 12:08:21 +00:00
# 列举所有项目
@router.get("/api/s1/project")
async def get_project(response: Response, session: SessionDep):
projects = session.query(Project).filter().all()
if not projects:
raise HTTPException(status_code=404, detail="Project not found")
return {"projects": projects}
#新增与修改项目
@router.post("/api/s1/project")
async def create_project(data: dict, session: SessionDep):
project_id = data.get("project_id")
name = data["name"]
requirement = data["requirement"]
start_time_str = data["start_time"]
deadline_str = data["deadline"]
estimators = data["estimators"]
auditors = data["auditors"]
# 验证是否缺少必要参数
if not name or not requirement or not start_time_str or not deadline_str:
raise HTTPException(status_code=400, detail="Need more name/requirement/start_time/deadline")
# 验证开始时间是否早于结束时间
start_time = datetime.strptime(start_time_str, "%Y-%m-%d")
deadline = datetime.strptime(deadline_str, "%Y-%m-%d")
if start_time > deadline:
raise HTTPException(status_code=400, detail="Start time must be before deadline")
# 验证评估审核员是否存在
query_estimators = select(User).where(User.username.in_(estimators))
users_estimators = session.exec(query_estimators).all()
query_auditors = select(User).where(User.username.in_(auditors))
users_auditors = session.exec(query_auditors).all()
# 提取出所有查询到的
existing_estimators = {user.username for user in users_estimators}
existing_auditors = {user.username for user in users_auditors}
# 验证是否所有的username都存在于数据库中
missing_usernames = (set(auditors) | set(estimators)) - existing_estimators - existing_auditors
if missing_usernames:
raise HTTPException(status_code=404, detail=f"Missing usernames:{missing_usernames}")
# 更新项目还是新增项目
if project_id:
# 查找现有项目
project = session.get(Project, project_id)
if not project:
raise HTTPException(status_code=404, detail="Project not found")
# 更新项目内容
project.name = name
project.requirement = requirement
project.start_time = start_time
project.deadline = deadline
else:
# 新增项目
project = Project(
name=name,
requirement=requirement,
start_time=start_time,
deadline=deadline,
owner_id=1 # 假设owner_id是1
)
session.add(project)
# 处理项目和用户的关联
# 先清除现有的关联
# 生成删除语句并执行
print(project_id) #测试用
stmt = delete(ProjectUserLink).where(ProjectUserLink.project_id == project.id)
session.execute(stmt)
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.refresh(project)
return {"message": "Added or updated successfully",
"information": project,
}
#删除项目
@router.delete("/api/s1/project")
async def delete_project(data : dict, session: SessionDep):
project_id = data.get("project_id")
# 权限检查:只有管理员才可以删除项目
# if current_user.role != 1:
# raise HTTPException(status_code=403, detail="Only admin users can delete projects")
if not project_id:
raise HTTPException(status_code=400, detail="Project ID is required")
# 查找项目
project = session.exec(
select(Project).where(Project.id == project_id)).first()
if not project:
raise HTTPException(status_code=404,
detail="Project not found or you do not have permission to delete this project")
# 删除与项目相关的用户链接
# 先清除现有的关联
stmt = delete(ProjectUserLink).where(ProjectUserLink.project_id == project_id)
session.execute(stmt)
# 删除项目
session.delete(project)
session.commit()
return {"detail": "Project deleted successfully"}