import logging from django.db.models import Sum from rest_framework import serializers from common.base.baseutils import AppleDeveloperUid, get_choices_dict from common.core.sysconfig import Config from xsign import models from xsign.utils.modelutils import get_developer_udided, get_use_number logger = logging.getLogger(__name__) class DeveloperSerializer(serializers.ModelSerializer): class Meta: model = models.AppIOSDeveloperInfo # depth = 1 exclude = ["id", "user_id", "p8key"] developer_used_number = serializers.SerializerMethodField() developer_used_other_number = serializers.SerializerMethodField() use_number = serializers.SerializerMethodField() app_used_count = serializers.SerializerMethodField() is_disabled = serializers.SerializerMethodField() app_private_number = serializers.SerializerMethodField() app_private_used_number = serializers.SerializerMethodField() app_usable_number = serializers.SerializerMethodField() app_used_number = serializers.SerializerMethodField() private_usable_number = serializers.SerializerMethodField() status_display = serializers.CharField(source="get_status_display") def get_app_usable_number(self, obj): app_id = self.context.get('app_id') if app_id: apple_to_app_obj = models.AppleDeveloperToAppUse.objects.filter(developerid=obj, app_id__app_id=app_id).first() if apple_to_app_obj: return apple_to_app_obj.usable_number return 0 def get_app_used_number(self, obj): app_id = self.context.get('app_id', '') if app_id: return models.DeveloperDevicesID.objects.filter(developerid=obj, app_id__app_id=app_id).distinct().count() return 0 def get_developer_used_number(self, obj): return models.UDIDsyncDeveloper.objects.filter(developerid=obj).count() def get_developer_used_other_number(self, obj): return get_developer_udided(obj)[0] def get_is_disabled(self, obj): app_id = self.context.get('app_id', '') if app_id: developer_app_obj = models.DeveloperAppID.objects.filter(developerid=obj, developerid__status__in=Config.DEVELOPER_USE_STATUS, developerid__certid__isnull=False) if developer_app_obj.filter(app_id__app_id=app_id).distinct().count(): return False else: if developer_app_obj and developer_app_obj.distinct().count() < obj.app_limit_number: return False return True return True def get_app_private_number(self, obj): return models.AppleDeveloperToAppUse.objects.filter(developerid=obj).count() def get_private_usable_number(self, obj): used_number = models.AppleDeveloperToAppUse.objects.filter(developerid=obj).values('usable_number').aggregate( Sum('usable_number')).get('usable_number__sum') if not used_number: used_number = 0 return used_number def get_app_private_used_number(self, obj): return models.DeveloperDevicesID.objects.filter(developerid=obj, app_id__appledevelopertoappuse__developerid=obj).values( 'udid').distinct().count() def get_use_number(self, obj): return get_use_number(obj) def get_app_used_count(self, obj): return models.DeveloperAppID.objects.filter(developerid=obj).count() class SuperSignUsedSerializer(serializers.ModelSerializer): class Meta: model = models.APPSuperSignUsedInfo fields = ["created_time", "device_udid", "device_name", "developer_id", "bundle_id", "bundle_name", "other_uid", "developer_description", "developer_status"] device_udid = serializers.CharField(source="udid.udid.udid") device_name = serializers.CharField(source="udid.product") bundle_id = serializers.CharField(source="app_id.bundle_id") bundle_name = serializers.CharField(source="app_id.name") other_uid = serializers.SerializerMethodField() developer_id = serializers.SerializerMethodField() developer_description = serializers.SerializerMethodField() developer_status = serializers.SerializerMethodField() def get_developer_status(self, obj): return obj.developerid.get_status_display() def get_developer_id(self, obj): issuer_id = obj.developerid.issuer_id if self.context.get('mine'): return issuer_id else: return f"{Config.DEVELOPER_UID_KEY}{AppleDeveloperUid().get_encrypt_uid(issuer_id)}" def get_developer_description(self, obj): if self.context.get('mine'): return obj.developerid.description else: return '公共账号池' def get_other_uid(self, obj): user_obj = self.context.get('user_obj') if obj.user_id != obj.developerid.user_id: if user_obj.uid != obj.user_id.uid: return {'uid': obj.user_id.uid, 'name': obj.user_id.first_name} class DeveloperDeviceSerializer(serializers.ModelSerializer): class Meta: model = models.UDIDsyncDeveloper exclude = ["id", "developerid"] developer_id = serializers.CharField(source="developerid.issuer_id") developer_description = serializers.CharField(source="developerid.description") developer_status = serializers.CharField(source="developerid.get_status_display") app_used_count = serializers.SerializerMethodField() def get_app_used_count(self, obj): return models.DeveloperDevicesID.objects.filter(udid=obj, developerid=obj.developerid).values( 'app_id').distinct().count() class DeviceUDIDSerializer(serializers.ModelSerializer): class Meta: model = models.AppUDID # depth = 1 exclude = ["updated_time", "sign_status"] bundle_name = serializers.CharField(source="app_id.name") bundle_id = serializers.CharField(source="app_id.bundle_id") issuer_id = serializers.SerializerMethodField() developer_description = serializers.SerializerMethodField() developer_status = serializers.SerializerMethodField() udid = serializers.CharField(source="udid.udid") is_mine = serializers.SerializerMethodField() other_uid = serializers.SerializerMethodField() def get_issuer_id(self, obj): issuer_id = obj.udid.developerid.issuer_id if self.context.get('mine'): return issuer_id else: return f"{Config.DEVELOPER_UID_KEY}{AppleDeveloperUid().get_encrypt_uid(issuer_id)}" def get_developer_status(self, obj): return obj.udid.developerid.get_status_display() def get_developer_description(self, obj): if self.context.get('mine'): return obj.udid.developerid.description else: return '公共账号池' def get_other_uid(self, obj): user_obj = self.context.get('user_obj') user_obj_new = obj.app_id.user_id if user_obj.pk != user_obj_new.pk: super_user_obj = models.APPSuperSignUsedInfo.objects.filter(udid=obj, app_id=obj.app_id).first() if super_user_obj.developerid.user_id != user_obj_new: return {'uid': user_obj_new.uid, 'name': user_obj_new.first_name} def get_is_mine(self, obj): return self.context.get('mine') class BillAppInfoSerializer(serializers.ModelSerializer): class Meta: model = models.Apps fields = ["pk", "app_id", "user_id", "name", "type", "bundle_id", "updated_time"] class BillDeveloperInfoSerializer(serializers.ModelSerializer): class Meta: model = models.AppIOSDeveloperInfo fields = ["pk", "issuer_id", "user_id", "certid"] class BillInfoSerializer(serializers.ModelSerializer): class Meta: model = models.IosDeveloperPublicPoolBill exclude = ["user_id", "developer_info", "app_info", "udid_sync_info", "app_id"] app_name = serializers.SerializerMethodField() description = serializers.SerializerMethodField() is_used = serializers.SerializerMethodField() app_status = serializers.SerializerMethodField() remote_addr = serializers.SerializerMethodField() def get_remote_addr(self, obj): return obj.remote_addr def get_app_status(self, obj): if obj.app_id: return True return False def get_is_used(self, obj): if obj.udid_sync_info: return True return False def get_app_name(self, obj): if obj.app_info: return obj.app_info.get('name') def get_description(self, obj): if obj.udid: return f"{self.get_app_name(obj)}-消耗- {obj.number} 设备数" class BillTransferSerializer(serializers.ModelSerializer): class Meta: model = models.IosDeveloperBill exclude = ["id", "remote_addr", "user_id", "to_user_id"] target_user = serializers.SerializerMethodField() cancel = serializers.SerializerMethodField() number = serializers.SerializerMethodField() status_display = serializers.CharField(source='get_status_display') def get_target_user(self, obj): user_obj = obj.user_id if self.get_cancel(obj): user_obj = obj.to_user_id return {'uid': user_obj.uid, 'name': user_obj.first_name} def get_cancel(self, obj): return self.context.get('user_obj').pk == obj.user_id.pk def get_number(self, obj): if self.get_cancel(obj): return -obj.number else: return obj.number class AppleDeveloperToAppUseSerializer(serializers.ModelSerializer): class Meta: model = models.AppleDeveloperToAppUse # exclude = ["user_id", "to_user_id", "developer_info", "app_info", "udid_sync_info", "app_id"] fields = ["issuer_id", "app_id", "created_time", "description", "usable_number"] issuer_id = serializers.CharField(source="developerid.issuer_id") app_id = serializers.CharField(source="app_id.app_id") class AppleDeveloperToAppUseAppsSerializer(serializers.ModelSerializer): class Meta: model = models.Apps fields = ["app_id", "name", "short", "bundle_id", "description", "app_usable_number", "app_used_number"] app_usable_number = serializers.SerializerMethodField() app_used_number = serializers.SerializerMethodField() def get_app_usable_number(self, obj): issuer_id = self.context.get('issuer_id') if issuer_id: apple_to_app_obj = models.AppleDeveloperToAppUse.objects.filter(developerid__issuer_id=issuer_id, app_id=obj).first() if apple_to_app_obj: return apple_to_app_obj.usable_number return 0 def get_app_used_number(self, obj): issuer_id = self.context.get('issuer_id') if issuer_id: return models.DeveloperDevicesID.objects.filter(app_id=obj, developerid__issuer_id=issuer_id).count() return 0 class AdminDeveloperSerializer(DeveloperSerializer): class Meta: model = models.AppIOSDeveloperInfo # depth = 1 exclude = ["p8key", ] auth_type_choices = serializers.SerializerMethodField() def get_auth_type_choices(self, obj): return get_choices_dict(obj.auth_type_choices) status_choices = serializers.SerializerMethodField() def get_status_choices(self, obj): return get_choices_dict(obj.status_choices) class AdminSuperSignUsedSerializer(SuperSignUsedSerializer): class Meta: model = models.APPSuperSignUsedInfo fields = ["created_time", "device_udid", "device_name", "developer_id", "bundle_id", "bundle_name", "app_id", "id", "user_id", "short", "developer_pk"] app_id = serializers.IntegerField(source="app_id.pk") user_id = serializers.IntegerField(source="user_id.pk") short = serializers.CharField(source="app_id.short") developer_status = serializers.CharField(source="developerid.get_status_display") developer_id = serializers.CharField(source="developerid.issuer_id") developer_description = serializers.CharField(source="developerid.description") developer_pk = serializers.IntegerField(source="developerid.pk") class AdminBillInfoSerializer(BillInfoSerializer): class Meta: model = models.IosDeveloperPublicPoolBill fields = '__all__' read_only_fields = ["id", "user_id", "to_user_id", "action", "number", "app_info", "udid", "udid_sync_info", "app_id", "remote_addr"] action_choices = serializers.SerializerMethodField() def get_action_choices(self, obj): return get_choices_dict(obj.action_choices) class AppSignSerializer(serializers.ModelSerializer): class Meta: model = models.Apps exclude = ["user_id", "id"] private_developer_number = serializers.SerializerMethodField() def get_private_developer_number(self, obj): return models.AppleDeveloperToAppUse.objects.filter(app_id=obj).count() private_developer_used_number = serializers.SerializerMethodField() def get_private_developer_used_number(self, obj): return models.DeveloperDevicesID.objects.filter(app_id=obj, developerid__appledevelopertoappuse__app_id=obj).distinct().count() supersign_used_number = serializers.SerializerMethodField() def get_supersign_used_number(self, obj): return models.APPSuperSignUsedInfo.objects.filter(app_id=obj).all().count() developer_used_count = serializers.SerializerMethodField() def get_developer_used_count(self, obj): return models.DeveloperAppID.objects.filter(app_id=obj).all().count()