feat: new util - front_end_sucks
This commit is contained in:
0
nc_http/utils/__init__.py
Normal file
0
nc_http/utils/__init__.py
Normal file
202
nc_http/utils/front_end_sucks.py
Normal file
202
nc_http/utils/front_end_sucks.py
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
from decimal import Decimal
|
||||||
|
from types import SimpleNamespace
|
||||||
|
|
||||||
|
|
||||||
|
class HandleType:
|
||||||
|
SWITCH = 1
|
||||||
|
UPDATE = 2
|
||||||
|
STAT = 3
|
||||||
|
|
||||||
|
|
||||||
|
class FrontEndSucksUtil:
|
||||||
|
"""
|
||||||
|
Don't blame me, we have a terrible Front-End coder.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def round(cls, data, digits, **kwargs):
|
||||||
|
"""
|
||||||
|
结果处理 小数保留
|
||||||
|
:param data: list<dict> / dict
|
||||||
|
:param digits: number
|
||||||
|
:param keys: list<str>
|
||||||
|
:param key: str
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
def _round(field):
|
||||||
|
if not field:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if isinstance(field, str):
|
||||||
|
field = float(field)
|
||||||
|
|
||||||
|
return round(field, digits)
|
||||||
|
|
||||||
|
return cls.handle(data, _round, **kwargs)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def percent(cls, data, **kwargs):
|
||||||
|
"""
|
||||||
|
结果处理 浮点型 转百分比
|
||||||
|
:param data:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
def _percent(field):
|
||||||
|
if not field:
|
||||||
|
return None
|
||||||
|
|
||||||
|
field = str(field)
|
||||||
|
_field = '{}%'.format(Decimal(field) * 100)
|
||||||
|
return _field
|
||||||
|
|
||||||
|
return cls.handle(data, _percent, **kwargs)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def mapping(cls, data, field_map, key_map=None, **kwargs):
|
||||||
|
"""
|
||||||
|
结果处理 字段映射
|
||||||
|
:param data:
|
||||||
|
:param field_map:
|
||||||
|
:param key_map:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
field_map = field_map or {}
|
||||||
|
if key_map:
|
||||||
|
kwargs['keys'] = list(key_map.keys())
|
||||||
|
|
||||||
|
# 存在 keymap 参数时 将映射结果放入映射后的 key 中 否则放入原 key 中
|
||||||
|
def _mapping(key, field):
|
||||||
|
value = field_map.get(field)
|
||||||
|
if key_map:
|
||||||
|
key = key_map.get(key)
|
||||||
|
|
||||||
|
if not key:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
return {key: value}
|
||||||
|
|
||||||
|
return cls.handle(data, _mapping, handle_type=HandleType.UPDATE, **kwargs)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def sum(cls, data, **kwargs):
|
||||||
|
"""
|
||||||
|
结果处理 对象列表求和
|
||||||
|
:param data:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
obj = SimpleNamespace(sum=0)
|
||||||
|
|
||||||
|
def _sum(field):
|
||||||
|
if isinstance(field, str):
|
||||||
|
field = float(field)
|
||||||
|
elif isinstance(field, int) or isinstance(field, float):
|
||||||
|
field = field
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
obj.sum += field
|
||||||
|
|
||||||
|
cls.handle(data, _sum, handle_type=HandleType.STAT, **kwargs)
|
||||||
|
|
||||||
|
return obj.sum
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def ratio(cls, data, total, key_map=None, **kwargs):
|
||||||
|
"""
|
||||||
|
结果处理 对象列表占比
|
||||||
|
:param data:
|
||||||
|
:param total:
|
||||||
|
:param key_map:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
if key_map:
|
||||||
|
kwargs['keys'] = list(key_map.keys())
|
||||||
|
|
||||||
|
def _ratio(key, field):
|
||||||
|
if isinstance(field, str):
|
||||||
|
_field = float(field) / total
|
||||||
|
elif isinstance(field, int) or isinstance(field, float):
|
||||||
|
_field = field / total
|
||||||
|
else:
|
||||||
|
_field = 0
|
||||||
|
|
||||||
|
if key_map:
|
||||||
|
key = key_map.get(key)
|
||||||
|
|
||||||
|
return {key: _field}
|
||||||
|
|
||||||
|
return cls.handle(data, _ratio, handle_type=HandleType.UPDATE, **kwargs)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def handle(cls, data, func, key=None, keys=None, handle_type=HandleType.SWITCH):
|
||||||
|
"""
|
||||||
|
结果处理 自定义函数处理
|
||||||
|
:param data:
|
||||||
|
:param func:
|
||||||
|
:param key:
|
||||||
|
:param keys:
|
||||||
|
:param handle_type:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
keys = cls._parse_keys(key, keys)
|
||||||
|
if not keys:
|
||||||
|
return data
|
||||||
|
|
||||||
|
data_is_dict = False
|
||||||
|
if isinstance(data, dict):
|
||||||
|
data_is_dict = True
|
||||||
|
data = [data]
|
||||||
|
|
||||||
|
rs = []
|
||||||
|
for item in data:
|
||||||
|
_item = item.copy()
|
||||||
|
for key in keys:
|
||||||
|
field = _item.get(key)
|
||||||
|
# 值的替换
|
||||||
|
if handle_type == HandleType.SWITCH:
|
||||||
|
_item[key] = func(field)
|
||||||
|
# 值的新增
|
||||||
|
elif handle_type == HandleType.UPDATE:
|
||||||
|
_item.update(func(key, field))
|
||||||
|
# 值的统计
|
||||||
|
elif handle_type == HandleType.STAT:
|
||||||
|
func(field)
|
||||||
|
rs.append(_item)
|
||||||
|
|
||||||
|
if data_is_dict:
|
||||||
|
return rs[0]
|
||||||
|
|
||||||
|
return rs
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _parse_keys(cls, key, keys):
|
||||||
|
keys = keys or []
|
||||||
|
if key:
|
||||||
|
keys.append(key)
|
||||||
|
return keys
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def list_to_tree(rows, id_key='id', parent_id_key='parent_id', i=0):
|
||||||
|
"""
|
||||||
|
结果处理 列表转树
|
||||||
|
:param rows:
|
||||||
|
:param id_key:
|
||||||
|
:param parent_id_key:
|
||||||
|
:param i:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
data = []
|
||||||
|
for row in rows:
|
||||||
|
if row[parent_id_key] == i:
|
||||||
|
row['children'] = FrontEndSucksUtil.list_to_tree(rows, id_key, parent_id_key, row[id_key])
|
||||||
|
data.append(row)
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
# 结果处理 树转列表 todo
|
||||||
|
# 输入处理 字符型日期转时间戳 todo
|
||||||
|
'''
|
Reference in New Issue
Block a user