|
@@ -0,0 +1,179 @@
|
|
|
+# -*- encoding: utf-8 -*-
|
|
|
+"""
|
|
|
+@File : UserDataController.py
|
|
|
+@Time : 2022/8/16 10:44
|
|
|
+@Author : peng
|
|
|
+@Email : zhangdongming@asj6.wecom.work
|
|
|
+@Software: PyCharm
|
|
|
+"""
|
|
|
+
|
|
|
+from django.db.models import Q, Count
|
|
|
+from django.views.generic.base import View
|
|
|
+import datetime
|
|
|
+
|
|
|
+from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
|
|
|
+from Controller.DeviceConfirmRegion import Device_Region
|
|
|
+from Model.models import Device_User, CountryModel
|
|
|
+from Object.ResponseObject import ResponseObject
|
|
|
+from Object.TokenObject import TokenObject
|
|
|
+from Service.CommonService import CommonService
|
|
|
+
|
|
|
+
|
|
|
+# 用户数据
|
|
|
+class UserDataView(View):
|
|
|
+
|
|
|
+ def get(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ operation = kwargs.get('operation')
|
|
|
+ return self.validation(request.GET, request, operation)
|
|
|
+
|
|
|
+ def post(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ operation = kwargs.get('operation')
|
|
|
+ return self.validation(request.POST, request, operation)
|
|
|
+
|
|
|
+ def validation(self, request_dict, request, operation):
|
|
|
+ token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
|
|
|
+ if token_code != 0:
|
|
|
+ return response.json(token_code)
|
|
|
+ if operation == 'increase': # 查询用户新增数据
|
|
|
+ return self.user_increase(request_dict, response)
|
|
|
+ elif operation == 'active': # 查询用户活跃数据
|
|
|
+ return self.user_active(request_dict, response)
|
|
|
+ elif operation == 'region': # 查询用户地区分布
|
|
|
+ return self.user_region(response)
|
|
|
+ else:
|
|
|
+ return response.json(414)
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def user_increase(cls, request_dict, response):
|
|
|
+ """
|
|
|
+ 查询用户增长数据
|
|
|
+ @param request_dict:请求参数
|
|
|
+ @request_dict startTime:开始时间
|
|
|
+ @request_dict endTime:结束时间
|
|
|
+ @param response:响应对象
|
|
|
+ @return:
|
|
|
+ """
|
|
|
+ start_time = request_dict.get('startTime', None)
|
|
|
+ end_time = request_dict.get('endTime', None)
|
|
|
+ time_unit = request_dict.get('timeUnit', None)
|
|
|
+ if not all([start_time, end_time, time_unit]):
|
|
|
+ return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
|
|
|
+ start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
|
+ end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
|
+ time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
|
+ try:
|
|
|
+ user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
|
|
|
+ user_list = []
|
|
|
+ count = user_qs.count()
|
|
|
+ for item in time_list:
|
|
|
+ user_date_qs = user_qs.filter(data_joined__range=item)
|
|
|
+ s_time = CommonService.str_to_timestamp(item[0].strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
+ e_time = CommonService.str_to_timestamp(item[1].strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
+ user_dict = {
|
|
|
+ 'count': user_date_qs.count(),
|
|
|
+ 'startTime': s_time,
|
|
|
+ 'endTime': e_time
|
|
|
+ }
|
|
|
+ user_list.append(user_dict)
|
|
|
+ user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
|
|
|
+ '-count')
|
|
|
+ region_list = []
|
|
|
+ for item in user_country_qs:
|
|
|
+ country_id = item['region_country']
|
|
|
+ country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
|
|
|
+ country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
|
|
|
+ rate = round(item['count'] / count * 100, 2)
|
|
|
+ country_dict = {
|
|
|
+ 'countryName': country_name,
|
|
|
+ 'count': item['count'],
|
|
|
+ 'rate': rate
|
|
|
+ }
|
|
|
+ region_list.append(country_dict)
|
|
|
+ res = {
|
|
|
+ 'user': user_list,
|
|
|
+ 'region': region_list
|
|
|
+ }
|
|
|
+ return response.json(0, res)
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(500, repr(e))
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def user_active(cls, request_dict, response):
|
|
|
+ """
|
|
|
+ 查询用户活跃数据
|
|
|
+ @param request_dict:请求参数
|
|
|
+ @request_dict startTime:开始时间
|
|
|
+ @request_dict endTime:结束时间
|
|
|
+ @param response:响应对象
|
|
|
+ @return:
|
|
|
+ """
|
|
|
+ start_time = request_dict.get('startTime', None)
|
|
|
+ end_time = request_dict.get('endTime', None)
|
|
|
+ time_unit = request_dict.get('timeUnit', None)
|
|
|
+ if not all([start_time, end_time, time_unit]):
|
|
|
+ return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
|
|
|
+ start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
|
+ end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
|
+ time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
|
+ try:
|
|
|
+ user_qs = Device_User.objects.filter(last_login__range=(start_time, end_time))
|
|
|
+ user_list = []
|
|
|
+ count = user_qs.count()
|
|
|
+ for item in time_list:
|
|
|
+ user_date_qs = user_qs.filter(last_login__range=item)
|
|
|
+ s_time = CommonService.str_to_timestamp(item[0].strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
+ e_time = CommonService.str_to_timestamp(item[1].strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
+ user_dict = {
|
|
|
+ 'count': user_date_qs.count(),
|
|
|
+ 'startTime': s_time,
|
|
|
+ 'endTime': e_time
|
|
|
+ }
|
|
|
+ user_list.append(user_dict)
|
|
|
+ user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
|
|
|
+ '-count')
|
|
|
+ region_list = []
|
|
|
+ for item in user_country_qs:
|
|
|
+ country_id = item['region_country']
|
|
|
+ country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
|
|
|
+ country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
|
|
|
+ rate = round(item['count'] / count * 100, 2)
|
|
|
+ country_dict = {
|
|
|
+ 'countryName': country_name,
|
|
|
+ 'count': item['count'],
|
|
|
+ 'rate': rate
|
|
|
+ }
|
|
|
+ region_list.append(country_dict)
|
|
|
+ res = {
|
|
|
+ 'user': user_list,
|
|
|
+ 'region': region_list
|
|
|
+ }
|
|
|
+ return response.json(0, res)
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(500, repr(e))
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def user_region(cls, response):
|
|
|
+ """
|
|
|
+ 查询用户地区分布
|
|
|
+ @param response:响应对象
|
|
|
+ @return:
|
|
|
+ """
|
|
|
+ res = {
|
|
|
+ 'countries': [],
|
|
|
+ }
|
|
|
+ try:
|
|
|
+ user_qs = Device_User.objects.all()
|
|
|
+ count = user_qs.count()
|
|
|
+ user_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by('-count')
|
|
|
+ for item in user_qs:
|
|
|
+ country_id = item['region_country']
|
|
|
+ country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
|
|
|
+ item['country_name'] = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
|
|
|
+ item['rate'] = round(item['count'] / count * 100, 2)
|
|
|
+ res['countries'] = list(user_qs)
|
|
|
+
|
|
|
+ return response.json(0, res)
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(500, repr(e))
|