from marshmallow import ( Schema, fields, post_dump, validates_schema, ValidationError, ) class PaginatedApiResponseSchema(Schema): SKIP_NONE_FIELDS = ("previous", "next") count = fields.Int() limit = fields.Int() previous = fields.Url() next = fields.Url() results = fields.List(fields.Dict(), attribute="items") @post_dump def remove_skip_none_fields(self, data, *args, **kwargs): return { key: value for key, value in data.items() if not (key in self.SKIP_NONE_FIELDS and value is None) } class ResourceGroupSchema(Schema): id = fields.Str(attribute="external_id") name = fields.Str() class ResourceGroupsResponseSchema(PaginatedApiResponseSchema): results = fields.List( fields.Nested(ResourceGroupSchema), attribute="items" ) class ClaimResponseSchema(Schema): pass class ClaimNameSchema(Schema): id = fields.Str(attribute="external_id") name = fields.Str(attribute="friendly") class ClaimNamesResponseSchema(PaginatedApiResponseSchema): results = fields.List(fields.Nested(ClaimNameSchema), attribute="items") class ClaimValueSchema(Schema): id = fields.Str(attribute="external_id") name = fields.Str(attribute="friendly") components = fields.Dict() class ClaimValuesResponseSchema(PaginatedApiResponseSchema): results = fields.List(fields.Nested(ClaimValueSchema), attribute="items") class UserSchema(Schema): id = fields.Str(attribute="sub") email = fields.Email() given_name = fields.Str() family_name = fields.Str() status = fields.Str() preferred_username = fields.Str() business_unit = fields.Str() job_category = fields.Str() job_title = fields.Str() personnel_type = fields.Str() location = fields.Str() is_vip = fields.Boolean() is_sony_employee = fields.Boolean() supervisor_email = fields.Email() supervisor_name = fields.Str() class UsersResponseSchema(PaginatedApiResponseSchema): results = fields.List(fields.Nested(UserSchema), attribute="items") class UserStatusParamsSchema(Schema): id = fields.List(fields.Str(), load_default=[]) email = fields.List(fields.Str(), load_default=[]) product = fields.List(fields.Str(), load_default=[]) @validates_schema def validate_either_email_or_id(self, data, **kwargs): if not data["id"] and not data["email"]: raise ValidationError("Either emails or IDs are required.") elif data["id"] and data["email"]: raise ValidationError( "Either emails or IDs are required, but not both." ) class UserStatusEmailSchema(Schema): email = fields.Email() is_active = fields.Boolean() last_login = fields.DateTime() class UserStatusIdSchema(Schema): id = fields.Str() is_active = fields.Boolean() last_login = fields.DateTime()