#!/usr/bin/env python # -*- coding:utf-8 -*- # project: 11月 # author: NinEveN # date: 2021/11/4 import logging from rest_framework.response import Response from rest_framework.views import APIView from api.models import Apps, AppReportInfo from api.utils.auth.util import AuthInfo from api.utils.modelutils import add_remote_info_from_request from api.utils.response import BaseResponse from api.utils.serializer import AppReportSerializer from common.base.baseutils import get_real_ip_address, get_choices_dict from common.core.sysconfig import Config from common.core.throttle import InstallThrottle2 from common.utils.caches import login_auth_failed from common.utils.sendmsg import is_valid_sender_code logger = logging.getLogger(__name__) class ReportView(APIView): throttle_classes = [InstallThrottle2] def get(self, request): response = BaseResponse() response.data = {} allow_f = Config.REPORT.get("enable") if allow_f: auth_obj = AuthInfo(Config.REPORT.get("captcha"), Config.REPORT.get("geetest")) response.data['auth_rules'] = auth_obj.make_rules_info() response.data['report_type'] = Config.REPORT.get("report_type") response.data['s_list'] = get_choices_dict(AppReportInfo.report_type_choices) response.data['enable'] = allow_f return Response(response.dict) def post(self, request): res = BaseResponse() data = request.data msg = f"add new app report data:{data}" logger.info(msg) email = data.get('email', '') is_valid, target = is_valid_sender_code(data.get('act'), data.get("auth_token", None), data.get("seicode", None), True) if is_valid and str(target) == str(email): if login_auth_failed("get", email): add_remote_info_from_request(request, msg) if data.get('app_id'): app_obj = Apps.objects.filter(app_id=data.get('app_id')).first() ext_info = { 'app_name': app_obj.name, 'bundle_id': app_obj.bundle_id, 'remote_addr': get_real_ip_address(request), 'app_id': app_obj.pk } data.update(ext_info) serializer = AppReportSerializer(data=data, context={'user_obj': request.user}) if serializer.is_valid(): serializer.save() else: logger.info(f"add new app report failed") res.msg = serializer.errors res.code = 1005 else: res.code = 1006 logger.error(f"email:{email} failed too try , locked") res.msg = "失败次数过多,已被锁定,请1小时之后再次尝试" else: res.code = 1001 res.msg = "验证码有误或失效" return Response(res.dict)