#!/usr/bin/env python # -*- coding:utf-8 -*- # project: 3月 # author: liuyu # date: 2020/3/6 import logging from rest_framework.views import APIView from api.models import Apps from common.cache.state import MigrateStorageState, CleanAppSignDataState from common.core.auth import ExpiringTokenAuthentication from common.core.response import ApiResponse from common.core.sysconfig import Config from common.utils.caches import del_cache_response_by_short from xsign.models import AppUDID from xsign.tasks import run_resign_task from xsign.utils.modelutils import get_app_sign_info, check_super_sign_permission from xsign.utils.supersignutils import IosUtils logger = logging.getLogger(__name__) class AppSignInfoView(APIView): authentication_classes = [ExpiringTokenAuthentication, ] def get(self, request, app_id): data = None if app_id: app_obj = Apps.objects.filter(user_id=request.user, app_id=app_id).first() if app_obj: data = get_app_sign_info(app_obj) else: logger.error(f"app_id:{app_id} is not found in user:{request.user}") return ApiResponse(code=1003, msg="应用不存在") return ApiResponse(data=data) def put(self, request, app_id): if app_id: data = request.data if MigrateStorageState(request.user.uid).get_state(): return ApiResponse(code=1008, msg="数据迁移中,无法处理该操作") clean = data.get("clean", None) if clean: with CleanAppSignDataState(request.user.uid) as state: if state: logger.info(f"app_id:{app_id} clean:{clean} ,close super_sign should clean_app_by_user_obj") app_obj = Apps.objects.filter(user_id=request.user, app_id=app_id).first() IosUtils.clean_app_by_user_obj(app_obj) else: return ApiResponse(code=1008, msg="数据清理中,请耐心等待") return ApiResponse() try: do_sign_flag = 0 app_obj = Apps.objects.filter(user_id=request.user, app_id=app_id).first() logger.info("app_id:%s update old data:%s" % (app_id, app_obj.__dict__)) update_fields = [] if app_obj.issupersign: app_obj.supersign_limit_number = data.get("supersign_limit_number", app_obj.supersign_limit_number) update_fields.append("supersign_limit_number") if app_obj.supersign_type in [x[0] for x in list(app_obj.supersign_type_choices)]: if app_obj.supersign_type != data.get("supersign_type", app_obj.supersign_type): do_sign_flag = 1 app_obj.supersign_type = data.get("supersign_type", app_obj.supersign_type) update_fields.append("supersign_type") new_bundle_id = data.get("new_bundle_id", None) new_bundle_name = data.get("new_bundle_name", None) if new_bundle_id is not None: if new_bundle_id and new_bundle_id != app_obj.bundle_id and len(new_bundle_id) > 3: if new_bundle_id != app_obj.new_bundle_id: do_sign_flag = 2 app_obj.new_bundle_id = new_bundle_id if new_bundle_id == '' or (app_obj.new_bundle_id != new_bundle_id): if app_obj.bundle_id != app_obj.new_bundle_id: do_sign_flag = 2 app_obj.new_bundle_id = app_obj.bundle_id update_fields.append('new_bundle_id') if new_bundle_name is not None: if new_bundle_name and new_bundle_name != app_obj.name and len(new_bundle_name) > 0: if new_bundle_name != app_obj.new_bundle_name: do_sign_flag = 2 app_obj.new_bundle_name = new_bundle_name if new_bundle_name == '' or (app_obj.new_bundle_name != new_bundle_name): if app_obj.name != app_obj.new_bundle_name: do_sign_flag = 2 app_obj.new_bundle_name = app_obj.name update_fields.append('new_bundle_name') if app_obj.type == 1 and data.get('issupersign', -1) != -1: if data.get('issupersign', -1) == 1 and not check_super_sign_permission(request.user): logger.error(f"app_id:{app_id} can't open super_sign,owner has no ios developer") return ApiResponse(code=1008, msg="超级签余额不足,无法开启") do_sign_flag = 3 app_obj.issupersign = data.get("issupersign", app_obj.issupersign) update_fields.append("issupersign") if app_obj.issupersign and data.get('change_auto_sign', -1) != -1: if data.get('change_auto_sign', -1) == 1: do_sign_flag = 3 app_obj.change_auto_sign = data.get("change_auto_sign", app_obj.change_auto_sign) update_fields.append("change_auto_sign") logger.info(f"app_id:{app_id} update new data:{app_obj.__dict__}") app_obj.save(update_fields=update_fields) if app_obj.issupersign: c_task = None if do_sign_flag == 1: AppUDID.objects.filter(app_id=app_obj).update(sign_status=2) if app_obj.change_auto_sign: c_task = run_resign_task(app_obj.pk, True) if do_sign_flag == 2: AppUDID.objects.filter(app_id=app_obj, sign_status__gte=3).update(sign_status=3) if app_obj.change_auto_sign: flag = False if AppUDID.objects.filter(app_id=app_obj, sign_status=2, udid__developerid__status__in=Config.DEVELOPER_WRITE_STATUS).first(): flag = True c_task = run_resign_task(app_obj.pk, flag) if do_sign_flag == 3: if app_obj.change_auto_sign: flag = False if AppUDID.objects.filter(app_id=app_obj, sign_status=2, udid__developerid__status__in=Config.DEVELOPER_WRITE_STATUS).first(): flag = True c_task = run_resign_task(app_obj.pk, flag, False) if c_task: logger.info(f"app {app_obj} run_resign_task msg:{c_task}") del_cache_response_by_short(app_obj.app_id) except Exception as e: logger.error(f"app_id:{app_id} update Exception:{e}") return ApiResponse(code=1005, msg="短连接已经存在") return ApiResponse() class AppCanSignView(APIView): authentication_classes = [ExpiringTokenAuthentication, ] def get(self, request): return ApiResponse(data={'sign': True})