FeedBack.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD018
  6. @NAME: AnsjerFormal
  7. @software: PyCharm
  8. @DATE: 2019/1/18 10:45
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: SysMsg.py
  12. @Contact: chanjunkai@163.com
  13. """
  14. import json
  15. import time
  16. import boto3
  17. import oss2
  18. from django.db import transaction
  19. from django.views.generic.base import View
  20. from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
  21. from Model.models import FeedBackModel, StatResModel, PushInaccurateFeedback
  22. from Object.ResponseObject import ResponseObject
  23. from Object.TokenObject import TokenObject
  24. from Service.CommonService import CommonService
  25. from Service.ModelService import ModelService
  26. from Object.AWS.AmazonS3Util import AmazonS3Util
  27. from Ansjer.config import CONFIG_TEST, CONFIG_CN, CONFIG_US, CONFIG_EUR, CONFIG_INFO, AWS_IOT_SES_ACCESS_CHINA_REGION, \
  28. AWS_SES_ACCESS_REGION
  29. class FeedBackView(View):
  30. def get(self, request, *args, **kwargs):
  31. request.encoding = 'utf-8'
  32. operation = kwargs.get('operation', None)
  33. return self.validation(request.GET, operation)
  34. def post(self, request, *args, **kwargs):
  35. request.encoding = 'utf-8'
  36. operation = kwargs.get('operation', None)
  37. return self.validation(request.POST, operation)
  38. def validation(self, request_dict, operation):
  39. response = ResponseObject()
  40. token = request_dict.get('token', None)
  41. tko = TokenObject(token)
  42. if tko.code == 0:
  43. userID = tko.userID
  44. if operation == 'add':
  45. return self.do_add(userID, request_dict, response)
  46. elif operation == 'getUploadUrl':
  47. return self.do_get_upload_url(request_dict, response)
  48. elif operation == 'query':
  49. return self.do_query(userID, request_dict, response)
  50. elif operation == 'delete':
  51. return self.do_delete(userID, request_dict, response)
  52. elif operation == 'queryByAdmin':
  53. return self.do_query_by_admin(userID, request_dict, response)
  54. elif operation == 'deleteByAdmin':
  55. return self.do_delete_by_admin(userID, request_dict, response)
  56. elif operation == 'deleteImage':
  57. return self.do_delete_image(userID, request_dict, response)
  58. elif operation == 'pushInaccurate':
  59. return self.ai_recognition(userID, request_dict, response)
  60. else:
  61. return response.json(414)
  62. else:
  63. return response.json(tko.code)
  64. def do_query(self, userID, request_dict, response):
  65. page = request_dict.get('page', None)
  66. line = request_dict.get('line', None)
  67. if page and line:
  68. page = int(page)
  69. line = int(line)
  70. else:
  71. return response.json(444, 'page,line')
  72. fb_qs = FeedBackModel.objects.filter(userID_id=userID)[(page - 1) * line:page * line]. \
  73. values('id', 'status', 'content', 'addTime', 'updTime', 'type')
  74. sid_list = []
  75. for fb in fb_qs:
  76. sid_list.append(fb['id'])
  77. sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=sid_list).values('id', 'name', 'feedbackmodel__id')
  78. # return response.json(0,list(sm_qs))
  79. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  80. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  81. res = []
  82. for fb in fb_qs:
  83. fb['img_url'] = []
  84. for sm in sm_qs:
  85. if sm['feedbackmodel__id'] == fb['id']:
  86. obj = 'feedback/' + sm['name']
  87. img_url = bucket.sign_url('GET', obj, 3600)
  88. fb['img_url'].append(img_url)
  89. # fb['FS__name'] = sm['name']
  90. res.append(fb)
  91. return response.json(0, res)
  92. def do_add(self, userID, request_dict, response):
  93. nowTime = int(time.time())
  94. content = request_dict.get('content', None)
  95. type = request_dict.get('type', None)
  96. res_1 = request_dict.get('res_1', None)
  97. res_2 = request_dict.get('res_2', None)
  98. res_3 = request_dict.get('res_3', None)
  99. app = request_dict.get('app', None)
  100. phone_model = request_dict.get('phone_model', None)
  101. os_version = request_dict.get('os_version', None)
  102. uid = request_dict.get('uid', None)
  103. product_type = request_dict.get('product_type', None)
  104. app_version = request_dict.get('app_version', None)
  105. appBundleId = request_dict.get('appBundleId', None)
  106. email = request_dict.get('email', None)
  107. score = request_dict.get('score', None)
  108. try:
  109. with transaction.atomic():
  110. fb = FeedBackModel()
  111. fb.addTime = nowTime
  112. fb.updTime = nowTime
  113. fb.content = content
  114. if type:
  115. fb.type = type
  116. if app:
  117. fb.app = app
  118. if phone_model:
  119. fb.phone_model = phone_model
  120. if os_version:
  121. fb.os_version = os_version
  122. if uid:
  123. fb.uid = uid
  124. if product_type:
  125. fb.product_type = product_type
  126. if app_version:
  127. fb.app_version = app_version
  128. if appBundleId:
  129. fb.appBundleId = appBundleId
  130. if email:
  131. fb.email = email
  132. if score:
  133. fb.score = score
  134. fb.userID_id = userID
  135. fb.save()
  136. if res_1:
  137. fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_1))
  138. if res_2:
  139. fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_2))
  140. if res_3:
  141. fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_3))
  142. except Exception as e:
  143. print(repr(e))
  144. return response.json(500, repr(e))
  145. else:
  146. return response.json(0)
  147. def do_get_upload_url(self, request_dict, response):
  148. uploadType = request_dict.get('uploadType', None)
  149. uploadType = json.loads(uploadType)
  150. if len(uploadType):
  151. res = []
  152. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  153. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  154. for upType in uploadType:
  155. name = CommonService.createOrderID()
  156. s_name = str(name) + '.' + upType
  157. obj = 'feedback/' + s_name
  158. url = bucket.sign_url('PUT', obj, 7200)
  159. res.append({'put_url': url, 'res_name': s_name})
  160. return response.json(0, res)
  161. else:
  162. return response.json(444, 'uploadType')
  163. def do_delete(self, userID, request_dict, response):
  164. id = request_dict.get('id', None)
  165. try:
  166. fb_qs = FeedBackModel.objects.get(userID_id=userID, id=id)
  167. sr_id_list = fb_qs.FS.values_list('id', flat=True)
  168. StatResModel.objects.filter(id__in=sr_id_list).delete()
  169. fb_qs.delete()
  170. # is_delete = StatResModel.objects.filter(id__in=sr_id_list).delete()
  171. # print(is_delete)
  172. print('----------')
  173. except Exception as e:
  174. return response.json(500, repr(e))
  175. else:
  176. return response.json(0)
  177. def do_query_by_admin(self, userID, request_dict, response):
  178. own_perm = ModelService.check_perm(userID, 30)
  179. if own_perm:
  180. page = request_dict.get('page', None)
  181. line = request_dict.get('line', None)
  182. status = request_dict.get('status', None)
  183. username = request_dict.get('username', None)
  184. type = request_dict.get('type', None)
  185. if page and line:
  186. page = int(page)
  187. line = int(line)
  188. filter_data = {}
  189. if status:
  190. filter_data = {'status': status}
  191. if username:
  192. filter_data = {'userID_id': ModelService.get_userID_byname(username)}
  193. if type:
  194. filter_data = {'type': type}
  195. try:
  196. fb_qs = FeedBackModel.objects.filter()
  197. except Exception as e:
  198. return response.json(500, repr(e))
  199. print('----------')
  200. if filter_data:
  201. fb_qs = fb_qs.filter(**filter_data)
  202. count = fb_qs.count()
  203. fb_qs = fb_qs[(page - 1) * line:page * line].values('id', 'type', 'status', 'content', 'addTime', 'app',
  204. 'uid', 'os_version', 'phone_model', 'product_type',
  205. 'updTime', 'userID__username', 'userID__phone',
  206. 'userID__userEmail', 'app_version', 'appBundleId',
  207. 'email', 'score'
  208. )
  209. sid_list = []
  210. print(fb_qs)
  211. for fb in fb_qs:
  212. sid_list.append(fb['id'])
  213. sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=sid_list).values('id', 'name',
  214. 'feedbackmodel__id')
  215. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  216. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  217. res = []
  218. print(sm_qs)
  219. for fb in fb_qs:
  220. fb['img_url'] = []
  221. for sm in sm_qs:
  222. if sm['feedbackmodel__id'] == fb['id']:
  223. obj = 'feedback/' + sm['name']
  224. img_url = bucket.sign_url('GET', obj, 3600)
  225. # img_url.replace('statres.oss-cn-hongkong.aliyuncs.com','static.zositech.xyz')
  226. fb['img_url'].append(img_url)
  227. # fb['FS__name'] = sm['name']
  228. if fb['userID__username'] == '':
  229. fb['userID__username'] = fb['userID__userEmail']
  230. if fb['userID__username'] == '':
  231. fb['userID__username'] = fb['userID__phone']
  232. res.append(fb)
  233. return response.json(0, {'datas': res, 'count': count})
  234. else:
  235. return response.json(444, 'page,line')
  236. else:
  237. return response.json(404)
  238. def do_delete_by_admin(self, userID, request_dict, response):
  239. own_perm = ModelService.check_perm(userID, 10)
  240. if own_perm:
  241. id = request_dict.get('id', None)
  242. try:
  243. fb_qs = FeedBackModel.objects.get(id=id)
  244. sr_id_list = fb_qs.FS.values_list('id', flat=True)
  245. StatResModel.objects.filter(id__in=sr_id_list).delete()
  246. fb_qs.delete()
  247. print('----------')
  248. except Exception as e:
  249. return response.json(500, repr(e))
  250. else:
  251. return response.json(0)
  252. else:
  253. return response.json(404)
  254. def do_delete_image(self, userID, request_dict, response):
  255. # own_perm = ModelService.check_perm(userID, 10)
  256. # if not own_perm:
  257. # return response.json(404)
  258. end_time = request_dict.get('end_time', None)
  259. if end_time is None:
  260. return response.json(444)
  261. sys_ms_qs = FeedBackModel.objects.filter(addTime__lt=end_time).order_by('id').values('id')
  262. ids = []
  263. for sys_ms in sys_ms_qs:
  264. ids.append(sys_ms['id'])
  265. sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=ids).values('id', 'name')
  266. names = []
  267. time_struct = time.localtime()
  268. current_year = time_struct.tm_year
  269. target_year = current_year - 1
  270. str_prefix = str(target_year)
  271. print(str_prefix)
  272. for sm in sm_qs:
  273. name = sm['name']
  274. if name.find(str_prefix) == 0:
  275. names.append('feedback/' + name)
  276. # auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  277. # bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  278. # bucket.batch_delete_objects(names)
  279. # FeedBackModel.objects.filter(id__in=ids).delete()
  280. print(names)
  281. print(len(names))
  282. return response.json(0)
  283. @staticmethod
  284. def ai_recognition(user_id, request_dict, response):
  285. equipment_info_id = request_dict.get('equipment_info_id', None)
  286. uid = request_dict.get('uid', None)
  287. is_st = request_dict.get('is_st', None)
  288. event_type = request_dict.get('event_type', None)
  289. event_time = request_dict.get('event_time', None)
  290. channel = request_dict.get('channel', None)
  291. if not all([equipment_info_id, uid, is_st, event_type, event_time, channel]):
  292. return response.json(444)
  293. if CONFIG_INFO == CONFIG_TEST or CONFIG_INFO == CONFIG_CN: # 国内
  294. region_name = AWS_IOT_SES_ACCESS_CHINA_REGION
  295. aws_access_key_id = AWS_ACCESS_KEY_ID[0]
  296. secret_access_key = AWS_SECRET_ACCESS_KEY[0]
  297. else: # 国外
  298. region_name = AWS_SES_ACCESS_REGION
  299. aws_access_key_id = AWS_ACCESS_KEY_ID[1]
  300. secret_access_key = AWS_SECRET_ACCESS_KEY[1]
  301. equipment_info_id = equipment_info_id[1:]
  302. now_time = int(time.time())
  303. is_st = int(is_st)
  304. try:
  305. s3 = AmazonS3Util(
  306. aws_access_key_id=aws_access_key_id,
  307. secret_access_key=secret_access_key,
  308. region_name=region_name
  309. )
  310. if is_st != 3:
  311. file_path = '{uid}/{channel}/{event_time}.jpeg'.format(uid=uid,
  312. channel=channel,
  313. event_time=event_time)
  314. s3.copy_obj('push', 'push-inaccurate', file_path)
  315. else:
  316. for index in range(3):
  317. file_path = '{uid}/{channel}/{event_time}_{index}.jpeg'.format(uid=uid,
  318. channel=channel,
  319. event_time=event_time,
  320. index=index)
  321. s3.copy_obj('push', 'push-inaccurate', file_path)
  322. PushInaccurateFeedback.objects.create(equipment_info_id=equipment_info_id,
  323. user_id=user_id, event_type=event_type,
  324. uid=uid, channel=channel, add_time=now_time,
  325. is_st=is_st, event_time=event_time)
  326. return response.json(0)
  327. except Exception as e:
  328. return response.json(500, repr(e))