370 lines
15 KiB
Python
370 lines
15 KiB
Python
import pymongo
|
|
from bson import ObjectId
|
|
from fastapi import APIRouter, Depends, Request
|
|
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
import crud, schemas
|
|
from api import deps
|
|
from core.config import settings
|
|
from db import get_database
|
|
from db.ckdb import CKDrive, get_ck_db
|
|
from schemas.project import ProjectCreate
|
|
# from utils import casbin_enforcer
|
|
from utils import casbin_enforcer
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/create")
|
|
async def create(
|
|
request: Request,
|
|
data_in: ProjectCreate,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
) -> schemas.Msg:
|
|
"""创建项目"""
|
|
try:
|
|
res_project = await crud.project.create(db, data_in, current_user=request.user)
|
|
await crud.project_number.createxiangmu(db, data_in)
|
|
# 同步插入项目
|
|
# await crud.project_number.createxiangmu(db, data_in)
|
|
# 同步存入root权限中新项目的权限
|
|
user_url = await crud.user_url.get_quanxian(db,
|
|
schemas.Url_quanxian(user_id='04491842be9811eb8acdd5bd867f57d6'))
|
|
user_url['game'].append(data_in.game)
|
|
user_url['quanxian_id'].append('ab1')
|
|
user_url['quanxian'].append('root')
|
|
await crud.user_url.updata_quanxian(db, schemas.Url_quanxian(user=user_url['user'], user_id=user_url['user_id'],
|
|
game=user_url['game'],
|
|
quanxian_id=user_url['quanxian_id'],
|
|
quanxian=user_url['quanxian']))
|
|
except pymongo.errors.DuplicateKeyError:
|
|
return schemas.Msg(code=-1, msg='项目名已存在', data='项目名已存在')
|
|
|
|
folder = schemas.FolderCreate(
|
|
name='未分组',
|
|
project_id=res_project.inserted_id,
|
|
cat='kanban',
|
|
pid=res_project.inserted_id,
|
|
)
|
|
await crud.folder.create(db, folder, user_id=current_user.id)
|
|
folder = schemas.FolderCreate(
|
|
name='共享给我的',
|
|
project_id=res_project.inserted_id,
|
|
cat='kanban',
|
|
pid=res_project.inserted_id,
|
|
)
|
|
await crud.folder.create(db, folder, user_id=current_user.id)
|
|
|
|
# # 创建全部数据权限
|
|
# data_auth = schemas.DataAuthCreate(name='全部', data=['*'])
|
|
# await crud.data_auth.create(db, data_auth, data_in.game)
|
|
|
|
# 新建项目管理员权限
|
|
# role_name = f'{data_in.game}_admin'
|
|
# role_dom = data_in.game
|
|
# casbin_enforcer.add_policy(role_name, role_dom, '*', '*')
|
|
# await crud.authority.create(db, 'p', role_name, role_dom, '*', '*')
|
|
# 添加角色
|
|
# await crud.authority.create(db, 'g', settings.SUPERUSER_NAME, role_name, '*', '*', role_name='系统项目管理员', game='*')
|
|
# # 添加数据权限
|
|
# await crud.authority.set_data_auth(db, schemas.DataAuthSet(username=request.user.username, data_auth_id='*'),
|
|
# game=data_in.game, v1=role_name)
|
|
return schemas.Msg(code=0, msg='创建成功')
|
|
|
|
|
|
@router.get("/")
|
|
async def read_project(request: Request,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
"""查看自己拥有的项目"""
|
|
if request.user.username == 'root':
|
|
resp = await crud.project.all_game(db)
|
|
resp = sorted(resp, key=lambda x: x.get('sort') or 999)
|
|
else:
|
|
# game_list = casbin_enforcer.get_domains_for_user(request.user.username)
|
|
# resp = await crud.project.get_my_game(db, game_list)
|
|
project_data = await crud.user_url.get_quanxian(db, schemas.Url_quanxian(user_id=request.user.id))
|
|
resp = await crud.project.get_my_game(db, project_data['game'])
|
|
return schemas.Msg(code=0, msg='ok', data=resp)
|
|
#获取项目名和渠道名project_name
|
|
@router.get("/project_name")
|
|
async def project_name(request: Request,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
if request.user.username == 'root':
|
|
res = await crud.project_number.all_xiangmu(db)
|
|
for i in res:
|
|
i['_id'] = str(i['_id'])
|
|
return schemas.Msg(code=0,msg='ok',data=res)
|
|
#添加项目名,渠道名
|
|
@router.post("/add_project_name")
|
|
async def add_project_name(request: Request,
|
|
data_in: schemas.ProjectnumberInsert,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)):
|
|
#插入数据
|
|
#await crud.project_number.create(db, data_in)
|
|
#修改数据
|
|
await crud.project_number.update(db, data_in)
|
|
return schemas.Msg(code=0, msg='修改成功', data=True)
|
|
@router.get("/detail")
|
|
async def detail(request: Request,
|
|
game: str,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
ck: CKDrive = Depends(get_ck_db),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
"""查看项目信息"""
|
|
res = await crud.project.find_one(db, {'game': game})
|
|
event_count = await ck.count(game, 'event')
|
|
user_count = await ck.count(game, 'user_view')
|
|
event_type_count = await ck.distinct_count(game, 'event', '#event_name')
|
|
event_attr_count = await ck.field_count(db=game, tb='event')
|
|
user_attr_count = await ck.field_count(db=game, tb='user_view')
|
|
|
|
res['event_count'] = event_count
|
|
res['user_count'] = user_count
|
|
res['event_type_count'] = event_type_count
|
|
res['event_attr_count'] = event_attr_count
|
|
res['user_attr_count'] = user_attr_count
|
|
return schemas.Msg(code=0, msg='ok', data=res)
|
|
|
|
|
|
@router.post("/rename")
|
|
async def rename_project(request: Request,
|
|
game: str,
|
|
data_in: schemas.ProjectRename,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
"""修改项目名"""
|
|
try:
|
|
res = await crud.project.rename(db, data_in)
|
|
except pymongo.errors.DuplicateKeyError:
|
|
return schemas.Msg(code=-1, msg='项目名已存在')
|
|
return schemas.Msg(code=0, msg='ok', data=res)
|
|
|
|
|
|
@router.post("/add_members")
|
|
async def add_members(request: Request,
|
|
game: str,
|
|
data_in: schemas.ProjectAddMember,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
"""项目添加成员"""
|
|
|
|
for item in data_in.members:
|
|
# casbin_enforcer.add_grouping_policy(item.username, item.role_name, game)
|
|
# # 设置数据权限
|
|
# await crud.authority.set_data_auth(db,
|
|
# schemas.DataAuthSet(username=item.username, data_auth_id=item.data_auth_id),
|
|
# game)
|
|
|
|
folder = schemas.FolderCreate(
|
|
name='未分组',
|
|
project_id=data_in.project_id,
|
|
cat='kanban',
|
|
pid=data_in.project_id,
|
|
)
|
|
await crud.folder.create(db, folder, user_id=item.user_id)
|
|
|
|
await crud.project.add_members(db, schemas.ProjectMember(project_id=data_in.project_id,
|
|
members=[item.username for item in data_in.members]))
|
|
|
|
return schemas.Msg(code=0, msg='ok', data=data_in)
|
|
@router.post("/import_member")
|
|
async def import_member(request: Request,
|
|
game:str,
|
|
data_in:schemas.Import_project,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
"""成员管理中的导入其他项目的成员到本项目中"""
|
|
res=await crud.user_url.get_all(db)
|
|
for i in res:
|
|
for nu in range(len(i['game'])):
|
|
if data_in.games == i['game'][nu] and game not in i['game']:
|
|
i['game'].append(game)
|
|
i['quanxian_id'].append(i['quanxian_id'][nu])
|
|
i['quanxian'].append(i['quanxian'][nu])
|
|
await crud.user_url.updata_quanxian(db,schemas.Url_quanxian(game=i['game'],user=i['user'],user_id=i['user_id'],quanxian_id=i['quanxian_id'],
|
|
quanxian=i['quanxian']))
|
|
|
|
return schemas.Msg(code=0, msg='ok',data='' )
|
|
|
|
@router.post("/edit_member")
|
|
async def edit_member(request: Request,
|
|
game: str,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
"""编辑成员权限 角色和数据"""
|
|
|
|
pass
|
|
return schemas.Msg(code=0, msg='ok', )
|
|
|
|
|
|
#
|
|
#
|
|
@router.get("/members")
|
|
async def members(request: Request,
|
|
game: str,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
"""查看项目成员"""
|
|
# data = casbin_enforcer.get_all_users_by_domain(game)
|
|
# names = []
|
|
# role_ids = []
|
|
# for item in data:
|
|
# names.append(item['username'])
|
|
# role_ids.append(item['role_id'])
|
|
# users = await crud.user.get_by_users(db, {'name': {'$in': names}})
|
|
# roles = await crud.role.find_ids(db, role_ids)
|
|
# users = {item.name: item.dict() for item in users.data}
|
|
# roles = {item['_id']: item['name'] for item in roles}
|
|
# res = []
|
|
# for item in data:
|
|
# username = item['username']
|
|
# role_id = item['role_id']
|
|
# try:
|
|
# res.append({
|
|
# **users[username],
|
|
# 'role': roles[role_id],
|
|
# 'role_id': role_id,
|
|
# })
|
|
# except:
|
|
# pass
|
|
# # res.append({
|
|
# # **users[username],
|
|
# # 'role': roles[role_id],
|
|
# # 'role_id': role_id,
|
|
# # })
|
|
# return schemas.Msg(code=0, msg='ok', data=res)
|
|
res = await crud.user_url.get_all(db)
|
|
# 符合当前项目权限的用户
|
|
names = []
|
|
# 符合当前项目权限的用户的对应权限级别
|
|
quanxian = {}
|
|
quanxian_id = {}
|
|
for i in res:
|
|
for nu in range(len(i['game'])):
|
|
if game == i['game'][nu]:
|
|
names.append(i['user'])
|
|
quanxian[i['user']] = i['quanxian'][nu]
|
|
quanxian_id[i['user']] = i['quanxian_id'][nu]
|
|
users = await crud.user.get_by_users(db, {'name': {'$in': names}})
|
|
data = []
|
|
for use in users.data:
|
|
use = use.dict()
|
|
use['role'] = quanxian[use['name']]
|
|
use['role_id'] = quanxian[use['name']]
|
|
data.append(use)
|
|
return schemas.Msg(code=0, msg='ok', data=data)
|
|
# @router.post("/del_member")
|
|
# async def members(request: Request,
|
|
# game: str,
|
|
# data_in: schemas.ProjectDelMember,
|
|
# db: AsyncIOMotorDatabase = Depends(get_database),
|
|
# current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
# ):
|
|
# """删除项目成员"""
|
|
# # casbin_enforcer.delete_roles_for_user_in_domain(data_in.username, data_in.role, game)
|
|
# await crud.project.del_members(db, data_in)
|
|
# # await crud.authority.delete(db, ptype='g', v2=game, v0=data_in.username)
|
|
# return schemas.Msg(code=0, msg='ok')
|
|
|
|
|
|
@router.post("/clean")
|
|
async def read_kanban(
|
|
data_in: schemas.ProjectClean,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
"""
|
|
清理项目 删除项目所有内容
|
|
:param data_in:
|
|
:param db:
|
|
:param current_user:
|
|
:return:
|
|
"""
|
|
# 删除 报表
|
|
await crud.report.delete(db, {'project_id': data_in.project_id})
|
|
# 删除 空间
|
|
await crud.space.delete(db, {'project_id': data_in.project_id})
|
|
# 删除 文件夹
|
|
await crud.folder.delete(db, {'project_id': data_in.project_id})
|
|
# 删除 看板
|
|
await crud.dashboard.delete(db, {'project_id': data_in.project_id})
|
|
|
|
return schemas.Msg(code=0, msg='ok')
|
|
|
|
|
|
@router.post("/kanban")
|
|
async def read_kanban(
|
|
data_in: schemas.ProjectKanban,
|
|
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
|
):
|
|
"""获取自己的看板"""
|
|
res = {'kanban': [], 'spaces': []}
|
|
# 我的看板
|
|
kanban = await crud.folder.read_folder(db, project_id=data_in.id, user_id=current_user.id, cat='kanban')
|
|
|
|
for item in kanban:
|
|
res['kanban'].append({
|
|
'name': item['name'],
|
|
'children': [],
|
|
'_id': item['_id']
|
|
})
|
|
async for d in crud.dashboard.find(db, {'pid': item['_id']}).sort([('sort', 1)]):
|
|
res['kanban'][-1]['children'].append({
|
|
'name': d['name'],
|
|
'_id': d['_id']
|
|
})
|
|
|
|
# 我的空间
|
|
where = {
|
|
'project_id': data_in.id,
|
|
'members.user_id': current_user.id
|
|
# '$or': [{'rw_members': current_user.id}, {'r_members': current_user.id}]
|
|
}
|
|
spaces = await crud.space.find_many(db, where)
|
|
# 空间 文件夹 看板
|
|
for item in spaces:
|
|
res['spaces'].append({
|
|
'name': item['name'],
|
|
'children': [],
|
|
'_id': item['_id']
|
|
})
|
|
authority = {item['user_id']: item['authority'] for item in item['members']}
|
|
res['spaces'][-1]['authority'] = authority.get(current_user.id, 'r')
|
|
|
|
for f in await crud.folder.find_many(db, {'pid': item['_id']}):
|
|
res['spaces'][-1]['children'].append({
|
|
'name': f['name'],
|
|
'_id': f['_id'],
|
|
'children': [],
|
|
'isFolder': True
|
|
})
|
|
|
|
async for d in crud.dashboard.find(db, {'pid': item['_id']}).sort([('sort', 1)]):
|
|
res['spaces'][-1]['children'][-1]['children'].append({
|
|
'name': d['name'],
|
|
'_id': d['_id']
|
|
})
|
|
|
|
# 空间 看板
|
|
async for d in crud.dashboard.find(db, {'pid': item['_id']}).sort([('sort', 1)]):
|
|
res['spaces'][-1]['children'].append({
|
|
'name': d['name'],
|
|
'_id': d['_id'],
|
|
'user_id':d['user_id'],
|
|
'isFolder': False
|
|
})
|
|
|
|
return schemas.Msg(code=0, msg='ok', data=res)
|