views.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. # Create your views here.
  2. import hashlib
  3. import time
  4. import uuid
  5. import logging
  6. import requests
  7. from rest_framework.views import APIView
  8. from rest_framework.viewsets import ModelViewSet
  9. from background.Object import AmazonS3Util, RedisObject, TokenObject
  10. from background.author import MyAuthentication
  11. from background.serializers import ProductInfoSerializer, VideoInSerializer, QuickStartInfoSerializer, \
  12. UpgradeFirmwareInfoSerializer
  13. from background.models import ProductInfo, VideoInfo, QuickStartInfo, UpgradeFirmwareInfo, WechatUserInfo, OperationLog
  14. from rest_framework.response import Response
  15. s3_obj = AmazonS3Util()
  16. bucket = 'ansjerfilemanager'
  17. LOGGER = logging.getLogger('django')
  18. class ProductInfoSet(ModelViewSet):
  19. queryset = ProductInfo.objects.all()
  20. serializer_class = ProductInfoSerializer
  21. authentication_classes = [MyAuthentication, ]
  22. class VideoInfoSet(ModelViewSet):
  23. authentication_classes = [MyAuthentication, ]
  24. queryset = VideoInfo.objects.all()
  25. serializer_class = VideoInSerializer
  26. filterset_fields = ['id', 'product_info_id', 'title']
  27. def create(self, request, *args, **kwargs):
  28. serializer = self.get_serializer(data=request.data)
  29. serializer.is_valid(raise_exception=True)
  30. self.perform_create(serializer)
  31. log = {
  32. 'user_id': request.user,
  33. 'date': int(time.time()),
  34. 'operation': '新增了数据:{}'.format(request.data)
  35. }
  36. OperationLog.objects.create(**log)
  37. return Response(serializer.data)
  38. def update(self, request, *args, **kwargs):
  39. serializer = self.get_serializer(data=request.data, instance=self.get_object(), partial=True)
  40. serializer.is_valid(raise_exception=True)
  41. self.perform_update(serializer)
  42. log = {
  43. 'user_id': request.user,
  44. 'date': int(time.time()),
  45. 'operation': '更新了数据:{}'.format(request.data)
  46. }
  47. OperationLog.objects.create(**log)
  48. return Response(serializer.data)
  49. class QuickStartInfoSet(ModelViewSet):
  50. authentication_classes = [MyAuthentication, ]
  51. queryset = QuickStartInfo.objects.all()
  52. serializer_class = QuickStartInfoSerializer
  53. filterset_fields = ['id', 'product_info_id', 'title']
  54. def create(self, request, *args, **kwargs):
  55. link = request.data.get('link', None)
  56. file_key = 'vsees/quick_start_file/{}'.format(link)
  57. s3_obj.upload_file_obj(bucket, file_key, link, extra_args={'ACL': 'public-read'})
  58. request.data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/quick_start_file/{}'.format(link)
  59. serializer = self.get_serializer(data=request.data)
  60. serializer.is_valid(raise_exception=True)
  61. self.perform_create(serializer)
  62. log = {
  63. 'user_id': request.user,
  64. 'date': int(time.time()),
  65. 'operation': '新增了数据:{}'.format(request.data)
  66. }
  67. OperationLog.objects.create(**log)
  68. return Response(serializer.data)
  69. def update(self, request, *args, **kwargs):
  70. link = request.data.get('link', None)
  71. if link:
  72. file_key = 'vsees/quick_start_file/{}'.format(link)
  73. s3_obj.upload_file_obj(bucket, file_key, link, extra_args={'ACL': 'public-read'})
  74. request.data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/quick_start_file/{}'.format(link)
  75. serializer = self.get_serializer(data=request.data, instance=self.get_object(), partial=True)
  76. serializer.is_valid(raise_exception=True)
  77. self.perform_update(serializer)
  78. log = {
  79. 'user_id': request.user,
  80. 'date': int(time.time()),
  81. 'operation': '更新了数据:{}'.format(request.data)
  82. }
  83. OperationLog.objects.create(**log)
  84. return Response(serializer.data)
  85. class UpgradeFirmwareInfoSet(ModelViewSet):
  86. queryset = UpgradeFirmwareInfo.objects.all()
  87. serializer_class = UpgradeFirmwareInfoSerializer
  88. filterset_fields = ['id', 'product_info_id', 'title']
  89. authentication_classes = [MyAuthentication, ]
  90. def create(self, request, *args, **kwargs):
  91. link = request.data.get('link', None)
  92. file_key = 'vsees/upgrade_firmware_file/{}'.format(link)
  93. s3_obj.upload_file_obj(bucket, file_key, link, extra_args={'ACL': 'public-read'})
  94. request.data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/upgrade_firmware_file/{}'.format(link)
  95. serializer = self.get_serializer(data=request.data)
  96. serializer.is_valid(raise_exception=True)
  97. self.perform_create(serializer)
  98. log = {
  99. 'user_id': request.user,
  100. 'date': int(time.time()),
  101. 'operation': '新增了数据:{}'.format(request.data)
  102. }
  103. OperationLog.objects.create(**log)
  104. return Response(serializer.data)
  105. def update(self, request, *args, **kwargs):
  106. link = request.data.get('link', None)
  107. if link:
  108. file_key = 'vsees/upgrade_firmware_file/{}'.format(link)
  109. s3_obj.upload_file_obj(bucket, file_key, link, extra_args={'ACL': 'public-read'})
  110. request.data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/upgrade_firmware_file/{}'.format(
  111. link)
  112. serializer = self.get_serializer(data=request.data, instance=self.get_object(), partial=True)
  113. serializer.is_valid(raise_exception=True)
  114. self.perform_update(serializer)
  115. log = {
  116. 'user_id': request.user,
  117. 'date': int(time.time()),
  118. 'operation': '更新了数据:{}'.format(request.data)
  119. }
  120. OperationLog.objects.create(**log)
  121. return Response(serializer.data)
  122. class WechatLoginView(APIView):
  123. def get(self, request, *args, **kwargs):
  124. request.encoding = 'utf-8'
  125. operation = kwargs.get('operation')
  126. return self.validation(request.GET, operation, request)
  127. def post(self, request, *args, **kwargs):
  128. request.encoding = 'utf-8'
  129. operation = kwargs.get('operation')
  130. return self.validation(request.POST, operation, request)
  131. def validation(self, request_dict, operation, request):
  132. if operation == 'get-state': # 获取state值
  133. return self.get_state()
  134. elif operation == 'get-user': # 获取用户
  135. return self.get_user(request_dict)
  136. else:
  137. return Response({'code': 414, 'result': {'error_msg': '请求路径有误'}})
  138. @staticmethod
  139. def get_state():
  140. """
  141. 获取state
  142. @return: response
  143. """
  144. nwo_time = int(time.time())
  145. redis_obj = RedisObject()
  146. try:
  147. state = hashlib.md5((str(uuid.uuid1()) + str(nwo_time)).encode('utf-8')).hexdigest()
  148. state_statue = redis_obj.set_ex_data(state, 0, 300) # redis记录state
  149. if state_statue:
  150. return Response({'code': 0, 'result': {'state': state}})
  151. else:
  152. return Response({'code': 120, 'result': {'error_msg': '获取status失败'}})
  153. except Exception as e:
  154. return Response(
  155. {'code': 500, 'result': {'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))}})
  156. @classmethod
  157. def get_user(cls, request_dict):
  158. """
  159. 获取用户信息
  160. @request_dict code:唯一标识
  161. @request_dict state:唯一标识
  162. return:
  163. """
  164. code = request_dict.get('code', None)
  165. state = request_dict.get('state', None)
  166. if not all([code, state]):
  167. return Response({'code': 444, 'result': {'error_msg': '缺少参数'}})
  168. # 验证state,获取token
  169. access_token = cls.get_access_token(state)
  170. if not access_token:
  171. return Response({'code': 120, 'result': {'error_msg': '获取token失败'}})
  172. data = {
  173. 'access_token': access_token,
  174. 'code': code
  175. }
  176. try:
  177. # 获取用户id
  178. get_userid_url = 'https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo'
  179. response = requests.get(get_userid_url, params=data)
  180. data = response.json()
  181. user_id = data.get("userid")
  182. if user_id:
  183. user_name = cls.add_or_update_user_info(access_token, user_id)
  184. if not user_name:
  185. return Response({'code': 120, 'result': {'error_msg': '登录失败'}})
  186. token_obj = TokenObject()
  187. token = token_obj.generate(data={'userID': user_id, 'user': user_name})
  188. return Response({'code': 0, 'result': {'token': token}})
  189. else:
  190. errcode = data.get('errcode')
  191. errmsg = data.get('errmsg')
  192. return Response({'code': errcode, 'result': {'error_msg': errmsg}})
  193. except Exception as e:
  194. return Response(
  195. {'code': 500, 'result': {'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))}})
  196. @classmethod
  197. def get_access_token(cls, state):
  198. redis_client = RedisObject()
  199. state_val = redis_client.get_data(state)
  200. # 验证state
  201. if state_val:
  202. redis_client.del_data(state)
  203. else:
  204. LOGGER.info('企业微信扫码登录,state:{}获取失败'.format(state))
  205. return False
  206. access_token = redis_client.get_data(key='enterprise_wechat_access_token')
  207. if access_token:
  208. return access_token
  209. data = {
  210. 'corpid': 'ww467ec1685e8262e6',
  211. 'corpsecret': 'IeUoaQ-0hEhEduCQq1zyfVXjfeZpMsThK1nklszRzUY'
  212. }
  213. # 获取access_token,redis中不存在该值时重新请求获取access_token(有效时长两小时)
  214. token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
  215. token_response = requests.get(token_url, params=data)
  216. data = token_response.json()
  217. if data.get('errcode') == 0:
  218. access_token = data['access_token']
  219. expires_in = data['expires_in']
  220. flag = redis_client.set_ex_data('enterprise_wechat_access_token', access_token, expires_in)
  221. if flag:
  222. return access_token
  223. else:
  224. LOGGER.info('企业微信扫码登录,access_token:{}储存失败'.format(access_token))
  225. return False
  226. else:
  227. LOGGER.info('企业微信扫码登录,access_token获取失败')
  228. return False
  229. @classmethod
  230. def add_or_update_user_info(cls, access_token, user_id):
  231. now_time = int(time.time())
  232. data = {
  233. 'access_token': access_token,
  234. 'userid': user_id
  235. }
  236. # 获取用户信息
  237. token_url = 'https://qyapi.weixin.qq.com/cgi-bin/user/get'
  238. response = requests.get(token_url, params=data)
  239. data = response.json()
  240. wechat_user_qs = WechatUserInfo.objects.filter(user_id=user_id)
  241. if data.get('errcode') == 0:
  242. url_data = {
  243. 'name': data.get('name'),
  244. 'position': data.get('position'),
  245. 'status': data.get('status'),
  246. 'add_time': now_time,
  247. 'upd_time': now_time
  248. }
  249. if not wechat_user_qs.exists():
  250. url_data['user_id'] = user_id
  251. WechatUserInfo.objects.create(**url_data)
  252. else:
  253. wechat_user_qs.update(**url_data)
  254. if data.get('status') == 1:
  255. return data.get('name')
  256. else:
  257. return False
  258. else:
  259. return False