UserDataController.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : UserDataController.py
  4. @Time : 2022/8/16 10:44
  5. @Author : peng
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. from django.db.models import Count
  10. from django.views.generic.base import View
  11. import datetime
  12. import requests
  13. from Model.models import Device_User, CountryModel
  14. from Service.CommonService import CommonService
  15. # 用户数据
  16. class UserDataView(View):
  17. def get(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. operation = kwargs.get('operation')
  20. return self.validation(request.GET, request, operation)
  21. def post(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.POST, request, operation)
  25. def validation(self, request_dict, request, operation):
  26. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  27. if token_code != 0:
  28. return response.json(token_code)
  29. if operation == 'increase': # 查询用户新增数据
  30. return self.user_increase(request_dict, response)
  31. elif operation == 'active': # 查询用户活跃数据
  32. return self.user_active(request_dict, response)
  33. elif operation == 'region': # 查询用户地区分布
  34. return self.user_region(response)
  35. elif operation == 'global/increase': # 查询全球用户新增数据
  36. return self.global_user_increase(request, request_dict, response)
  37. elif operation == 'global/active': # 查询全球用户活跃数据
  38. return self.global_user_active(request, request_dict, response)
  39. elif operation == 'global/region': # 查询全球用户地区分布
  40. return self.global_user_region(request, response)
  41. else:
  42. return response.json(414)
  43. @classmethod
  44. def user_increase(cls, request_dict, response):
  45. """
  46. 查询用户增长数据
  47. @param request_dict:请求参数
  48. @request_dict startTime:开始时间
  49. @request_dict endTime:结束时间
  50. @request_dict timeUnit:时间单位
  51. @param response:响应对象
  52. @return:
  53. """
  54. start_time = request_dict.get('startTime', None)
  55. end_time = request_dict.get('endTime', None)
  56. time_unit = request_dict.get('timeUnit', None)
  57. if not all([start_time, end_time, time_unit]):
  58. return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
  59. start_time = datetime.datetime.fromtimestamp(int(start_time))
  60. end_time = datetime.datetime.fromtimestamp(int(end_time))
  61. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  62. try:
  63. user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
  64. user_list = []
  65. count = user_qs.count()
  66. for item in time_list:
  67. s_time = datetime.datetime.fromtimestamp(int(item[0]))
  68. e_time = datetime.datetime.fromtimestamp(int(item[1]))
  69. user_date_qs = user_qs.filter(last_login__range=(s_time, e_time))
  70. rate = round(user_date_qs.count() / count * 100, 2)
  71. user_dict = {
  72. 'count': user_date_qs.count(),
  73. 'rate': rate,
  74. 'startTime': item[0],
  75. 'endTime': item[1]
  76. }
  77. user_list.append(user_dict)
  78. user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
  79. '-count')
  80. region_list = []
  81. for item in user_country_qs:
  82. country_id = item['region_country']
  83. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  84. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  85. rate = round(item['count'] / count * 100, 2)
  86. country_dict = {
  87. 'countryName': country_name,
  88. 'count': item['count'],
  89. 'rate': rate
  90. }
  91. region_list.append(country_dict)
  92. res = {
  93. 'user': user_list,
  94. 'region': region_list
  95. }
  96. return response.json(0, res)
  97. except Exception as e:
  98. return response.json(500, repr(e))
  99. @classmethod
  100. def user_active(cls, request_dict, response):
  101. """
  102. 查询用户活跃数据
  103. @param request_dict:请求参数
  104. @request_dict startTime:开始时间
  105. @request_dict endTime:结束时间
  106. @request_dict timeUnit:时间单位
  107. @param response:响应对象
  108. @return:
  109. """
  110. start_time = request_dict.get('startTime', None)
  111. end_time = request_dict.get('endTime', None)
  112. time_unit = request_dict.get('timeUnit', None)
  113. if not all([start_time, end_time, time_unit]):
  114. return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
  115. start_time = datetime.datetime.fromtimestamp(int(start_time))
  116. end_time = datetime.datetime.fromtimestamp(int(end_time))
  117. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  118. try:
  119. user_qs = Device_User.objects.filter(last_login__range=(start_time, end_time))
  120. user_list = []
  121. count = user_qs.count()
  122. for item in time_list:
  123. s_time = datetime.datetime.fromtimestamp(int(item[0]))
  124. e_time = datetime.datetime.fromtimestamp(int(item[1]))
  125. user_date_qs = user_qs.filter(last_login__range=(s_time, e_time))
  126. rate = round(user_date_qs.count() / count * 100, 2)
  127. user_dict = {
  128. 'count': user_date_qs.count(),
  129. 'rate': rate,
  130. 'startTime': item[0],
  131. 'endTime': item[1]
  132. }
  133. user_list.append(user_dict)
  134. user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
  135. '-count')
  136. region_list = []
  137. for item in user_country_qs:
  138. country_id = item['region_country']
  139. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  140. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  141. rate = round(item['count'] / count * 100, 2)
  142. country_dict = {
  143. 'countryName': country_name,
  144. 'count': item['count'],
  145. 'rate': rate
  146. }
  147. region_list.append(country_dict)
  148. res = {
  149. 'user': user_list,
  150. 'region': region_list
  151. }
  152. return response.json(0, res)
  153. except Exception as e:
  154. return response.json(500, repr(e))
  155. @classmethod
  156. def user_region(cls, response):
  157. """
  158. 查询用户地区分布
  159. @param response:响应对象
  160. @return:
  161. """
  162. res = {
  163. 'countries': [],
  164. }
  165. try:
  166. user_qs = Device_User.objects.all()
  167. count = user_qs.count()
  168. user_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by('-count')
  169. continent_list = []
  170. for item in user_qs:
  171. country_id = item['region_country']
  172. country_qs = CountryModel.objects.filter(id=country_id).values('country_name', 'region__name')
  173. item['countryName'] = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  174. item['rate'] = round(item['count'] / count * 100, 2)
  175. if country_qs.exists():
  176. flag = 0
  177. for each in continent_list:
  178. if country_qs[0]['region__name'] == each['continentName']:
  179. each['count'] += item['count']
  180. flag = 1
  181. break
  182. if flag == 0:
  183. continent_list.append({
  184. 'continentName': country_qs[0]['region__name'],
  185. 'count': item['count']
  186. })
  187. for item in continent_list:
  188. item['rate'] = round(item['count'] / count * 100, 2)
  189. res['countries'] = list(user_qs)
  190. res['continent'] = continent_list
  191. return response.json(0, res)
  192. except Exception as e:
  193. return response.json(500, repr(e))
  194. @classmethod
  195. def global_user_increase(cls, request, request_dict, response):
  196. """
  197. 查询全球用户新增数据
  198. @param request:请求
  199. @param request_dict:请求参数
  200. @param response:响应对象
  201. @return:
  202. """
  203. url_list = CommonService.get_domain_name()
  204. try:
  205. headers = {
  206. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  207. }
  208. user_list = []
  209. user_count = 0
  210. region_list = []
  211. region_count = 0
  212. for url in url_list:
  213. url = url + request.path.replace('global/', '')
  214. res = requests.get(url=url, params=request_dict, headers=headers)
  215. result = res.json()
  216. if result['result_code'] == 0:
  217. for item in result['result']['user']:
  218. flag = 0
  219. for each in user_list:
  220. if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']:
  221. each['count'] += item['count']
  222. user_count += item['count']
  223. flag = 1
  224. break
  225. if flag == 0:
  226. user_list.append(item)
  227. user_count += item['count']
  228. for item in user_list:
  229. item['rate'] = round(item['count'] / user_count * 100, 2)
  230. for item in result['result']['region']:
  231. flag = 0
  232. for each in region_list:
  233. if item['countryName'] == each['countryName']:
  234. each['count'] += item['count']
  235. region_count += item['count']
  236. flag = 1
  237. break
  238. if flag == 0:
  239. region_list.append(item)
  240. region_count += item['count']
  241. for item in region_list:
  242. item['rate'] = round(item['count'] / region_count * 100, 2)
  243. else:
  244. return response.json(result['result_code'])
  245. res = {
  246. 'user': user_list,
  247. 'region': CommonService.list_sort(region_list)
  248. }
  249. return response.json(0, res)
  250. except Exception as e:
  251. return response.json(500, repr(e))
  252. @classmethod
  253. def global_user_active(cls, request, request_dict, response):
  254. """
  255. 查询全球用户活跃数据
  256. @param request:请求
  257. @param request_dict:请求参数
  258. @param response:响应对象
  259. @return:
  260. """
  261. url_list = CommonService.get_domain_name()
  262. try:
  263. headers = {
  264. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  265. }
  266. user_list = []
  267. user_count = 0
  268. region_list = []
  269. region_count = 0
  270. for url in url_list:
  271. url = url + request.path.replace('global/', '')
  272. res = requests.get(url=url, params=request_dict, headers=headers)
  273. result = res.json()
  274. if result['result_code'] == 0:
  275. for item in result['result']['user']:
  276. flag = 0
  277. for each in user_list:
  278. if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']:
  279. each['count'] += item['count']
  280. user_count += item['count']
  281. flag = 1
  282. break
  283. if flag == 0:
  284. user_list.append(item)
  285. user_count += item['count']
  286. for item in user_list:
  287. item['rate'] = round(item['count'] / user_count * 100, 2)
  288. for item in result['result']['region']:
  289. flag = 0
  290. for each in region_list:
  291. if item['countryName'] == each['countryName']:
  292. each['count'] += item['count']
  293. region_count += item['count']
  294. flag = 1
  295. break
  296. if flag == 0:
  297. region_list.append(item)
  298. region_count += item['count']
  299. for item in region_list:
  300. item['rate'] = round(item['count'] / region_count * 100, 2)
  301. else:
  302. return response.json(result['result_code'])
  303. res = {
  304. 'user': user_list,
  305. 'region': CommonService.list_sort(region_list)
  306. }
  307. return response.json(0, res)
  308. except Exception as e:
  309. return response.json(500, repr(e))
  310. @classmethod
  311. def global_user_region(cls, request, response):
  312. """
  313. 查询全球用户地区分布
  314. @param request:请求
  315. @param response:响应对象
  316. @return:
  317. """
  318. url_list = CommonService.get_domain_name()
  319. try:
  320. headers = {
  321. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  322. }
  323. user_list = []
  324. region_list = []
  325. user_count = 0
  326. for url in url_list:
  327. url = url + request.path.replace('global/', '')
  328. res = requests.get(url=url, headers=headers)
  329. result = res.json()
  330. if result['result_code'] == 0:
  331. # 处理地区
  332. for item in result['result']['countries']:
  333. flag = 0
  334. for each in user_list:
  335. if each['countryName'] == item['countryName']:
  336. each['count'] += int(item['count'])
  337. user_count += int(item['count'])
  338. flag = 1
  339. break
  340. if flag == 0:
  341. user_list.append(item)
  342. user_count += int(item['count'])
  343. for item in user_list:
  344. rate = round(item['count'] / user_count * 100, 2)
  345. item['rate'] = rate
  346. for item in result['result']['continent']:
  347. flag = 0
  348. for each in region_list:
  349. if each['continentName'] == item['continentName']:
  350. each['count'] += item['count']
  351. flag = 1
  352. break
  353. if flag == 0:
  354. region_list.append(item)
  355. for item in region_list:
  356. item['rate'] = round(item['count'] / user_count * 100, 2)
  357. else:
  358. return response.json(result['result_code'])
  359. res = {
  360. 'countries': CommonService.list_sort(user_list[:20]),
  361. 'continent': CommonService.list_sort(region_list)
  362. }
  363. return response.json(0, res)
  364. except Exception as e:
  365. return response.json(500, repr(e))