Commit 8731d629 by 周田

feat:修改要使用的协议版本

parent 672dab88
import json
from device_data_op.models import TableAllDevCmdDefine, TableDevCmdNamePoll
from device_data_op.serializers import TableAllDevCmdDefineSerializer, TableDevCmdNamePollSerializer
from django.db.models import QuerySet
from rest_framework.response import Response
from rest_framework import status
from .models import (AllDevCmdDefineAndVersion, AllProtocolDefinAndVersion,
AllProtocolVersion, CurrentDevVersion)
from .serializers import (AllDevCmdDefineAndVersionSerializer, AllProtocolDefinAndVersionSerializer,
AllProtocolVersionSerializer, CurrentDevVersionSerializer)
INIT_VERSION = "init"
def init_protocol_version_manage(protocol_name: str) -> None:
"""
将协议版本信息初始化,即先将 device 已经在用的表的数据添加到数据库表中
:param protocol_name: 协议名
"""
protocol_cmds = TableDevCmdNamePoll.objects.filter(protocol_name=protocol_name).all()
protocol_cmds_serializer = TableDevCmdNamePollSerializer(protocol_cmds, many=True)
all_protocol_objects: list[AllProtocolDefinAndVersion] = []
for protocol in protocol_cmds_serializer.data:
protocol['version'] = json.dumps([INIT_VERSION])
del protocol['id']
all_protocol_objects.append(AllProtocolDefinAndVersion(**protocol))
AllProtocolDefinAndVersion.objects.bulk_create(all_protocol_objects)
cmd_fields: list[QuerySet] = []
for protocol in protocol_cmds:
cmd_fields.extend(TableAllDevCmdDefine.objects.filter(cmd_name=protocol.cmd_name).all())
cmd_fields_serializer = TableAllDevCmdDefineSerializer(cmd_fields, many=True)
all_cmd_fields_objects: list[AllDevCmdDefineAndVersion] = []
for cmd_field in cmd_fields_serializer.data:
cmd_field['version'] = json.dumps([INIT_VERSION])
del cmd_field['id']
all_cmd_fields_objects.append(AllDevCmdDefineAndVersion(**cmd_field))
AllDevCmdDefineAndVersion.objects.bulk_create(all_cmd_fields_objects)
version_path = {
"version": INIT_VERSION
}
AllProtocolVersion.objects.create(protocol_name=protocol_name,
version_paths=json.dumps([version_path]))
CurrentDevVersion.objects.create(protocol_name=protocol_name,
version=INIT_VERSION)
def update_device_protocol_and_cmds(protocol_name: str, version: str) -> Response:
"""
根据协议名和版本号更新协议版本信息
通过协议名和版本号将 AllProtocolDefinAndVersion 和 AllDevCmdDefineAndVersion 中符合
要求的数据更新到 TableDevCmdNamePoll 和 TableAllDevCmdDefine 中
:param protocol_name: 协议名
:param version: 版本号
:return: 当前版本,协议相关的数据
"""
# 更新版本号
CurrentDevVersion.objects.filter(protocol_name=protocol_name).update(version=version)
# 更新协议版本信息
all_protocol = AllProtocolDefinAndVersion.objects.filter(protocol_name=protocol_name).all()
current_version_protocols = [protocol for protocol in all_protocol
if version in json.loads(protocol.version)]
cmd_fields = []
for current_version_protocol in current_version_protocols:
cmd_name = current_version_protocol.cmd_name
cmd_fields.extend([item for item in AllDevCmdDefineAndVersion.objects.filter(cmd_name=cmd_name).all()
if version in json.loads(item.version)])
current_version_protocol_serializer = AllProtocolDefinAndVersionSerializer(current_version_protocols, many=True)
cmd_fields_serializer = AllDevCmdDefineAndVersionSerializer(cmd_fields, many=True)
# 更新 device 所使用的协议表数据
for protocol in current_version_protocol_serializer.data:
obj, _ = TableDevCmdNamePoll.objects.update_or_create(
protocol_name=protocol['protocol_name'],
cmd_name=protocol['cmd_name'],
defaults={
'protocol_name': protocol['protocol_name'],
'cmd_name': protocol['cmd_name'],
'cmd_type': protocol['cmd_type'],
'encode': protocol['encode'],
'timing_cmd_cycle_period': protocol['timing_cmd_cycle_period'],
'cmd_explain': protocol['cmd_explain']
}
)
if obj is None:
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# 更新 device 所使用的命令表数据
for cmd_field in cmd_fields_serializer.data:
obj, _ = TableAllDevCmdDefine.objects.update_or_create(
cmd_name=cmd_field['cmd_name'],
fieldname=cmd_field['fieldname'],
defaults={
'cmd_name': cmd_field['cmd_name'],
'cmd_type': cmd_field['cmd_type'],
'fieldindex': cmd_field['fieldindex'],
'fieldname': cmd_field['fieldname'],
'fieldsize': cmd_field['fieldsize'],
'value': cmd_field['value'],
'minvalue': cmd_field['minvalue'],
'maxvalue': cmd_field['maxvalue'],
'datatype': cmd_field['datatype'],
'lua_script_in': cmd_field['lua_script_in'],
'lua_script_out': cmd_field['lua_script_out']
}
)
if obj is None:
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# 返回数据
cmds = []
for protocol in current_version_protocol_serializer.data:
protocol['fields'] = sorted([item for item in cmd_fields_serializer.data
if item['cmd_name'] == protocol['cmd_name']],
key=lambda item: item['fieldindex'])
cmds.append(protocol)
res_data = {
'current_version': version,
'protocol': protocol_name,
'cmds': cmds
}
return Response(data=res_data, status=status.HTTP_200_OK)
......@@ -5,5 +5,6 @@ from . import views
urlpatterns = [
re_path(r'^protocol_version_manage/init/$', views.init),
re_path(r'^protocol_version_manage/change_protocol_version/$', views.change_protocol_version),
re_path(r'^all_protocol_version/$', views.AllProtocolVersionViewSet.as_view({'get': 'list'})),
]
import json
from device_data_op.models import TableAllDevCmdDefine, TableDevCmdNamePoll
from device_data_op.serializers import TableAllDevCmdDefineSerializer, TableDevCmdNamePollSerializer
from django.db.models import QuerySet
from .models import (AllDevCmdDefineAndVersion, AllProtocolDefinAndVersion,
AllProtocolVersion, CurrentDevVersion)
INIT_VERSION = "init"
def init_protocol_version_manage(protocol_name) -> None:
"""
将协议版本信息初始化,即先将 device 已经在用的表的数据添加到数据库表中
:param protocol_name: 协议名
"""
protocol_cmds = TableDevCmdNamePoll.objects.filter(protocol_name=protocol_name).all()
protocol_cmds_serializer = TableDevCmdNamePollSerializer(protocol_cmds, many=True)
all_protocol_objects: list[AllProtocolDefinAndVersion] = []
for protocol in protocol_cmds_serializer.data:
protocol['version'] = json.dumps([INIT_VERSION])
del protocol['id']
all_protocol_objects.append(AllProtocolDefinAndVersion(**protocol))
AllProtocolDefinAndVersion.objects.bulk_create(all_protocol_objects)
cmd_fields: list[QuerySet] = []
for protocol in protocol_cmds:
cmd_fields.extend(TableAllDevCmdDefine.objects.filter(cmd_name=protocol.cmd_name).all())
cmd_fields_serializer = TableAllDevCmdDefineSerializer(cmd_fields, many=True)
all_cmd_fields_objects: list[AllDevCmdDefineAndVersion] = []
for cmd_field in cmd_fields_serializer.data:
cmd_field['version'] = json.dumps([INIT_VERSION])
del cmd_field['id']
all_cmd_fields_objects.append(AllDevCmdDefineAndVersion(**cmd_field))
AllDevCmdDefineAndVersion.objects.bulk_create(all_cmd_fields_objects)
version_path = {
"version": INIT_VERSION
}
AllProtocolVersion.objects.create(protocol_name=protocol_name,
version_paths=json.dumps([version_path]))
CurrentDevVersion.objects.create(protocol_name=protocol_name,
version=INIT_VERSION)
......@@ -9,11 +9,14 @@ from .models import (AllDevCmdDefineAndVersion, AllProtocolDefinAndVersion,
AllProtocolVersion, CurrentDevVersion)
from .serializers import (AllDevCmdDefineAndVersionSerializer, AllProtocolDefinAndVersionSerializer,
AllProtocolVersionSerializer, CurrentDevVersionSerializer)
from .utils import init_protocol_version_manage
from .services import init_protocol_version_manage, update_device_protocol_and_cmds
@api_view(['POST'])
def init(request):
"""
初始化协议版本信息(用的很少,大概)
"""
protocol_name = request.data.get('protocol_name')
assert protocol_name is not None, Response(status=status.HTTP_400_BAD_REQUEST)
......@@ -36,6 +39,16 @@ def init(request):
return Response(data=res_data, status=status.HTTP_200_OK)
@api_view(['POST'])
def change_protocol_version(request):
version = request.data.get('version')
protocol_name = request.data.get('protocol_name')
assert protocol_name is not None and version is not None, Response(status=status.HTTP_400_BAD_REQUEST)
return update_device_protocol_and_cmds(protocol_name, version)
class AllProtocolVersionViewSet(GenericViewSet, ListModelMixin):
queryset = AllProtocolVersion.objects.all()
serializer_class = AllProtocolVersionSerializer
No preview for this file type
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment