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

View File

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

View File

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

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

View File

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

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,
"""
修改其他人密码
"""
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')

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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
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):
name: str
title: str
data: List[str] = []
class DataAuthEdit(BaseModel):
data_auth_id: str
title: str
data: List[str] = []
class DataAuthSet(BaseModel):

View File

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

View File

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