# -*- 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 Count from django.views.generic.base import View import datetime import requests from Model.models import Device_User, CountryModel 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) elif operation == 'global/increase': # 查询全球用户新增数据 return self.global_user_increase(request, request_dict, response) elif operation == 'global/active': # 查询全球用户活跃数据 return self.global_user_active(request, request_dict, response) elif operation == 'global/region': # 查询全球用户地区分布 return self.global_user_region(request, response) else: return response.json(414) @classmethod def user_increase(cls, request_dict, response): """ 查询用户增长数据 @param request_dict:请求参数 @request_dict startTime:开始时间 @request_dict endTime:结束时间 @request_dict timeUnit:时间单位 @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: s_time = datetime.datetime.fromtimestamp(int(item[0])) e_time = datetime.datetime.fromtimestamp(int(item[1])) user_date_qs = user_qs.filter(last_login__range=(s_time, e_time)) rate = round(user_date_qs.count() / count * 100, 2) user_dict = { 'count': user_date_qs.count(), 'rate': rate, 'startTime': item[0], 'endTime': item[1] } 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:结束时间 @request_dict timeUnit:时间单位 @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: s_time = datetime.datetime.fromtimestamp(int(item[0])) e_time = datetime.datetime.fromtimestamp(int(item[1])) user_date_qs = user_qs.filter(last_login__range=(s_time, e_time)) rate = round(user_date_qs.count() / count * 100, 2) user_dict = { 'count': user_date_qs.count(), 'rate': rate, 'startTime': item[0], 'endTime': item[1] } 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') continent_list = [] for item in user_qs: country_id = item['region_country'] country_qs = CountryModel.objects.filter(id=country_id).values('country_name', 'region__name') item['countryName'] = country_qs[0]['country_name'] if country_qs.exists() else '未知区域' item['rate'] = round(item['count'] / count * 100, 2) if country_qs.exists(): flag = 0 for each in continent_list: if country_qs[0]['region__name'] == each['continentName']: each['count'] += item['count'] flag = 1 break if flag == 0: continent_list.append({ 'continentName': country_qs[0]['region__name'], 'count': item['count'] }) for item in continent_list: item['rate'] = round(item['count'] / count * 100, 2) res['countries'] = list(user_qs) res['continent'] = continent_list return response.json(0, res) except Exception as e: return response.json(500, repr(e)) @classmethod def global_user_increase(cls, request, request_dict, response): """ 查询全球用户新增数据 @param request:请求 @param request_dict:请求参数 @param response:响应对象 @return: """ url_list = CommonService.get_domain_name() try: headers = { 'Authorization': request.META.get('HTTP_AUTHORIZATION') } user_list = [] user_count = 0 region_list = [] region_count = 0 for url in url_list: url = url + request.path.replace('global/', '') res = requests.get(url=url, params=request_dict, headers=headers) result = res.json() if result['result_code'] == 0: for item in result['result']['user']: flag = 0 for each in user_list: if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']: each['count'] += item['count'] user_count += item['count'] flag = 1 break if flag == 0: user_list.append(item) user_count += item['count'] for item in user_list: item['rate'] = round(item['count'] / user_count * 100, 2) for item in result['result']['region']: flag = 0 for each in region_list: if item['countryName'] == each['countryName']: each['count'] += item['count'] region_count += item['count'] flag = 1 break if flag == 0: region_list.append(item) region_count += item['count'] for item in region_list: item['rate'] = round(item['count'] / region_count * 100, 2) else: return response.json(result['result_code']) res = { 'user': user_list, 'region': CommonService.list_sort(region_list) } return response.json(0, res) except Exception as e: return response.json(500, repr(e)) @classmethod def global_user_active(cls, request, request_dict, response): """ 查询全球用户活跃数据 @param request:请求 @param request_dict:请求参数 @param response:响应对象 @return: """ url_list = CommonService.get_domain_name() try: headers = { 'Authorization': request.META.get('HTTP_AUTHORIZATION') } user_list = [] user_count = 0 region_list = [] region_count = 0 for url in url_list: url = url + request.path.replace('global/', '') res = requests.get(url=url, params=request_dict, headers=headers) result = res.json() if result['result_code'] == 0: for item in result['result']['user']: flag = 0 for each in user_list: if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']: each['count'] += item['count'] user_count += item['count'] flag = 1 break if flag == 0: user_list.append(item) user_count += item['count'] for item in user_list: item['rate'] = round(item['count'] / user_count * 100, 2) for item in result['result']['region']: flag = 0 for each in region_list: if item['countryName'] == each['countryName']: each['count'] += item['count'] region_count += item['count'] flag = 1 break if flag == 0: region_list.append(item) region_count += item['count'] for item in region_list: item['rate'] = round(item['count'] / region_count * 100, 2) else: return response.json(result['result_code']) res = { 'user': user_list, 'region': CommonService.list_sort(region_list) } return response.json(0, res) except Exception as e: return response.json(500, repr(e)) @classmethod def global_user_region(cls, request, response): """ 查询全球用户地区分布 @param request:请求 @param response:响应对象 @return: """ url_list = CommonService.get_domain_name() try: headers = { 'Authorization': request.META.get('HTTP_AUTHORIZATION') } user_list = [] region_list = [] user_count = 0 for url in url_list: url = url + request.path.replace('global/', '') res = requests.get(url=url, headers=headers) result = res.json() if result['result_code'] == 0: # 处理地区 for item in result['result']['countries']: flag = 0 for each in user_list: if each['countryName'] == item['countryName']: each['count'] += int(item['count']) user_count += int(item['count']) flag = 1 break if flag == 0: user_list.append(item) user_count += int(item['count']) for item in user_list: rate = round(item['count'] / user_count * 100, 2) item['rate'] = rate for item in result['result']['continent']: flag = 0 for each in region_list: if each['continentName'] == item['continentName']: each['count'] += item['count'] flag = 1 break if flag == 0: region_list.append(item) for item in region_list: item['rate'] = round(item['count'] / user_count * 100, 2) else: return response.json(result['result_code']) res = { 'countries': CommonService.list_sort(user_list[:20]), 'continent': CommonService.list_sort(region_list) } return response.json(0, res) except Exception as e: return response.json(500, repr(e))