DeviceVersionInfoController.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : DeviceVersionInfoController.py
  4. @Time : 2024/11/20 14:20
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import json
  10. from django.http import QueryDict
  11. from django.views import View
  12. from Ansjer.config import LOGGER
  13. from Model.models import DeviceVersionInfo
  14. from Object.Enums.RedisKeyConstant import RedisKeyConstant
  15. from Object.RedisObject import RedisObject
  16. from Object.ResponseObject import ResponseObject
  17. from Object.TokenObject import TokenObject
  18. from Service.CommonService import CommonService
  19. class DeviceVersionInfoView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.GET, request, operation)
  24. def post(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.POST, request, operation)
  28. def delete(self, request, *args, **kwargs):
  29. request.encoding = 'utf-8'
  30. operation = kwargs.get('operation')
  31. delete = QueryDict(request.body)
  32. if not delete:
  33. delete = request.GET
  34. return self.validation(delete, request, operation)
  35. def put(self, request, *args, **kwargs):
  36. request.encoding = 'utf-8'
  37. operation = kwargs.get('operation')
  38. put = QueryDict(request.body)
  39. return self.validation(put, request, operation)
  40. def validation(self, request_dict, request, operation):
  41. response = ResponseObject('cn')
  42. tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  43. if tko.code != 0:
  44. return response.json(tko.code)
  45. response.lang = tko.lang
  46. userID = tko.userID
  47. if operation == 'getInfo':
  48. return self.get_device_version_info(userID, request, request_dict, response)
  49. else:
  50. return response.json(414)
  51. @classmethod
  52. def get_device_version_info(cls, user_id, request, request_dict, response):
  53. # 从请求字典中获取uid和version
  54. uid = request_dict.get('uid')
  55. version = request_dict.get('version')
  56. # 检查version是否存在
  57. if not version:
  58. return response.json(444) # 错误代码:没有提供version
  59. try:
  60. # 示例输入字符串
  61. ip = CommonService.get_ip_address(request)
  62. LOGGER.info(f'获取设备版本配置信息 user: {user_id}, uid: {uid}, version: {version}, ip: {ip} ')
  63. # 从右侧分割字符串,获取版本和设备代码
  64. ver, d_code = version.rsplit('.', 1) # 使用从右到左分割
  65. ver = ver.replace('V', '') # 移除版本前的'V'
  66. # 创建Redis对象
  67. redis = RedisObject()
  68. # 构建Redis键
  69. version_key = RedisKeyConstant.ZOSI_DEVICE_VERSION_INFO.value + ver + d_code
  70. # 尝试从Redis中获取数据
  71. version_info = redis.get_data(version_key)
  72. if version_info:
  73. # 如果在Redis中找到了数据,直接返回
  74. return response.json(0, json.loads(version_info))
  75. # 从数据库查询设备版本信息
  76. device_version_qs = DeviceVersionInfo.objects.filter(d_code=d_code, software_ver=ver).values()
  77. if not device_version_qs.exists():
  78. return response.json(173) # 错误代码:未找到设备版本信息
  79. # 从QuerySet中获取设备信息
  80. device_info = device_version_qs
  81. # 将设备信息序列化为JSON
  82. device_json = json.dumps(device_info[0])
  83. # 将数据写入Redis,以便后续使用
  84. redis.set_data(version_key, device_json, 60 * 60 * 24) # 设置TTL为24小时
  85. # 返回设备信息
  86. return response.json(0, device_info[0])
  87. except Exception as e:
  88. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))