This commit is contained in:
wuaho 2021-05-20 10:10:07 +08:00
parent cc535a46a8
commit da83db420c
23 changed files with 331 additions and 117 deletions

View File

@ -6,7 +6,7 @@ from .endpoints import space
from .endpoints import dashboard from .endpoints import dashboard
from .endpoints import report from .endpoints import report
from .endpoints import authority from .endpoints import authority
from .endpoints import table_struct from .endpoints import data_mana
from .endpoints import query from .endpoints import query
from .endpoints import data_auth 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(authority.router, tags=["权限管理接口"], prefix='/authority')
api_router.include_router(data_auth.router, tags=["数据权限"], prefix='/data_auth') 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') api_router.include_router(query.router, tags=["ck"], prefix='/ck')

View File

@ -67,14 +67,18 @@ async def get_user_data_auth(request: Request,
return schemas.Msg(code=0, msg='ok', data=data) return schemas.Msg(code=0, msg='ok', data=data)
@router.get('/get_users_data_auth') # @router.get('/get_users_data_auth')
async def get_users_data_auth(request: Request, # async def get_users_data_auth(request: Request,
game: str = Depends(deps.get_game_project), # game: str = Depends(deps.get_game_project),
db: AsyncIOMotorDatabase = Depends(get_database), # db: AsyncIOMotorDatabase = Depends(get_database),
ck: CKDrive = Depends(get_ck_db), # ck: CKDrive = Depends(get_ck_db),
current_user: schemas.UserDB = Depends(deps.get_current_user) # current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg: # ) -> 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) # data_auth = await crud.authority.get_data_auth(db, username=request.user.name, game=game)
# if not data_auth: # if not data_auth:
# values = await ck.distinct(game, 'event', '#event_name') # values = await ck.distinct(game, 'event', '#event_name')
@ -85,7 +89,19 @@ async def get_users_data_auth(request: Request,
# }) # })
# data_auth_id = data_auth['data_auth_id'] # data_auth_id = data_auth['data_auth_id']
# data = await crud.data_auth.get(data_auth_id) # data = await crud.data_auth.get(data_auth_id)
return schemas.Msg(code=0, msg='ok') # 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") @router.post("/add_role")
@ -107,7 +123,8 @@ async def add_role(request: Request,
# 角色有的接口权限 # 角色有的接口权限
for obj in data_in.role_api: for obj in data_in.role_api:
casbin_enforcer.add_policy(data_in.role_name, role_dom, obj, '*') 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中读出 # 管理员默认拥有该角色 方便从db中读出
await crud.authority.create(db, 'g', settings.SUPERUSER_NAME, data_in.role_name, '*', '*', 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), db: AsyncIOMotorDatabase = Depends(get_database),
current_user: schemas.UserDB = Depends(deps.get_current_user) current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg: ) -> schemas.Msg:
"""添加账号"""
# 用户名不能与角色名重复
roles = casbin_enforcer.get_all_roles() roles = casbin_enforcer.get_all_roles()
if set(data_in.accounts) & set(roles): accounts = {item.username for item in data_in.accounts}
return schemas.Msg(code=-1, msg='已存在', data=list(set(data_in.accounts) & set(roles))) # 用户名不能与已存在的重复
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: for item in data_in.accounts:
account = schemas.UserCreate(name=item.username, password=settings.DEFAULT_PASSWORD) 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='用户名已存在') return schemas.Msg(code=-1, msg='用户名已存在')
casbin_enforcer.add_grouping_policy(item.username, item.role_name, game) 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') 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) 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: for item in dom_data:
q = await crud.authority.get_role_dom_authority(db, item['role'], game, api_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='*') 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: for item in sys_data:
q = await crud.authority.get_role_dom_authority(db, item['role'], dom='*', api_data=api_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 = { data = {
'dom_role': dom_data, 'dom_role': dom_data,
@ -211,38 +241,6 @@ async def all_role(request: Request,
} }
return schemas.Msg(code=0, msg='ok', data=data) 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") # @router.post("/set_role")

View File

@ -1,5 +1,6 @@
import pymongo import pymongo
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Request
from fastapi.encoders import jsonable_encoder
from motor.motor_asyncio import AsyncIOMotorDatabase from motor.motor_asyncio import AsyncIOMotorDatabase
import crud, schemas import crud, schemas
from core.config import settings from core.config import settings
@ -7,6 +8,7 @@ from core.security import get_password_hash
from db import get_database from db import get_database
from api import deps from api import deps
from db.ckdb import CKDrive, get_ck_db
from utils import casbin_enforcer from utils import casbin_enforcer
router = APIRouter() router = APIRouter()
@ -24,16 +26,46 @@ async def add_data_auth(request: Request,
return schemas.Msg(code=0, msg='ok', data=data_id) 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, async def data_authority(request: Request,
db: AsyncIOMotorDatabase = Depends(get_database), db: AsyncIOMotorDatabase = Depends(get_database),
game: str = Depends(deps.get_game_project), game: str = Depends(deps.get_game_project),
ck: CKDrive = Depends(get_ck_db),
current_user: schemas.UserDB = Depends(deps.get_current_user) current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg: ) -> schemas.Msg:
"""获取前项目数据权限""" """获取前项目数据权限"""
total_event = await ck.distinct_count(game, 'event', '#event_name')
data = await crud.data_auth.get_game_data_auth(db, game) data = await crud.data_auth.get_game_data_auth(db, game)
for item in data: for item in data:
item['id'] = str(item['_id']) item['id'] = str(item['_id'])
del 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) return schemas.Msg(code=0, msg='ok', data=data)

View File

@ -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)

View File

@ -1,4 +1,5 @@
import pymongo import pymongo
from bson import ObjectId
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Request
from motor.motor_asyncio import AsyncIOMotorDatabase from motor.motor_asyncio import AsyncIOMotorDatabase
import crud, schemas import crud, schemas
@ -107,23 +108,43 @@ async def rename_project(request: Request,
return schemas.Msg(code=0, msg='ok', data=res) return schemas.Msg(code=0, msg='ok', data=res)
# todo 要修改
@router.post("/add_members") @router.post("/add_members")
async def add_members(request: Request, async def add_members(request: Request,
game: str, game: str,
data_in: schemas.ProjectMember, data_in: schemas.ProjectAddMember,
db: AsyncIOMotorDatabase = Depends(get_database), db: AsyncIOMotorDatabase = Depends(get_database),
current_user: schemas.UserDB = Depends(deps.get_current_user) current_user: schemas.UserDB = Depends(deps.get_current_user)
): ):
"""项目添加成员""" """项目添加成员"""
#
await crud.project.add_members(db, data_in)
for item in data_in.members: for item in data_in.members:
casbin_enforcer.add_grouping_policy(item.username, item.role, game) casbin_enforcer.add_grouping_policy(item.username, item.role_name, game)
await crud.authority.create(db, 'g', item.username, item.role, 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) 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") @router.get("/members")
async def members(request: Request, async def members(request: Request,
game: str, game: str,
@ -132,14 +153,27 @@ async def members(request: Request,
): ):
"""查看项目成员""" """查看项目成员"""
roles = await crud.authority.find_many(db, ptype='g', v2=game) 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': '超级管理员'} data['root'] = {'name': 'root', 'role': '超级管理员'}
users = await crud.user.get_by_users(db, name={'$in': list(data.keys())}) users = await crud.user.get_by_users(db, name={'$in': list(data.keys())})
res = [] res = []
for user in users.data: for user in users.data:
res.append({ res.append({
**user.dict(), **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) 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) current_user: schemas.UserDB = Depends(deps.get_current_user)
): ):
"""删除项目成员""" """删除项目成员"""
casbin_enforcer.delete_user(data_in.username) casbin_enforcer.delete_roles_for_user_in_domain(data_in.username,data_in.role,game)
await crud.project.del_members(data_in) await crud.project.del_members(db, data_in)
await crud.authority.delete(db, ptype='g', v2=game, v0=data_in.username) await crud.authority.delete(db, ptype='g', v2=game, v0=data_in.username)
return schemas.Msg(code=0, msg='ok') return schemas.Msg(code=0, msg='ok')

View File

@ -31,3 +31,16 @@ async def query(
# data, columns = await ckdb.execute(data_in.sql, with_column_types=True, columnar=True) # 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)}) # df = pd.DataFrame({col[0]: d for d, col in zip(data, columns)})
return schemas.Msg(code=0, msg='ok', data=data_in) 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)

View File

@ -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))

View File

@ -76,7 +76,10 @@ async def reset_password(request: Request,
""" """
修改其他人密码 修改其他人密码
""" """
try:
await crud.user.reset_password(db, data_in) 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') return schemas.Msg(code=0, msg='ok')

View File

@ -38,6 +38,42 @@ class Settings(BaseSettings):
CK_CONFIG = {'host': '119.29.176.224', CK_CONFIG = {'host': '119.29.176.224',
'send_receive_timeout': 30} '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: class Config:
case_sensitive = True case_sensitive = True

View File

@ -6,3 +6,4 @@ from .crud_dashboard import dashboard
from .crud_report import report from .crud_report import report
from .crud_authority import authority from .crud_authority import authority
from .crud_data_auth import data_auth from .crud_data_auth import data_auth
from .crud_data_attr import data_attr

View File

@ -8,7 +8,7 @@ class CRUDBase:
self.coll_name = coll_name self.coll_name = coll_name
async def get(self, db, id: Union[ObjectId, str]) -> dict: 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): async def find_one(self, db, filter=None, *args, **kwargs):
return (await db[self.coll_name].find_one(filter, *args, **kwargs)) or dict() return (await db[self.coll_name].find_one(filter, *args, **kwargs)) or dict()

View File

@ -59,15 +59,20 @@ class CRUDAuthority(CRUDBase):
async def set_data_auth(self, db: AsyncIOMotorDatabase, data_in, game): async def set_data_auth(self, db: AsyncIOMotorDatabase, data_in, game):
v0 = data_in.username v0 = data_in.username
v2 = game 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}}, await self.update_one(db, {'ptype': 'g', 'v0': v0, 'v2': v2}, {'$set': {'data_auth_id': data_auth_id}},
upsert=True) upsert=True)
async def get_data_auth(self, db, username, game): async def get_data_auth(self, db, username, game):
v0 = username v0 = username
v2 = game v2 = game
res = await self.find_one(db, {'ptype': 'g', 'v0': v0, 'v2': v2}, {'_id': 0, 'data_auth_id': 1}) res = await self.find_one(db, {'ptype': 'g', 'v0': v0, 'v2': v2, 'data_auth_id': {'$exists': 1}},
return res {'_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): async def create_index(self, db: AsyncIOMotorDatabase):
await db[self.coll_name].create_index( await db[self.coll_name].create_index(

23
crud/crud_data_attr.py Normal file
View File

@ -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')

View File

@ -1,4 +1,5 @@
import pymongo import pymongo
from bson import ObjectId
from motor.motor_asyncio import AsyncIOMotorDatabase from motor.motor_asyncio import AsyncIOMotorDatabase
from crud.base import CRUDBase from crud.base import CRUDBase
@ -12,14 +13,25 @@ class CRUDDataAuth(CRUDBase):
async def create(self, db: AsyncIOMotorDatabase, obj_in: DataAuthCreate, game): async def create(self, db: AsyncIOMotorDatabase, obj_in: DataAuthCreate, game):
data = obj_in.dict() data = obj_in.dict()
data['game'] = game data['game'] = game
data['update_date'] = datetime.now()
await self.update_one(db, data, {'$set': data}, upsert=True) await self.update_one(db, data, {'$set': data}, upsert=True)
async def get_game_data_auth(self, db, game): async def get_game_data_auth(self, db, game):
return await self.find_many(db, game=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): async def create_index(self, db: AsyncIOMotorDatabase):
await db[self.coll_name].create_index( await db[self.coll_name].create_index(
[('game', pymongo.DESCENDING), ('name', pymongo.DESCENDING)], [('game', pymongo.DESCENDING), ('title', pymongo.DESCENDING)],
unique=True) unique=True)

View File

@ -15,20 +15,16 @@ class CRUDProject(CRUDBase):
) )
return await db[self.coll_name].insert_one(db_obj.dict(by_alias=True)) return await db[self.coll_name].insert_one(db_obj.dict(by_alias=True))
async def read_project(self, db: AsyncIOMotorDatabase, username: str, **kwargs): async def read_project(self, db: AsyncIOMotorDatabase, username: str, **kwargs):
return await self.read_have(db, username, **kwargs) return await self.read_have(db, username, **kwargs)
async def add_members(self, db: AsyncIOMotorDatabase, obj_in: ProjectMember): async def add_members(self, db: AsyncIOMotorDatabase, obj_in: ProjectMember):
p = await self.get(db, obj_in.project_id) p = await self.get(db, obj_in.project_id)
members = list(set(p.get('members')) | set(obj_in.members)) 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): async def del_members(self, db: AsyncIOMotorDatabase, obj_in: ProjectDelMember):
p = await self.get(db, obj_in.project_id) await self.update_one(db, {'_id': obj_in.project_id}, {'$pull': {'members': obj_in.username}})
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 rename(self, db: AsyncIOMotorDatabase, obj_in: ProjectRename): async def rename(self, db: AsyncIOMotorDatabase, obj_in: ProjectRename):
await self.update_one(db, {'_id': obj_in.project_id}, {'$set': {'name': obj_in.rename}}) await self.update_one(db, {'_id': obj_in.project_id}, {'$set': {'name': obj_in.rename}})

View File

@ -36,7 +36,7 @@ class CRUDUser(CRUDBase):
async def reset_password(self, db: AsyncIOMotorDatabase, obj_in: schemas.UserRestPassword): async def reset_password(self, db: AsyncIOMotorDatabase, obj_in: schemas.UserRestPassword):
hashed_password = get_password_hash(obj_in.password) 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): async def authenticate(self, db: AsyncIOMotorDatabase, name: str, password: str):
user_obj = UserDBRW(**await self.get_by_user(db, name=name)) 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) res = await self.find_many(db, **kwargs)
return schemas.Users(data=res) 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): async def create_index(self, db: AsyncIOMotorDatabase):
await db[self.coll_name].create_index('name', unique=True) await db[self.coll_name].create_index('name', unique=True)

