diff --git a/api/api_v1/api.py b/api/api_v1/api.py index d00bbc4..4401f3a 100644 --- a/api/api_v1/api.py +++ b/api/api_v1/api.py @@ -6,7 +6,7 @@ from .endpoints import space from .endpoints import dashboard from .endpoints import report from .endpoints import authority -from .endpoints import table_struct +from .endpoints import data_mana from .endpoints import query from .endpoints import data_auth @@ -22,6 +22,6 @@ api_router.include_router(report.router, tags=["报表接口"], prefix='/report' api_router.include_router(authority.router, tags=["权限管理接口"], prefix='/authority') api_router.include_router(data_auth.router, tags=["数据权限"], prefix='/data_auth') -api_router.include_router(table_struct.router, tags=["表结构"], prefix='/table_struct') +api_router.include_router(data_mana.router, tags=["数据管理"], prefix='/data_mana') api_router.include_router(query.router, tags=["ck"], prefix='/ck') diff --git a/api/api_v1/endpoints/authority.py b/api/api_v1/endpoints/authority.py index 4aba895..7b57369 100644 --- a/api/api_v1/endpoints/authority.py +++ b/api/api_v1/endpoints/authority.py @@ -67,25 +67,41 @@ async def get_user_data_auth(request: Request, return schemas.Msg(code=0, msg='ok', data=data) -@router.get('/get_users_data_auth') -async def get_users_data_auth(request: Request, - game: str = Depends(deps.get_game_project), - db: AsyncIOMotorDatabase = Depends(get_database), - ck: CKDrive = Depends(get_ck_db), - current_user: schemas.UserDB = Depends(deps.get_current_user) - ) -> schemas.Msg: - """获取当前项目所有用户数据权限""" - # data_auth = await crud.authority.get_data_auth(db, username=request.user.name, game=game) - # if not data_auth: - # values = await ck.distinct(game, 'event', '#event_name') - # return schemas.Msg(code=0, msg='ok', data={ - # 'data': values, - # 'game': game, - # 'name': '全部事件' - # }) - # data_auth_id = data_auth['data_auth_id'] - # data = await crud.data_auth.get(data_auth_id) - return schemas.Msg(code=0, msg='ok') +# @router.get('/get_users_data_auth') +# async def get_users_data_auth(request: Request, +# game: str = Depends(deps.get_game_project), +# db: AsyncIOMotorDatabase = Depends(get_database), +# ck: CKDrive = Depends(get_ck_db), +# current_user: schemas.UserDB = Depends(deps.get_current_user) +# ) -> schemas.Msg: +# """获取当前项目所有用户数据权限""" +# +# roles = await crud.authority.find_many(db, ptype='g', v2=game) +# for item in roles: +# user = item['v0'] +# data_auth = await crud.authority.get_data_auth(db, username=request.user.name, game=game) +# if not data_auth: +# values = await ck.distinct(game, 'event', '#event_name') +# return schemas.Msg(code=0, msg='ok', data={ +# 'data': values, +# 'game': game, +# 'name': '全部事件' +# }) +# data_auth_id = data_auth['data_auth_id'] +# data = await crud.data_auth.get(data_auth_id) +# return schemas.Msg(code=0, msg='ok', data=data) +# +# # data_auth = await crud.authority.get_data_auth(db, username=request.user.name, game=game) +# # if not data_auth: +# # values = await ck.distinct(game, 'event', '#event_name') +# # return schemas.Msg(code=0, msg='ok', data={ +# # 'data': values, +# # 'game': game, +# # 'name': '全部事件' +# # }) +# # data_auth_id = data_auth['data_auth_id'] +# # data = await crud.data_auth.get(data_auth_id) +# return schemas.Msg(code=0, msg='ok') @router.post("/add_role") @@ -107,7 +123,8 @@ async def add_role(request: Request, # 角色有的接口权限 for obj in data_in.role_api: casbin_enforcer.add_policy(data_in.role_name, role_dom, obj, '*') - await crud.authority.create(db, 'p', data_in.role_name, role_dom, obj, '*', api_name=api_dict.get(obj)) + await crud.authority.update_one(db, {'ptype': 'p', 'v0': data_in.role_name, 'v1': role_dom, 'v2': obj}, + {'$set': {'api_name': api_dict.get(obj)}}) # 管理员默认拥有该角色 方便从db中读出 await crud.authority.create(db, 'g', settings.SUPERUSER_NAME, data_in.role_name, '*', '*', @@ -154,9 +171,16 @@ async def add_account(request: Request, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: + """添加账号""" + + # 用户名不能与角色名重复 roles = casbin_enforcer.get_all_roles() - if set(data_in.accounts) & set(roles): - return schemas.Msg(code=-1, msg='已存在', data=list(set(data_in.accounts) & set(roles))) + accounts = {item.username for item in data_in.accounts} + # 用户名不能与已存在的重复 + exists_user = await crud.user.get_all_user(db) + if accounts & set(roles) or accounts & set(exists_user): + return schemas.Msg(code=-1, msg='已存在', data=list(set(accounts) & set(roles) | accounts & set(exists_user))) + """创建账号 并设置角色""" for item in data_in.accounts: account = schemas.UserCreate(name=item.username, password=settings.DEFAULT_PASSWORD) @@ -166,7 +190,13 @@ async def add_account(request: Request, return schemas.Msg(code=-1, msg='用户名已存在') casbin_enforcer.add_grouping_policy(item.username, item.role_name, game) - await crud.authority.create(db, 'g', 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) + + # 添加到项目成员 + await crud.project.add_members(db, schemas.ProjectMember(project_id=data_in.project_id, members=list(accounts))) return schemas.Msg(code=0, msg='ok') @@ -193,17 +223,17 @@ async def all_role(request: Request, """获取域内所有角色""" roles = await crud.authority.find_many(db, role_name={'$exists': 1}, game=game) - dom_data = [{'role': item['v1'], 'name': item['role_name'], 'id': str(item['_id'])} for item in roles] + dom_data = [{'role': item['v1'], 'title': item['role_name'], 'id': str(item['_id'])} for item in roles] for item in dom_data: q = await crud.authority.get_role_dom_authority(db, item['role'], game, api_data) - item['authority'] = q + item['authority'] = [{'title': k, 'child': v} for k, v in q.items()] # 获取系统角色 roles = await crud.authority.find_many(db, role_name={'$exists': 1}, game='*') - sys_data = [{'role': item['v1'], 'name': item['role_name'], 'id': str(item['_id'])} for item in roles] + sys_data = [{'role': item['v1'], 'title': item['role_name'], 'id': str(item['_id'])} for item in roles] for item in sys_data: q = await crud.authority.get_role_dom_authority(db, item['role'], dom='*', api_data=api_data) - item['authority'] = q + item['authority'] = [{'title': k, 'child': v} for k, v in q.items()] data = { 'dom_role': dom_data, @@ -211,38 +241,6 @@ async def all_role(request: Request, } return schemas.Msg(code=0, msg='ok', data=data) -# @router.get("/all_role") -# async def all_role(request: Request, -# db: AsyncIOMotorDatabase = Depends(get_database), -# current_user: schemas.UserDB = Depends(deps.get_current_user) -# ) -> schemas.Msg: -# """获取所有角色 和 角色权限""" -# routes = {} -# for item in request.app.routes: -# routes[item.path] = item.description if hasattr(item, 'description') else item.name -# roles = casbin_enforcer.get_all_roles() -# permissions = {} -# for role in roles: -# for _, path, _ in casbin_enforcer.get_permissions_for_user(role): -# permissions.setdefault(role, []) -# if path == '*': -# permissions[role].clear() -# -# permissions[role] = [{ -# 'path': k, -# 'name': v -# } for k, v in routes.items()] -# break -# -# if path in routes: -# permissions[role].append( -# { -# 'path': path, -# 'name': routes[path] -# } -# ) -# -# return schemas.Msg(code=0, msg='ok', data={'roles': roles, 'permissions': permissions}) # @router.post("/set_role") diff --git a/api/api_v1/endpoints/data_auth.py b/api/api_v1/endpoints/data_auth.py index 9cb5424..e8e67cf 100644 --- a/api/api_v1/endpoints/data_auth.py +++ b/api/api_v1/endpoints/data_auth.py @@ -1,5 +1,6 @@ import pymongo from fastapi import APIRouter, Depends, Request +from fastapi.encoders import jsonable_encoder from motor.motor_asyncio import AsyncIOMotorDatabase import crud, schemas from core.config import settings @@ -7,6 +8,7 @@ from core.security import get_password_hash from db import get_database from api import deps +from db.ckdb import CKDrive, get_ck_db from utils import casbin_enforcer router = APIRouter() @@ -24,16 +26,46 @@ async def add_data_auth(request: Request, return schemas.Msg(code=0, msg='ok', data=data_id) -@router.get("/data_auth") +@router.post('/edit_data_auth') +async def edit_data_auth(request: Request, + data_id: schemas.DataAuthEdit, + game: str = Depends(deps.get_game_project), + db: AsyncIOMotorDatabase = Depends(get_database), + current_user: schemas.UserDB = Depends(deps.get_current_user) + ) -> schemas.Msg: + """修改数据权限""" + await crud.data_auth.edit_data_auth(db, data_id) + return schemas.Msg(code=0, msg='ok', data=data_id) + + +@router.get('/all_event') +async def all_event(request: Request, + game: str = Depends(deps.get_game_project), + ck: CKDrive = Depends(get_ck_db), + db: AsyncIOMotorDatabase = Depends(get_database), + current_user: schemas.UserDB = Depends(deps.get_current_user) + ) -> schemas.Msg: + """获取所有事件""" + values = await ck.distinct(game, 'event', '#event_name') + values.sort() + return schemas.Msg(code=0, msg='ok', data=values) + + +@router.get("/list") async def data_authority(request: Request, db: AsyncIOMotorDatabase = Depends(get_database), game: str = Depends(deps.get_game_project), + ck: CKDrive = Depends(get_ck_db), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """获取前项目数据权限""" - + total_event = await ck.distinct_count(game, 'event', '#event_name') data = await crud.data_auth.get_game_data_auth(db, game) for item in data: item['id'] = str(item['_id']) del item['_id'] + item['data_range'] = f'{len(item["data"])}/{total_event}' + + + data = jsonable_encoder(data) return schemas.Msg(code=0, msg='ok', data=data) diff --git a/api/api_v1/endpoints/data_mana.py b/api/api_v1/endpoints/data_mana.py new file mode 100644 index 0000000..91c52ec --- /dev/null +++ b/api/api_v1/endpoints/data_mana.py @@ -0,0 +1,60 @@ +import json + +from aioredis import Redis +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.redisdb import get_redis_pool + +router = APIRouter() + +__all__ = 'router', + + +@router.get("/list") +async def read_data_attr( + request: Request, + game: str, + cat: str, + db: AsyncIOMotorDatabase = Depends(get_database), + rdb: Redis = Depends(get_redis_pool), + current_user: schemas.UserDB = Depends(deps.get_current_user) +) -> schemas.Msg: + """属性列表""" + data = await rdb.get(f'{game}_{cat}') + data = json.loads(data) + res = [] + + data_attr = await crud.data_attr.find_many(db, game=game, cat=cat) + data_attr = {item['name']: item for item in data_attr} + + for k, v in data.items(): + res.append( + {'name': k, + 'data_type': settings.CK_TYPE_DICT.get(v), + 'show_name': data_attr.get(k, {}).get('show_name', ''), + 'is_show': data_attr.get(k, {}).get('is_show', True), + 'attr_type': '预置属性' if k.startswith('#') else '自定义属性', + 'unit': '' + } + ) + return schemas.Msg(code=0, msg='ok', data=res) + + +@router.post("/edit") +async def edit_data_attr( + request: Request, + game: str, + data_in: schemas.DataAttrEdit, + db: AsyncIOMotorDatabase = Depends(get_database), + rdb: Redis = Depends(get_redis_pool), + current_user: schemas.UserDB = Depends(deps.get_current_user) +) -> schemas.Msg: + """编辑属性""" + await crud.data_attr.edit_data_attr(db, game, data_in) + return schemas.Msg(code=0, msg='ok', data=data_in) diff --git a/api/api_v1/endpoints/project.py b/api/api_v1/endpoints/project.py index 09ecd12..e1d9758 100644 --- a/api/api_v1/endpoints/project.py +++ b/api/api_v1/endpoints/project.py @@ -1,4 +1,5 @@ import pymongo +from bson import ObjectId from fastapi import APIRouter, Depends, Request from motor.motor_asyncio import AsyncIOMotorDatabase import crud, schemas @@ -107,23 +108,43 @@ async def rename_project(request: Request, return schemas.Msg(code=0, msg='ok', data=res) +# todo 要修改 @router.post("/add_members") async def add_members(request: Request, game: str, - data_in: schemas.ProjectMember, + data_in: schemas.ProjectAddMember, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """项目添加成员""" - # - await crud.project.add_members(db, data_in) for item in data_in.members: - casbin_enforcer.add_grouping_policy(item.username, item.role, game) - await crud.authority.create(db, 'g', item.username, item.role, game) + 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) + + 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("/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, @@ -132,14 +153,27 @@ async def members(request: Request, ): """查看项目成员""" roles = await crud.authority.find_many(db, ptype='g', v2=game) - data = {item['v0']: {'name': item['v0'], 'role': item['v1']} for item in roles} + data = dict() + data_auth_ids = set() + for item in roles: + data[item['v0']] = {'name': item['v0'], + 'role': item['v1'], + 'data_auth_id': item.get('data_auth_id') + } + if item.get('data_auth_id'): + data_auth_ids.add(ObjectId(item.get('data_auth_id'))) + + data_auth = {str(m['_id']): m['title'] async for m in + crud.data_auth.find(db, {'_id': {'$in': list(data_auth_ids)}}, {'title': 1})} + data['root'] = {'name': 'root', 'role': '超级管理员'} users = await crud.user.get_by_users(db, name={'$in': list(data.keys())}) res = [] for user in users.data: res.append({ **user.dict(), - 'role': data[user.name]['role'] + 'role': data[user.name]['role'], + 'data_auth': data_auth.get(data[user.name].get('data_auth_id'), '全部事件') }) return schemas.Msg(code=0, msg='ok', data=res) @@ -153,8 +187,8 @@ async def members(request: Request, current_user: schemas.UserDB = Depends(deps.get_current_user) ): """删除项目成员""" - casbin_enforcer.delete_user(data_in.username) - await crud.project.del_members(data_in) + 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') diff --git a/api/api_v1/endpoints/query.py b/api/api_v1/endpoints/query.py index 37df7c0..c7248e1 100644 --- a/api/api_v1/endpoints/query.py +++ b/api/api_v1/endpoints/query.py @@ -31,3 +31,16 @@ async def query( # data, columns = await ckdb.execute(data_in.sql, with_column_types=True, columnar=True) # df = pd.DataFrame({col[0]: d for d, col in zip(data, columns)}) return schemas.Msg(code=0, msg='ok', data=data_in) + + +@router.post("/event_model") +async def event_model( + request: Request, + data_in: schemas.CkQuery, + ckdb: CKDrive = Depends(get_ck_db), + current_user: schemas.UserDB = Depends(deps.get_current_user) +) -> schemas.Msg: + """ json解析 sql 查询""" + # data, columns = await ckdb.execute(data_in.sql, with_column_types=True, columnar=True) + # df = pd.DataFrame({col[0]: d for d, col in zip(data, columns)}) + return schemas.Msg(code=0, msg='ok', data=data_in) diff --git a/api/api_v1/endpoints/table_struct.py b/api/api_v1/endpoints/table_struct.py deleted file mode 100644 index 9b24848..0000000 --- a/api/api_v1/endpoints/table_struct.py +++ /dev/null @@ -1,23 +0,0 @@ -import json - -from aioredis import Redis -from fastapi import APIRouter, Depends, Request -import crud, schemas - -from api import deps -from db.redisdb import get_redis_pool - -router = APIRouter() - - -@router.post("/") -async def read_table_struct( - request: Request, - game: str, - data_in: schemas.GetTable, - rdb: Redis = Depends(get_redis_pool), - current_user: schemas.UserDB = Depends(deps.get_current_user) -) -> schemas.Msg: - """获取表结构""" - data = await rdb.get(f'{data_in.game}_{data_in.name}') - return schemas.Msg(code=0, msg='ok', data=json.loads(data)) diff --git a/api/api_v1/endpoints/user.py b/api/api_v1/endpoints/user.py index 46350e6..acf4350 100644 --- a/api/api_v1/endpoints/user.py +++ b/api/api_v1/endpoints/user.py @@ -76,7 +76,10 @@ async def reset_password(request: Request, """ 修改其他人密码 """ - await crud.user.reset_password(db, data_in) + try: + await crud.user.reset_password(db, data_in) + except Exception as e: + return schemas.Msg(code=0, msg='修改失败', data={'username': data_in}) return schemas.Msg(code=0, msg='ok') diff --git a/core/config.py b/core/config.py index 40b10dc..0c31cab 100644 --- a/core/config.py +++ b/core/config.py @@ -38,6 +38,42 @@ class Settings(BaseSettings): CK_CONFIG = {'host': '119.29.176.224', 'send_receive_timeout': 30} + CK_TYPE_DICT = {"DateTime('UTC')": 'datetime', + "Nullable(DateTime('UTC'))": 'datetime', + "DateTime()": 'datetime', + + "Nullable(IPv4)": 'ip', + "IPv4": 'ip', + + "String": 'string', + "Nullable(String)": 'string', + + "Nullable(UInt8)": 'int', + "UInt8": 'string', + + "Nullable(Int8)": 'int', + "Int8": 'string', + + "Nullable(UInt16)": 'int', + "UInt16": 'string', + + "Nullable(Int16)": 'int', + "Int16": 'string', + + "Nullable(UInt32)": 'int', + "UInt32": 'string', + + "Nullable(UInt64)": 'int', + "UInt64": 'string', + + "Nullable(Int64)": 'int', + "Int64": 'string', + + "Array(String)": 'array', + + "Nullable(Float)": 'float', + "Float": 'float', } + class Config: case_sensitive = True diff --git a/crud/__init__.py b/crud/__init__.py index c604fe7..31dc7e2 100644 --- a/crud/__init__.py +++ b/crud/__init__.py @@ -6,3 +6,4 @@ from .crud_dashboard import dashboard from .crud_report import report from .crud_authority import authority from .crud_data_auth import data_auth +from .crud_data_attr import data_attr diff --git a/crud/base.py b/crud/base.py index e1a229e..eab987a 100644 --- a/crud/base.py +++ b/crud/base.py @@ -8,7 +8,7 @@ class CRUDBase: self.coll_name = coll_name async def get(self, db, id: Union[ObjectId, str]) -> dict: - return (await db[self.coll_name].find_one({'_id': ObjectId(id)})) or dict() + return (await db[self.coll_name].find_one({'_id': id})) or dict() async def find_one(self, db, filter=None, *args, **kwargs): return (await db[self.coll_name].find_one(filter, *args, **kwargs)) or dict() diff --git a/crud/crud_authority.py b/crud/crud_authority.py index eec0a09..45550bb 100644 --- a/crud/crud_authority.py +++ b/crud/crud_authority.py @@ -59,15 +59,20 @@ class CRUDAuthority(CRUDBase): async def set_data_auth(self, db: AsyncIOMotorDatabase, data_in, game): v0 = data_in.username v2 = game - data_auth_id = data_in.data + data_auth_id = data_in.data_auth_id await self.update_one(db, {'ptype': 'g', 'v0': v0, 'v2': v2}, {'$set': {'data_auth_id': data_auth_id}}, upsert=True) async def get_data_auth(self, db, username, game): v0 = username v2 = game - res = await self.find_one(db, {'ptype': 'g', 'v0': v0, 'v2': v2}, {'_id': 0, 'data_auth_id': 1}) - return res + res = await self.find_one(db, {'ptype': 'g', 'v0': v0, 'v2': v2, 'data_auth_id': {'$exists': 1}}, + {'_id': 0, 'data_auth_id': 1}) + # 没有设置或者设置为*认为是全部事件 + return res.get('data_auth_id') if res.get('data_auth_id', '*') != '*' else None + + async def get_all_user(self, db: AsyncIOMotorDatabase): + return await self.distinct(db, 'v0', {'ptype': 'g'}) async def create_index(self, db: AsyncIOMotorDatabase): await db[self.coll_name].create_index( diff --git a/crud/crud_data_attr.py b/crud/crud_data_attr.py new file mode 100644 index 0000000..b8df688 --- /dev/null +++ b/crud/crud_data_attr.py @@ -0,0 +1,23 @@ +import pymongo +from bson import ObjectId +from motor.motor_asyncio import AsyncIOMotorDatabase + +import schemas +from crud.base import CRUDBase +from schemas import * + +__all__ = 'data_attr', + + +class CRUDDataAttr(CRUDBase): + + async def edit_data_attr(self, db: AsyncIOMotorDatabase, game: str, data_id: schemas.DataAttrEdit): + await self.update_one(db, {'game': game, 'cat': data_id.cat}, {'$set': data_id.dict()}, upsert=True) + + async def create_index(self, db: AsyncIOMotorDatabase): + await db[self.coll_name].create_index( + [('game', pymongo.DESCENDING), ('cat', pymongo.DESCENDING), ('name', pymongo.DESCENDING)], + unique=True) + + +data_attr = CRUDDataAttr('data_attr') diff --git a/crud/crud_data_auth.py b/crud/crud_data_auth.py index 31d027f..c574e20 100644 --- a/crud/crud_data_auth.py +++ b/crud/crud_data_auth.py @@ -1,4 +1,5 @@ import pymongo +from bson import ObjectId from motor.motor_asyncio import AsyncIOMotorDatabase from crud.base import CRUDBase @@ -12,14 +13,25 @@ class CRUDDataAuth(CRUDBase): async def create(self, db: AsyncIOMotorDatabase, obj_in: DataAuthCreate, game): data = obj_in.dict() data['game'] = game + data['update_date'] = datetime.now() await self.update_one(db, data, {'$set': data}, upsert=True) async def get_game_data_auth(self, db, game): return await self.find_many(db, game=game) + async def edit_data_auth(self, db, data_in: DataAuthEdit): + return await self.update_one(db, {'_id': ObjectId(data_in.data_auth_id)}, + {'$set': {'title': data_in.title, + 'data': data_in.data, + 'update_date': datetime.now() + }}) + + # async def get_user_for_game_auth(self, db, game, username): + # await self.find_one({'ptype': 'g'}) + async def create_index(self, db: AsyncIOMotorDatabase): await db[self.coll_name].create_index( - [('game', pymongo.DESCENDING), ('name', pymongo.DESCENDING)], + [('game', pymongo.DESCENDING), ('title', pymongo.DESCENDING)], unique=True) diff --git a/crud/crud_project.py b/crud/crud_project.py index 1a29c60..c119ef8 100644 --- a/crud/crud_project.py +++ b/crud/crud_project.py @@ -15,20 +15,16 @@ class CRUDProject(CRUDBase): ) return await db[self.coll_name].insert_one(db_obj.dict(by_alias=True)) - - async def read_project(self, db: AsyncIOMotorDatabase, username: str, **kwargs): return await self.read_have(db, username, **kwargs) async def add_members(self, db: AsyncIOMotorDatabase, obj_in: ProjectMember): p = await self.get(db, obj_in.project_id) members = list(set(p.get('members')) | set(obj_in.members)) - await self.update_one(db, {'_id': obj_in.project_id}, {'$set': {'members': members}}) + await self.update_one(db, {'_id': p['_id']}, {'$set': {'members': members}}) - async def del_members(self, db: AsyncIOMotorDatabase, obj_in: ProjectMember): - p = await self.get(db, obj_in.project_id) - members = list(set(p.get('members')) - set(obj_in.members)) - await self.update_one(db, {'_id': obj_in.project_id}, {'$set': {'members': members}}) + async def del_members(self, db: AsyncIOMotorDatabase, obj_in: ProjectDelMember): + await self.update_one(db, {'_id': obj_in.project_id}, {'$pull': {'members': obj_in.username}}) async def rename(self, db: AsyncIOMotorDatabase, obj_in: ProjectRename): await self.update_one(db, {'_id': obj_in.project_id}, {'$set': {'name': obj_in.rename}}) diff --git a/crud/crud_user.py b/crud/crud_user.py index 3ff0714..bff4f92 100644 --- a/crud/crud_user.py +++ b/crud/crud_user.py @@ -36,7 +36,7 @@ class CRUDUser(CRUDBase): async def reset_password(self, db: AsyncIOMotorDatabase, obj_in: schemas.UserRestPassword): hashed_password = get_password_hash(obj_in.password) - await self.update_one(db, {'name': obj_in.username}, {'hashed_password': hashed_password}) + await self.update_one(db, {'name': obj_in.username}, {'$set': {'hashed_password': hashed_password}}) async def authenticate(self, db: AsyncIOMotorDatabase, name: str, password: str): user_obj = UserDBRW(**await self.get_by_user(db, name=name)) @@ -50,6 +50,9 @@ class CRUDUser(CRUDBase): res = await self.find_many(db, **kwargs) return schemas.Users(data=res) + async def get_all_user(self, db: AsyncIOMotorDatabase): + return await self.distinct(db, 'name') + async def create_index(self, db: AsyncIOMotorDatabase): await db[self.coll_name].create_index('name', unique=True) diff --git a/db/ckdb.py b/db/ckdb.py index 28035d4..e001885 100644 --- a/db/ckdb.py +++ b/db/ckdb.py @@ -32,8 +32,8 @@ class CKDrive: async def distinct(self, db: str, tb: str, field: str): sql = f'select distinct `{field}` as v from {db}.{tb}' - res = await self.execute(sql) - return res[0]['v'] + res = await self.query_dataframe(sql) + return res['v'].to_list() ckdb = CKDrive() diff --git a/schemas/__init__.py b/schemas/__init__.py index 1a811c6..8b14fea 100644 --- a/schemas/__init__.py +++ b/schemas/__init__.py @@ -8,5 +8,5 @@ from .report import * from .authotity import * from .table_struct import * from .data_auth import * - +from .data_attr import * from .sql import * diff --git a/schemas/authotity.py b/schemas/authotity.py index 6495fa3..fce4b2f 100644 --- a/schemas/authotity.py +++ b/schemas/authotity.py @@ -25,11 +25,12 @@ class AccountCreate(BaseModel): username: str role_name: str # nickname: str - data_authority: str + data_auth_id: str class AccountsCreate(BaseModel): accounts: List[AccountCreate] + project_id: str class AccountDeleteUser(BaseModel): diff --git a/schemas/data_attr.py b/schemas/data_attr.py new file mode 100644 index 0000000..7dd3f01 --- /dev/null +++ b/schemas/data_attr.py @@ -0,0 +1,8 @@ +from pydantic import BaseModel + + +class DataAttrEdit(BaseModel): + name: str + show_name: str + is_show: bool + cat: str diff --git a/schemas/data_auth.py b/schemas/data_auth.py index 4ddac7c..608a13c 100644 --- a/schemas/data_auth.py +++ b/schemas/data_auth.py @@ -4,10 +4,14 @@ from pydantic import BaseModel class DataAuthCreate(BaseModel): - name: str + title: str data: List[str] = [] +class DataAuthEdit(BaseModel): + data_auth_id: str + title: str + data: List[str] = [] class DataAuthSet(BaseModel): diff --git a/schemas/project.py b/schemas/project.py index 730b891..fd26650 100644 --- a/schemas/project.py +++ b/schemas/project.py @@ -13,11 +13,17 @@ class ProjectBase(BaseModel): class MemberRole(BaseModel): username: str - role: str + role_name: str + data_auth_id: str + + +class ProjectAddMember(BaseModel): + members: List[MemberRole] + project_id: str class ProjectMember(BaseModel): - members: List[MemberRole] + members: List[str] project_id: str @@ -31,6 +37,8 @@ class ProjectRename(BaseModel): class ProjectDelMember(BaseModel): + project_id: str + role: str username: str diff --git a/schemas/table_struct.py b/schemas/table_struct.py index 963aef5..b9f76e9 100644 --- a/schemas/table_struct.py +++ b/schemas/table_struct.py @@ -9,5 +9,5 @@ class TableEnum(str, Enum): class GetTable(BaseModel): - game: str + name: TableEnum