199 lines
6.1 KiB
Python
199 lines
6.1 KiB
Python
from time import time
|
|
|
|
from fastapi import APIRouter
|
|
|
|
from app import mongo
|
|
from app.utils.response_util import response
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/", tags=[""])
|
|
async def get_departments():
|
|
start_time = time()
|
|
|
|
departments = await mongo.departments_collection.find(
|
|
{}, {"_id": False}
|
|
).sort("id", mongo.asc).to_list(length=None)
|
|
|
|
async def build_section_tree(parent_section):
|
|
users = []
|
|
for user in parent_section.get("users", []):
|
|
user_data = await mongo.users_collection.find_one({"id": user["userId"]}, {"_id": False})
|
|
if user_data:
|
|
user["user"] = user_data
|
|
users.append(user)
|
|
|
|
parent_section["users"] = users
|
|
|
|
children = await mongo.department_sections_collection.find(
|
|
{"parentDepartmentSectionId": parent_section["id"]},
|
|
{"_id": False}
|
|
).sort("id", mongo.asc).to_list(length=None)
|
|
|
|
parent_section["sections"] = []
|
|
for child in children:
|
|
await build_section_tree(child)
|
|
parent_section["sections"].append(child)
|
|
|
|
for department in departments:
|
|
top_sections = await mongo.department_sections_collection.find(
|
|
{
|
|
"departmentId": department["id"],
|
|
"$or": [{"parentDepartmentSectionId": None}, {"parentDepartmentSectionId": {"$exists": False}}]
|
|
},
|
|
{"_id": False}
|
|
).sort("id", mongo.asc).to_list(length=None)
|
|
|
|
department["sections"] = []
|
|
for section in top_sections:
|
|
await build_section_tree(section)
|
|
department["sections"].append(section)
|
|
|
|
return response({
|
|
"departments": departments
|
|
}, start_time=start_time)
|
|
|
|
|
|
@router.post("/", tags=[""])
|
|
async def create_department(params: dict):
|
|
start_time = time()
|
|
data = params["department"]
|
|
|
|
data["id"] = await mongo.get_next_id(mongo.departments_collection)
|
|
await mongo.departments_collection.insert_one(data)
|
|
|
|
return response({"message": "Департамент создан", "ok": True}, start_time=start_time)
|
|
|
|
|
|
@router.patch("/", tags=[""])
|
|
async def update_department(params: dict):
|
|
start_time = time()
|
|
data = params["department"]
|
|
|
|
await mongo.departments_collection.update_one({"id": data["id"]}, {"$set": data})
|
|
return response({"message": "Департамент обновлён", "ok": True}, start_time=start_time)
|
|
|
|
|
|
@router.delete("/{department_id}", tags=[""])
|
|
async def delete_department(department_id: int):
|
|
start_time = time()
|
|
|
|
sections = await mongo.department_sections_collection.find(
|
|
{"departmentId": department_id}, {"_id": False}
|
|
).to_list(length=None)
|
|
|
|
for section in sections:
|
|
await delete_section_recursive(section["id"])
|
|
|
|
await mongo.departments_collection.delete_one({"id": department_id})
|
|
return response({"message": "Департамент удалён", "ok": True}, start_time=start_time)
|
|
|
|
|
|
@router.get("/section", tags=[""])
|
|
async def get_sections():
|
|
start_time = time()
|
|
department_sections = await mongo.department_sections_collection.find(
|
|
{}, {"_id": False}
|
|
).sort("id", mongo.asc).to_list(length=None)
|
|
|
|
return response({
|
|
"departmentSections": department_sections
|
|
}, start_time=start_time)
|
|
|
|
|
|
@router.post("/section", tags=[""])
|
|
async def create_section(params: dict):
|
|
start_time = time()
|
|
data = params["section"]
|
|
|
|
if "departmentId" not in data:
|
|
return response({
|
|
"message": "Необходимо выбрать департамент",
|
|
"ok": False
|
|
}, start_time=start_time)
|
|
|
|
data["id"] = await mongo.get_next_id(mongo.department_sections_collection)
|
|
await mongo.department_sections_collection.insert_one(data)
|
|
|
|
return response({
|
|
"message": "Отдел создан",
|
|
"ok": True
|
|
}, start_time=start_time)
|
|
|
|
|
|
@router.patch("/section", tags=[""])
|
|
async def update_section(params: dict):
|
|
start_time = time()
|
|
data = params["section"]
|
|
|
|
await mongo.department_sections_collection.update_one({"id": data["id"]}, {"$set": data})
|
|
return response({"message": "Отдел обновлен", "ok": True}, start_time=start_time)
|
|
|
|
|
|
@router.delete("/section/{section_id}", tags=[""])
|
|
async def delete_section(section_id: int):
|
|
start_time = time()
|
|
|
|
await delete_section_recursive(section_id)
|
|
return response({"message": "Отдел удален", "ok": True}, start_time=start_time)
|
|
|
|
|
|
@router.get("/users/{section_id}", tags=[""])
|
|
async def get_available_users(section_id: int):
|
|
start_time = time()
|
|
|
|
users = await mongo.users_collection.find(
|
|
{"isDeleted": False}, {"_id": False}
|
|
).to_list(length=None)
|
|
|
|
return response({
|
|
"users": users
|
|
}, start_time=start_time)
|
|
|
|
|
|
@router.post("/users", tags=[""])
|
|
async def add_user_to_section(params: dict):
|
|
start_time = time()
|
|
section_id = params["sectionId"]
|
|
user_id = params["userId"]
|
|
is_chief = params.get("isChief", False)
|
|
|
|
await mongo.department_sections_collection.update_one(
|
|
{"id": section_id},
|
|
{"$addToSet": {"users": {"userId": user_id, "isChief": is_chief}}}
|
|
)
|
|
|
|
return response({
|
|
"message": "Пользователь добавлен в секцию",
|
|
"ok": True
|
|
}, start_time=start_time)
|
|
|
|
|
|
@router.post("/users/delete", tags=[""])
|
|
async def delete_user_from_section(params: dict):
|
|
start_time = time()
|
|
section_id = params["sectionId"]
|
|
user_id = params["userId"]
|
|
|
|
await mongo.department_sections_collection.update_one(
|
|
{"id": section_id},
|
|
{"$pull": {"users": {"userId": user_id}}}
|
|
)
|
|
|
|
return response({
|
|
"message": "Пользователь удалён из секции",
|
|
"ok": True
|
|
}, start_time=start_time)
|
|
|
|
|
|
async def delete_section_recursive(section_id: int):
|
|
children = await mongo.department_sections_collection.find(
|
|
{"parentDepartmentSectionId": section_id}, {"_id": False}
|
|
).to_list(length=None)
|
|
|
|
for child in children:
|
|
await delete_section_recursive(child["id"])
|
|
|
|
await mongo.department_sections_collection.delete_one({"id": section_id})
|