xbackend/api/api_v1/endpoints/data_auth.py
2021-08-20 16:52:41 +08:00

305 lines
10 KiB
Python

import json
import pymongo
from bson import ObjectId
from fastapi import APIRouter, Depends, Request
from fastapi.encoders import jsonable_encoder
from motor.motor_asyncio import AsyncIOMotorDatabase
from redis import Redis
import crud, schemas
from core.config import settings
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 db.redisdb import get_redis_pool, RedisDrive
# from utils import casbin_enforcer
router = APIRouter()
@router.post('/add_data_auth')
async def add_data_auth(request: Request,
data_id: schemas.DataAuthCreate,
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.create(db, data_id, game)
return schemas.Msg(code=0, msg='ok', data=data_id)
@router.post('/edit_data_auth')
async def edit_data_auth(request: Request,
data_id: schemas.DataAuthEdit,
game: str,
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("/quotas_map")
async def quotas_map(
request: Request,
game: str,
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
return schemas.Msg(code=0, msg='ok', data=settings.CK_OPERATOR)
@router.get("/filter_map")
async def filter_map(
request: Request,
game: str,
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
return schemas.Msg(code=0, msg='ok', data=settings.CK_FILTER)
@router.get('/all_event')
async def all_event(request: Request,
game: str,
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,
game: str,
db: AsyncIOMotorDatabase = Depends(get_database),
rdb: RedisDrive = Depends(get_redis_pool),
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)
@router.get("/my_event")
async def my_event(request: Request,
game: str,
db: AsyncIOMotorDatabase = Depends(get_database),
rdb: RedisDrive = Depends(get_redis_pool),
ck: CKDrive = Depends(get_ck_db),
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""获取自己的事件权限"""
event_list = []
data_auth_id = await crud.authority.get_data_auth_id(db, game, request.user.username)
my_data_auth = []
my_data_auth = await ck.distinct(game, 'event_view', '#event_name')
#
# else:
# # 设置了数据权限
# my_data_auth = await crud.data_auth.get(db, ObjectId(data_auth_id))
# my_data_auth = my_data_auth['data']
event_show_name = await crud.event_mana.get_all_show_name(db, game)
event_list.append({'id': 'event', 'title': '全部事件', 'category': []})
for item in my_data_auth:
event_list[-1]['category'].append({
'event_name': item,
'event_desc': event_show_name.get(item, item)
})
event_list[-1]['category'].append({'event_name': '*', 'event_desc': '任意事件'})
event_list.sort()
return schemas.Msg(code=0, msg='ok', data=event_list)
@router.get("/user_property")
async def user_property(request: Request,
game: str,
db: AsyncIOMotorDatabase = Depends(get_database),
rdb: RedisDrive = Depends(get_redis_pool),
ck: CKDrive = Depends(get_ck_db),
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""获取用户属性"""
data = await rdb.get(f'{game}_user')
data = json.loads(data)
propertys = []
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': 'user'})
data_attr = {item['name']: item for item in data_attr}
for k, v in data.items():
data_type = settings.CK_TYPE_DICT.get(v)
propertys.append(
{'name': k,
'data_type': data_type,
'show_name': data_attr.get(k, {}).get('show_name', ''),
}
)
propertys = sorted(propertys, key=lambda x: x['show_name'])
return schemas.Msg(code=0, msg='ok', data=propertys)
@router.post('/load_prop_quotas')
async def load_prop_quotas(request: Request,
game: str,
data_in: schemas.LoadProQuotas,
db: AsyncIOMotorDatabase = Depends(get_database),
rdb: RedisDrive = Depends(get_redis_pool),
ck: CKDrive = Depends(get_ck_db),
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""事件属性 聚合条件"""
event_columns = await ck.get_columns(game, 'event')
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': 'event'})
data_attr = {item['name']: item for item in data_attr}
event_props = []
for item in event_columns:
data_type = settings.CK_TYPE_DICT.get(item['type'])
title = data_attr.get(item['name'], {}).get('show_name') or item['name']
event_prop = {
'id': item['name'],
'data_type': data_type,
'title': title,
'category': settings.CK_OPERATOR.get(data_type) or []
}
event_props.append(event_prop)
if data_in.model == 'scatter':
staid_quots = [
{
"id": "*",
"data_type": None,
"analysis": "times",
"title": "次数",
"category": []
},
{
"id": "*",
"data_type": None,
"analysis": "number_of_days",
"title": "天数",
"category": []
},
{
"id": "*",
"data_type": None,
"analysis": "number_of_hours",
"title": "小时数",
"category": []
},
]
else:
staid_quots = [
{
"id": "*",
"data_type": None,
"analysis": "total_count",
"title": "总次数",
"category": []
},
{
"id": "*",
"analysis": "touch_user_count",
"data_type": None,
"title": "触发用户数",
"category": []
},
{
"id": "*",
"analysis": "touch_user_avg",
"data_type": None,
"title": "人均次数",
"category": []
},
]
res = {
'props': event_props,
'staid_quots': staid_quots
}
return schemas.Msg(code=0, msg='ok', data=res)
@router.post('/load_filter_props')
async def load_filter_props(request: Request,
game: str,
data_in: schemas.LoadProQuotas,
db: AsyncIOMotorDatabase = Depends(get_database),
rdb: RedisDrive = Depends(get_redis_pool),
ck: CKDrive = Depends(get_ck_db),
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""事件属性 过滤条件"""
event_columns = await ck.get_columns(game, 'event')
user_columns = await ck.get_columns(game, 'user')
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': 'event'})
data_attr = {item['name']: item for item in data_attr}
event_props = []
for item in event_columns:
data_type = settings.CK_TYPE_DICT.get(item['type'])
title = data_attr.get(item['name'], {}).get('show_name') or item['name']
event_prop = {
'id': item['name'],
'data_type': data_type,
'title': title,
'category': settings.CK_FILTER.get(data_type) or []
}
event_props.append(event_prop)
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': 'user'})
data_attr = {item['name']: item for item in data_attr}
user_props = []
for item in user_columns:
data_type = settings.CK_TYPE_DICT.get(item['type'])
title = data_attr.get(item['name'], {}).get('show_name') or item['name']
user_prop = {
'id': item['name'],
'data_type': data_type,
'title': title,
'category': settings.CK_FILTER.get(data_type) or []
}
user_props.append(user_prop)
res = [
{
'title': '事件属性',
'id': 'event',
'category': event_props
},
{
'title': '用户属性',
'id': 'user',
'category': user_props
}
]
return schemas.Msg(code=0, msg='ok', data=res)