xbackend/api/api_v1/endpoints/data_mana.py
李伟 84dcdad9b7 1.优化权限板块
2.新增用户搜索板块
2022-04-14 16:08:01 +08:00

214 lines
6.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
from aioredis import Redis
from fastapi import APIRouter, Depends, Request, File
from motor.motor_asyncio import AsyncIOMotorDatabase
import pandas as pd
import crud, schemas
from api import deps
from core.config import settings
from db import get_database
from db.ckdb import CKDrive, get_ck_db
from db.redisdb import get_redis_pool
from utils import estimate_data,dict_to_str
router = APIRouter()
__all__ = 'router',
@router.get("/attr_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("/game_user_event_list")
async def read_data_attr(
request: Request,
game: str,
db: AsyncIOMotorDatabase = Depends(get_database),
ck: CKDrive = Depends(get_ck_db),
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""用户搜索时显示的用户属性"""
# data = await rdb.get(f'{game}_{data_in.cat}')
# data = json.loads(data)
# res = list(data.keys())
#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': '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,
}
user_props.append(user_prop)
user_label_props = []
user_label_docs = await crud.user_label.find_many(db, {'game': game}, {'qp': 0})
for item in user_label_docs:
tmp = {
'id': item['cluster_name'],
'data_type': 'user_label',
'title': item['display_name'],
}
user_label_props.append(tmp)
res = [
{
'title': '用户属性',
'id': 'user',
'category': user_props
},
{
'title': '用户标签',
'id': 'user_label',
'category': user_label_props
}
]
return schemas.Msg(code=0, msg='ok', data=res)
@router.post("/attr_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)
# @router.post("/add_select_map")
# async def add_map(
# request: Request,
# game: str,
# data_in: schemas.SelectMap,
# db: AsyncIOMotorDatabase = Depends(get_database),
# current_user: schemas.UserDB = Depends(deps.get_current_user)
# ) -> schemas.Msg:
# """添加属性值选择映射"""
#
# """
# {
# game:aaa,
# attr_name:bbb,
# map_:{
# '区服aa':'1',
# '区服vvv':'5',
# }
#
# }
# """
# await crud.select_map.save(db, data_in)
# return schemas.Msg(code=0, msg='ok', data=data_in)
#在gametoos同步区服了所以不需要这段代码
@router.post("/add_select_map")
async def add_select_map(
request: Request,
game: str,
file: bytes = File(...),
db: AsyncIOMotorDatabase = Depends(get_database),
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""添加游戏区服信息选择映射"""
dfs = pd.read_excel(file, engine='openpyxl', sheet_name=None)
for attr_name, df in dfs.items():
#将id这列转换成字符串类型
if len(df) >0:
df['id'] = df['id'].astype(str)
map_ = df.to_dict('records')
data_in = schemas.SelectMap(game=game, attr_name=attr_name, map_=map_)
await crud.select_map.save(db, data_in)
return schemas.Msg(code=0, msg='ok', data=1)
@router.get("/select_list")
async def select_list(
request: Request,
game: str,
db: AsyncIOMotorDatabase = Depends(get_database),
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""属性值选择映射列表"""
#当游戏为魔法门H5时把game的值改为数据库中对应的值mdb中的值和ck中的值是不一样的
if game == 'mfmh5':
game='mzmfmh5'
resp = await crud.select_map.get_list(db, game)
return schemas.Msg(code=0, msg='ok', data=resp)
@router.post("/select_attr")
async def select_attr(
request: Request,
game: str,
data_in: schemas.SelectAttr,
db: AsyncIOMotorDatabase = Depends(get_database),
current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""属性值选择映射"""
resp = await crud.select_map.get_select(db, data_in, game)
code = 0 if resp else -9
if 'map_' in resp.keys():
return schemas.Msg(code=code, msg='ok', data=resp)
else:
resp['map_'] = resp.pop('owner_name')
return schemas.Msg(code=code, msg='ok', data=resp)
@router.post("/add_attr")
async def add_attr(
request: Request,
game: str,
data_in: schemas.Add_attr,
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}_{data_in.cat}')
data = json.loads(data)
if data_in.state =='add':
#判断传入数据类型
new_data_type=estimate_data(data_in.data_type)
#添加数据
data[data_in.new_attribute]=new_data_type
else:
del data[data_in.new_attribute]
#将字典转为字符串
str_data=dict_to_str(data)
await rdb.set(f'{game}_{data_in.cat}',str_data)
return schemas.Msg(code=0, msg='ok')