You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
413 lines
17 KiB
413 lines
17 KiB
# -*- coding: utf-8 -*-
|
|
import datetime
|
|
import distutils
|
|
import json
|
|
import logging
|
|
import traceback
|
|
import uuid
|
|
from collections import OrderedDict
|
|
|
|
from django.db.models import Q
|
|
from rest_framework.views import View
|
|
from rest_framework import status
|
|
from rest_framework.decorators import action
|
|
from rest_framework.filters import SearchFilter, OrderingFilter
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.viewsets import ModelViewSet
|
|
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
|
|
|
|
from ChaCeRndTrans.basic import CCAIResponse
|
|
from ChaCeRndTrans.code import SERVER_ERROR, PARAMS_ERR
|
|
from utils.custom import RbacPermission, CustomViewBase, req_operate_by_user, create_operation_history_log
|
|
from ..models import DataDictionary, DataDictionaryDetail, OperationHistoryLog, DataDictionaryDetailZY
|
|
from ..serializers.dict_serializer import DictSerializer, DictDetailSerializer
|
|
|
|
logger = logging.getLogger('error')
|
|
|
|
|
|
class DataDictionaryViewSet(CustomViewBase):
|
|
'''
|
|
字典管理:增删改查
|
|
'''
|
|
perms_map = ({'*': 'admin'}, {'*': 'dictionary_all'}, {'get': 'dictionary_list'}, {'post': 'dictionary_create'},
|
|
{'put': 'dictionary_edit'},
|
|
{'delete': 'dictionary_delete'})
|
|
queryset = DataDictionary.objects.all()
|
|
serializer_class = DictSerializer
|
|
filter_backends = (SearchFilter, OrderingFilter)
|
|
search_fields = ('DictionaryCode', 'DictionaryValue')
|
|
ordering_fields = ('id',)
|
|
authentication_classes = (JSONWebTokenAuthentication,)
|
|
permission_classes = (RbacPermission,)
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
'''
|
|
重写list方法
|
|
'''
|
|
queryset = self.filter_queryset(self.get_queryset())
|
|
serializer = self.get_serializer(queryset, many=True)
|
|
tree_dict = {}
|
|
tree_data = []
|
|
try:
|
|
for item in serializer.data:
|
|
tree_dict[item['dict_id']] = item
|
|
for i in tree_dict:
|
|
if tree_dict[i]['parent_id'] and tree_dict[i]['parent_id'] != "0": # 顶级的父级是 0,所以跳过
|
|
pid = tree_dict[i]['parent_id']
|
|
parent = tree_dict[pid]
|
|
parent.setdefault('children', []).append(tree_dict[i])
|
|
else:
|
|
tree_data.append(tree_dict[i])
|
|
results = tree_data
|
|
except Exception as e:
|
|
logger.error("get dict list failed: \n%s" % traceback.format_exc())
|
|
return CCAIResponse("获取字典列表失败", SERVER_ERROR)
|
|
|
|
return CCAIResponse(results)
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
'''添加数据POST'''
|
|
try:
|
|
data = req_operate_by_user(request)
|
|
data['dict_id'] = uuid.uuid4().__str__()
|
|
|
|
serializer = self.get_serializer(data=data)
|
|
serializer.is_valid(raise_exception=True)
|
|
self.perform_create(serializer)
|
|
# headers = self.get_success_headers(serializer.data)
|
|
# 操作记录
|
|
# info = {
|
|
# "des": "添加数据字典",
|
|
# "detail": "字典id: " + data['dict_id'] + ", " + "字典名称: " + data["label"]
|
|
# }
|
|
# create_operation_history_log(request, info, OperationHistoryLog)
|
|
return CCAIResponse(data="success")
|
|
except Exception as e:
|
|
logger.error("dict create failed: \n%s" % traceback.format_exc())
|
|
return CCAIResponse("create failed", SERVER_ERROR)
|
|
|
|
|
|
class DataDictionaryDetailTreeViewSet(CustomViewBase):
|
|
'''
|
|
字典详情树
|
|
'''
|
|
perms_map = ({'*': 'admin'}, {'*': 'dictionarydetail_all'}, {'get': 'dictionarydetail_list'},
|
|
{'post': 'dictionarydetail_create'}, {'put': 'dictionarydetail_edit'},
|
|
{'delete': 'dictionarydetail_delete'})
|
|
queryset = DataDictionaryDetail.objects.all()
|
|
serializer_class = DictDetailSerializer
|
|
filter_backends = (SearchFilter, OrderingFilter)
|
|
ordering_fields = ('id',)
|
|
authentication_classes = (JSONWebTokenAuthentication,)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
'''
|
|
重写list方法
|
|
'''
|
|
parent_code = request.GET.get("parent_code")
|
|
is_enabled = request.GET.get("is_enabled")
|
|
label = request.GET.get("label")
|
|
order = request.GET.get("order")
|
|
sort = request.GET.get("ordering")
|
|
order_by = 'id'
|
|
if order and sort:
|
|
if order == '1':
|
|
order_by = sort
|
|
else:
|
|
order_by = '-' + sort
|
|
|
|
tree_dict = {}
|
|
tree_data = []
|
|
dict_map = {}
|
|
results = {}
|
|
|
|
if parent_code:
|
|
try:
|
|
condtions = OrderedDict()
|
|
if is_enabled:
|
|
condtions['IsEnabled'] = is_enabled
|
|
if label:
|
|
condtions['FullName__contains'] = label
|
|
if 'TechArea' == parent_code:
|
|
Tech = DataDictionary.objects.filter(DictionaryCode=parent_code).first()
|
|
condtions['DataDictionaryId'] = Tech.DataDictionaryId
|
|
else:
|
|
condtions['ParentCode__istartswith'] = parent_code
|
|
# condtions['ParentCode'] = parent_code
|
|
|
|
queryset = DataDictionaryDetail.objects.filter(**condtions).order_by(order_by)
|
|
serializer = self.get_serializer(queryset, many=True)
|
|
for item in serializer.data:
|
|
dict_map[item['dict_code']] = item['label']
|
|
|
|
for item in serializer.data:
|
|
tree_dict[item['dict_detail_id']] = item
|
|
for i in tree_dict:
|
|
data = tree_dict[i]
|
|
parent_id = tree_dict[i]['parent_id']
|
|
parent_code = tree_dict[i]['parent_code']
|
|
if parent_id and parent_code in dict_map and parent_code != 'CusMYType_XSSRZZL':
|
|
pid = parent_id
|
|
parent = tree_dict[pid]
|
|
parent.setdefault('children', []).append(data)
|
|
else:
|
|
tree_data.append(data)
|
|
if 'RND_COST' == request.GET.get("parent_code"):
|
|
results['list'] = sorted(tree_data, key=lambda x: distutils.version.LooseVersion(x['dict_code']), reverse=False)
|
|
else:
|
|
results['list'] = tree_data
|
|
|
|
results['map'] = dict_map
|
|
return CCAIResponse(results)
|
|
except Exception as e:
|
|
logger.error("get dict detail tree failed: \n%s" % traceback.format_exc())
|
|
return CCAIResponse("获取字典详情树失败", SERVER_ERROR)
|
|
else:
|
|
return CCAIResponse(PARAMS_ERR, SERVER_ERROR)
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
'''添加数据POST'''
|
|
try:
|
|
data = req_operate_by_user(request)
|
|
data['dict_detail_id'] = uuid.uuid4().__str__()
|
|
|
|
serializer = self.get_serializer(data=data)
|
|
serializer.is_valid(raise_exception=True)
|
|
self.perform_create(serializer)
|
|
# headers = self.get_success_headers(serializer.data)
|
|
# 操作记录
|
|
# info = {
|
|
# "des": "添加字典详情",
|
|
# "detail": "字典详情id: " + data['dict_detail_id'] + ", " + "字典详情名称: " + data["label"]
|
|
# }
|
|
# create_operation_history_log(request, info, OperationHistoryLog)
|
|
return CCAIResponse(data="success")
|
|
except Exception as e:
|
|
logger.error("dict detail create failed: \n%s" % traceback.format_exc())
|
|
return CCAIResponse("create failed", SERVER_ERROR)
|
|
|
|
# 获取地区字典接口 - 从redis从获取
|
|
@action(methods=["get"], detail=False, permission_classes=[IsAuthenticated],
|
|
url_path="getDictList", url_name="getDictList")
|
|
def getDictList(self, request):
|
|
parent_code = request.GET.get("parent_code")
|
|
if parent_code:
|
|
if parent_code == '':
|
|
return CCAIResponse("parent_code参数不能为空!", status=status.HTTP_400_BAD_REQUEST)
|
|
from django_redis import get_redis_connection
|
|
startTime = datetime.datetime.now()
|
|
# print(datetime.datetime.now())
|
|
conn = get_redis_connection('default')
|
|
# conn.hset('dicList', 'area', 1)
|
|
# print(conn.hget('dicList', parent_code))
|
|
str = conn.hget('dicList', parent_code)
|
|
endTime = datetime.datetime.now()
|
|
# print(datetime.datetime.now())
|
|
# print((endTime - startTime).seconds)
|
|
return CCAIResponse(data=str)
|
|
else:
|
|
return CCAIResponse("parent_code参数不能为空!", status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
# 设置地区字典接口 - 存储到redis中
|
|
@action(methods=["get"], detail=False, permission_classes=[IsAuthenticated],
|
|
url_path="setDictList", url_name="setDictList")
|
|
def setDictList(self, request):
|
|
|
|
parent_code = request.GET.get("parent_code")
|
|
is_enabled = request.GET.get("is_enabled")
|
|
label = request.GET.get("label")
|
|
order = request.GET.get("order")
|
|
sort = request.GET.get("ordering")
|
|
order_by = 'id'
|
|
if order and sort:
|
|
if order == '1':
|
|
order_by = sort
|
|
else:
|
|
order_by = '-' + sort
|
|
|
|
tree_dict = {}
|
|
tree_data = []
|
|
dict_map = {}
|
|
results = {}
|
|
|
|
if parent_code:
|
|
try:
|
|
condtions = OrderedDict()
|
|
if is_enabled:
|
|
condtions['IsEnabled'] = is_enabled
|
|
if label:
|
|
condtions['FullName__contains'] = label
|
|
condtions['ParentCode__istartswith'] = parent_code
|
|
# condtions['ParentCode'] = parent_code
|
|
|
|
queryset = DataDictionaryDetail.objects.filter(**condtions).order_by(order_by)
|
|
serializer = self.get_serializer(queryset, many=True)
|
|
for item in serializer.data:
|
|
dict_map[item['dict_code']] = item['label']
|
|
for item in serializer.data:
|
|
tree_dict[item['dict_detail_id']] = item
|
|
for i in tree_dict:
|
|
if tree_dict[i]['parent_id'] and tree_dict[i]['parent_code'] in dict_map:
|
|
pid = tree_dict[i]['parent_id']
|
|
parent = tree_dict[pid]
|
|
parent.setdefault('children', []).append(tree_dict[i])
|
|
else:
|
|
tree_data.append(tree_dict[i])
|
|
results['list'] = tree_data
|
|
|
|
results['map'] = dict_map
|
|
from django_redis import get_redis_connection
|
|
conn = get_redis_connection('default')
|
|
str = json.dumps(results).encode('utf-8').decode('unicode_escape')
|
|
# print(str)
|
|
conn.hset('dicList', parent_code, str)
|
|
return CCAIResponse(data="success")
|
|
except Exception as e:
|
|
logger.error("get dict detail tree failed: \n%s" % traceback.format_exc())
|
|
return CCAIResponse("获取字典详情树失败", SERVER_ERROR)
|
|
|
|
|
|
class DataDictionaryDetailListViewSet(ModelViewSet):
|
|
'''
|
|
字典详情列表
|
|
'''
|
|
perms_map = ({'*': 'admin'}, {'*': 'dictionarydetail_list_all'}, {'get': 'dictionarydetail_list_list'},
|
|
{'post': 'dictionarydetail_list_create'}, {'put': 'dictionarydetail_listlist_edit'},
|
|
{'delete': 'dictionarydetail_list_delete'})
|
|
queryset = DataDictionaryDetail.objects.all()
|
|
serializer_class = DictDetailSerializer
|
|
filter_backends = (SearchFilter, OrderingFilter)
|
|
ordering_fields = ('id',)
|
|
authentication_classes = (JSONWebTokenAuthentication,)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
'''
|
|
重写list方法
|
|
'''
|
|
parent_code = request.GET.get("parent_code")
|
|
is_enabled = request.GET.get("is_enabled")
|
|
label = request.GET.get("label")
|
|
order = request.GET.get("order")
|
|
sort = request.GET.get("ordering")
|
|
select_all = request.GET.get("select_all")
|
|
|
|
dict_list = []
|
|
dict_map = {}
|
|
dict_value_map = {}
|
|
results = {}
|
|
|
|
order_by = '-id'
|
|
if order and sort:
|
|
if order == '1':
|
|
order_by = sort
|
|
else:
|
|
order_by = '-' + sort
|
|
|
|
if parent_code:
|
|
try:
|
|
condtions = OrderedDict()
|
|
if label:
|
|
condtions['FullName__contains'] = label
|
|
if is_enabled:
|
|
condtions['IsEnabled'] = is_enabled
|
|
if select_all:
|
|
condtions['ParentCode__istartswith'] = parent_code
|
|
else:
|
|
condtions['ParentCode'] = parent_code
|
|
|
|
queryset = DataDictionaryDetail.objects.filter(**condtions).order_by(order_by)
|
|
serializer = self.get_serializer(queryset, many=True)
|
|
|
|
for item in serializer.data:
|
|
item['children'] = []
|
|
item['hasChildren'] = True
|
|
dict_list.append(item)
|
|
dict_map[item['dict_code']] = item['label']
|
|
dict_value_map[item['dict_val']] = item['label']
|
|
|
|
results['list'] = dict_list
|
|
|
|
results['map'] = dict_map
|
|
results['value_map'] = dict_value_map
|
|
return CCAIResponse(results)
|
|
except Exception as e:
|
|
logger.error("get dict detail tree failed: \n%s" % traceback.format_exc())
|
|
return CCAIResponse("获取字典详情列表失败", SERVER_ERROR)
|
|
else:
|
|
return CCAIResponse(PARAMS_ERR, SERVER_ERROR)
|
|
|
|
|
|
# 获取智云那边的区域
|
|
class DataDictionaryDetailTreeViewSetZY(CustomViewBase):
|
|
'''
|
|
字典详情树
|
|
'''
|
|
perms_map = ({'*': 'admin'}, {'*': 'dictionarydetail_all'}, {'get': 'dictionarydetail_list'},
|
|
{'post': 'dictionarydetail_create'}, {'put': 'dictionarydetail_edit'},
|
|
{'delete': 'dictionarydetail_delete'})
|
|
queryset = DataDictionaryDetailZY.objects.all()
|
|
serializer_class = DictDetailSerializer
|
|
filter_backends = (SearchFilter, OrderingFilter)
|
|
ordering_fields = ('id',)
|
|
authentication_classes = (JSONWebTokenAuthentication,)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
'''
|
|
重写list方法
|
|
'''
|
|
parent_code = request.GET.get("parent_code")
|
|
is_enabled = request.GET.get("is_enabled")
|
|
label = request.GET.get("label")
|
|
order = request.GET.get("order")
|
|
sort = request.GET.get("ordering")
|
|
order_by = 'id'
|
|
if order and sort:
|
|
if order == '1':
|
|
order_by = sort
|
|
else:
|
|
order_by = '-' + sort
|
|
|
|
tree_dict = {}
|
|
tree_data = []
|
|
dict_map = {}
|
|
results = {}
|
|
|
|
if parent_code:
|
|
try:
|
|
condtions = OrderedDict()
|
|
if is_enabled:
|
|
condtions['IsEnabled'] = is_enabled
|
|
if label:
|
|
condtions['FullName__contains'] = label
|
|
condtions['ParentCode__istartswith'] = parent_code
|
|
# condtions['ParentCode'] = parent_code
|
|
|
|
queryset = DataDictionaryDetailZY.objects.filter(**condtions).order_by(order_by)
|
|
serializer = self.get_serializer(queryset, many=True)
|
|
for item in serializer.data:
|
|
dict_map[item['dict_code']] = item['label']
|
|
|
|
for item in serializer.data:
|
|
tree_dict[item['dict_detail_id']] = item
|
|
for i in tree_dict:
|
|
data = tree_dict[i]
|
|
parent_id = tree_dict[i]['parent_id']
|
|
parent_code = tree_dict[i]['parent_code']
|
|
if parent_id and parent_code in dict_map and parent_code != 'CusMYType_XSSRZZL':
|
|
pid = parent_id
|
|
parent = tree_dict[pid]
|
|
parent.setdefault('children', []).append(data)
|
|
else:
|
|
tree_data.append(data)
|
|
results['list'] = tree_data
|
|
|
|
results['map'] = dict_map
|
|
return CCAIResponse(results)
|
|
except Exception as e:
|
|
logger.error("get dict detail tree failed: \n%s" % traceback.format_exc())
|
|
return CCAIResponse("获取字典详情树失败", SERVER_ERROR)
|
|
else:
|
|
return CCAIResponse(PARAMS_ERR, SERVER_ERROR)
|
|
|