def serialize(self, obj, attrs, user): from sentry import features from sentry.features.base import OrganizationFeature if attrs.get("avatar"): avatar = { "avatarType": attrs["avatar"].get_avatar_type_display(), "avatarUuid": attrs["avatar"].ident if attrs["avatar"].file_id else None, } else: avatar = {"avatarType": "letter_avatar", "avatarUuid": None} status = OrganizationStatus(obj.status) # Retrieve all registered organization features org_features = features.all(feature_type=OrganizationFeature).keys() feature_list = set() for feature_name in org_features: if not feature_name.startswith("organizations:"): continue if features.has(feature_name, obj, actor=user): # Remove the organization scope prefix feature_list.add(feature_name[len("organizations:"):]) # Do not include the onboarding feature if OrganizationOptions exist if ("onboarding" in feature_list and OrganizationOption.objects.filter(organization=obj).exists()): feature_list.remove("onboarding") # Include api-keys feature if they previously had any api-keys if "api-keys" not in feature_list and ApiKey.objects.filter( organization=obj).exists(): feature_list.add("api-keys") # Organization flag features (not provided through the features module) if OrganizationOption.objects.filter( organization=obj, key__in=LEGACY_RATE_LIMIT_OPTIONS).exists(): feature_list.add("legacy-rate-limits") if getattr(obj.flags, "allow_joinleave"): feature_list.add("open-membership") if not getattr(obj.flags, "disable_shared_issues"): feature_list.add("shared-issues") return { "id": six.text_type(obj.id), "slug": obj.slug, "status": { "id": status.name.lower(), "name": status.label }, "name": obj.name or obj.slug, "dateCreated": obj.date_added, "isEarlyAdopter": bool(obj.flags.early_adopter), "require2FA": bool(obj.flags.require_2fa), "avatar": avatar, "features": feature_list, }
def serialize(self, obj, attrs, user): if attrs.get('avatar'): avatar = { 'avatarType': attrs['avatar'].get_avatar_type_display(), 'avatarUuid': attrs['avatar'].ident if attrs['avatar'].file_id else None } else: avatar = { 'avatarType': 'letter_avatar', 'avatarUuid': None, } status = OrganizationStatus(obj.status) return { 'id': six.text_type(obj.id), 'slug': obj.slug, 'status': { 'id': status.name.lower(), 'name': status.label, }, 'name': obj.name or obj.slug, 'dateCreated': obj.date_added, 'isEarlyAdopter': bool(obj.flags.early_adopter), 'require2FA': bool(obj.flags.require_2fa), 'avatar': avatar, }
def serialize(self, obj, attrs, user): from sentry import features from sentry.features.base import OrganizationFeature if attrs.get('avatar'): avatar = { 'avatarType': attrs['avatar'].get_avatar_type_display(), 'avatarUuid': attrs['avatar'].ident if attrs['avatar'].file_id else None } else: avatar = { 'avatarType': 'letter_avatar', 'avatarUuid': None, } status = OrganizationStatus(obj.status) # Retrieve all registered organization features org_features = features.all(feature_type=OrganizationFeature).keys() feature_list = set() for feature_name in org_features: if not feature_name.startswith('organizations:'): continue if features.has(feature_name, obj, actor=user): # Remove the organization scope prefix feature_list.add(feature_name[len('organizations:'):]) # Do not include the onboarding feature if OrganizationOptions exist if 'onboarding' in feature_list and \ OrganizationOption.objects.filter(organization=obj).exists(): feature_list.remove('onboarding') # Include api-keys feature if they previously had any api-keys if 'api-keys' not in feature_list and ApiKey.objects.filter( organization=obj).exists(): feature_list.add('api-keys') # Organization flag features (not provided through the features module) if OrganizationOption.objects.filter( organization=obj, key__in=LEGACY_RATE_LIMIT_OPTIONS).exists(): feature_list.add('legacy-rate-limits') if getattr(obj.flags, 'allow_joinleave'): feature_list.add('open-membership') if not getattr(obj.flags, 'disable_shared_issues'): feature_list.add('shared-issues') if getattr(obj.flags, 'require_2fa'): feature_list.add('require-2fa') return { 'id': six.text_type(obj.id), 'slug': obj.slug, 'status': { 'id': status.name.lower(), 'name': status.label, }, 'name': obj.name or obj.slug, 'dateCreated': obj.date_added, 'isEarlyAdopter': bool(obj.flags.early_adopter), 'disableNewVisibilityFeatures': bool(obj.flags.disable_new_visibility_features), 'require2FA': bool(obj.flags.require_2fa), 'avatar': avatar, 'features': feature_list }
def serialize( self, obj: Organization, attrs: Mapping[str, Any], user: User ) -> OrganizationSerializerResponse: from sentry import features from sentry.features.base import OrganizationFeature if attrs.get("avatar"): avatar = { "avatarType": attrs["avatar"].get_avatar_type_display(), "avatarUuid": attrs["avatar"].ident if attrs["avatar"].file_id else None, } else: avatar = {"avatarType": "letter_avatar", "avatarUuid": None} status = OrganizationStatus(obj.status) # Retrieve all registered organization features org_features = [ feature for feature in features.all(feature_type=OrganizationFeature).keys() if feature.startswith(_ORGANIZATION_SCOPE_PREFIX) ] feature_list = set() # Check features in batch using the entity handler batch_features = features.batch_has(org_features, actor=user, organization=obj) # batch_has has found some features if batch_features: for feature_name, active in batch_features.get(f"organization:{obj.id}", {}).items(): if active: # Remove organization prefix feature_list.add(feature_name[len(_ORGANIZATION_SCOPE_PREFIX) :]) # This feature_name was found via `batch_has`, don't check again using `has` org_features.remove(feature_name) # Remaining features should not be checked via the entity handler for feature_name in org_features: if features.has(feature_name, obj, actor=user, skip_entity=True): # Remove the organization scope prefix feature_list.add(feature_name[len(_ORGANIZATION_SCOPE_PREFIX) :]) # Do not include the onboarding feature if OrganizationOptions exist if ( "onboarding" in feature_list and OrganizationOption.objects.filter(organization=obj).exists() ): feature_list.remove("onboarding") # Include api-keys feature if they previously had any api-keys if "api-keys" not in feature_list and ApiKey.objects.filter(organization=obj).exists(): feature_list.add("api-keys") # Organization flag features (not provided through the features module) if OrganizationOption.objects.filter( organization=obj, key__in=LEGACY_RATE_LIMIT_OPTIONS ).exists(): feature_list.add("legacy-rate-limits") if getattr(obj.flags, "allow_joinleave"): feature_list.add("open-membership") if not getattr(obj.flags, "disable_shared_issues"): feature_list.add("shared-issues") return { "id": str(obj.id), "slug": obj.slug, "status": {"id": status.name.lower(), "name": status.label}, "name": obj.name or obj.slug, "dateCreated": obj.date_added, "isEarlyAdopter": bool(obj.flags.early_adopter), "require2FA": bool(obj.flags.require_2fa), "requireEmailVerification": bool( features.has("organizations:required-email-verification", obj) and obj.flags.require_email_verification ), "avatar": avatar, "features": feature_list, }