View File

@ -32,8 +32,8 @@ class CKDrive:
async def distinct(self, db: str, tb: str, field: str): async def distinct(self, db: str, tb: str, field: str):
sql = f'select distinct `{field}` as v from {db}.{tb}' sql = f'select distinct `{field}` as v from {db}.{tb}'
res = await self.execute(sql) res = await self.query_dataframe(sql)
return res[0]['v'] return res['v'].to_list()
ckdb = CKDrive() ckdb = CKDrive()

View File

@ -8,5 +8,5 @@ from .report import *
from .authotity import * from .authotity import *
from .table_struct import * from .table_struct import *
from .data_auth import * from .data_auth import *
from .data_attr import *
from .sql import * from .sql import *

View File

@ -25,11 +25,12 @@ class AccountCreate(BaseModel):
username: str username: str
role_name: str role_name: str
# nickname: str # nickname: str
data_authority: str data_auth_id: str
class AccountsCreate(BaseModel): class AccountsCreate(BaseModel):
accounts: List[AccountCreate] accounts: List[AccountCreate]
project_id: str
class AccountDeleteUser(BaseModel): class AccountDeleteUser(BaseModel):

8
schemas/data_attr.py Normal file
View File

@ -0,0 +1,8 @@
from pydantic import BaseModel
class DataAttrEdit(BaseModel):
name: str
show_name: str
is_show: bool
cat: str

View File

@ -4,10 +4,14 @@ from pydantic import BaseModel
class DataAuthCreate(BaseModel): class DataAuthCreate(BaseModel):
name: str title: str
data: List[str] = [] data: List[str] = []
class DataAuthEdit(BaseModel):
data_auth_id: str
title: str
data: List[str] = []
class DataAuthSet(BaseModel): class DataAuthSet(BaseModel):

View File

@ -13,11 +13,17 @@ class ProjectBase(BaseModel):
class MemberRole(BaseModel): class MemberRole(BaseModel):
username: str username: str
role: str role_name: str
data_auth_id: str
class ProjectAddMember(BaseModel):
members: List[MemberRole]
project_id: str
class ProjectMember(BaseModel): class ProjectMember(BaseModel):
members: List[MemberRole] members: List[str]
project_id: str project_id: str
@ -31,6 +37,8 @@ class ProjectRename(BaseModel):
class ProjectDelMember(BaseModel): class ProjectDelMember(BaseModel):
project_id: str
role: str
username: str username: str

View File

@ -9,5 +9,5 @@ class TableEnum(str, Enum):
class GetTable(BaseModel): class GetTable(BaseModel):
game: str
name: TableEnum name: TableEnum