1
This commit is contained in:
parent
cc535a46a8
commit
da83db420c
@ -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')
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
60
api/api_v1/endpoints/data_mana.py
Normal file
60
api/api_v1/endpoints/data_mana.py
Normal 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)
|
@ -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')
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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))
|
@ -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')
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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(
|
||||
|
23
crud/crud_data_attr.py
Normal file
23
crud/crud_data_attr.py
Normal 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')
|
@ -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)
|
||||
|
||||
|
||||
|
@ -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}})
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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 *
|
||||
|
@ -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):
|
||||
|
8
schemas/data_attr.py
Normal file
8
schemas/data_attr.py
Normal file
@ -0,0 +1,8 @@
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class DataAttrEdit(BaseModel):
|
||||
name: str
|
||||
show_name: str
|
||||
is_show: bool
|
||||
cat: str
|
@ -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):
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -9,5 +9,5 @@ class TableEnum(str, Enum):
|
||||
|
||||
|
||||
class GetTable(BaseModel):
|
||||
game: str
|
||||
|
||||
name: TableEnum
|
||||
|
Loading…
Reference in New Issue
Block a user