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']) #把童话放在第一个 resp1=resp[-1] resp.remove(resp[-1]) resp.insert(0,resp1) 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)