"""Schema for Tracks Localizations.""" import marshmallow from marshmallow import fields from marshmallow.validate import Length from marshmallow.validate import OneOf from marshmallow.validate import Range from backend.constants.track_role import ARTISTS from backend.utils.schema_validator import IsNotBlankOrWhitespace class TrackArtistLocalizationSchema(marshmallow.Schema): """Track Artist Schema.""" track_artist_id = fields.Int(required=True, validate=Range(min=1)) type = fields.String( # noqa: A003 required=True, validate=[OneOf(ARTISTS)]) name = fields.String( required=True, validate=[IsNotBlankOrWhitespace(), Length(max=255)]) class TrackLocalizationSchema(marshmallow.Schema): """Update Track Schema.""" track_name = fields.String( required=True, validate=[Length(max=200)]) version = fields.String( required=True, validate=[Length(max=255)]) # Optional Fields artists = fields.Nested( required=False, nested=TrackArtistLocalizationSchema, many=True) @marshmallow.validates_schema(skip_on_field_errors=True) def validate_schema(self, data): """Do schema validations only when passing all field validators. Does additional checks to make sure duplicate data isn't passed in. Args: data (dict): Unserialized data Raises: marshmallow.ValidationError """ artists = data.get('artists', []) unique_ids = {artist['track_artist_id'] for artist in artists} if len(artists) != len(unique_ids): raise marshmallow.ValidationError( 'Duplicate artist entries found', 'artists') @marshmallow.post_load def sanitize_input(self, data): """Clean up and sanitize raw input data when validation passes. Args: data (dict): Unserialized data Returns: data (dict) """ for field_name in ['track_name', 'version']: if field_name in data: data[field_name] = data[field_name].strip() return data