from apollo_utils.core.constants.isrc import ISRC_RE_MASK from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.isrc import IsrcField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.country_code import DelphiCountryCodeMixin from apollo_utils.service.schemas.mixins.date import DateRangeMixin from marshmallow import ValidationError, fields, validate, validates_schema from server.constants import dsp from server.constants.delphi.videos.group_by import VideosGroupBy from server.schemas.delphi.mixins.cursor import DelphiCursorMixin from server.schemas.delphi.mixins.dsp import DelphiDSPMixin from server.schemas.delphi.mixins.expand_to import DelphiExpandToMixin from server.schemas.delphi.mixins.offset_limit import DelphiOffsetLimitMixin from server.schemas.delphi.mixins.sorting import DelphiSortingMixin from server.schemas.delphi.mixins.video_analytics import DelphiVideoAnalyticsOnlyMixin from server.schemas.fields.dsp import VendorPrefixField class DelphiVideoAnalyticsParams( DateRangeMixin, DelphiOffsetLimitMixin, DelphiSortingMixin, DelphiExpandToMixin, DelphiDSPMixin, DelphiCountryCodeMixin, DelphiVideoAnalyticsOnlyMixin, DelphiCursorMixin, RequestSchema, ): isrc = SplitUniqueListField(IsrcField(required=True), filter_mask=ISRC_RE_MASK) video_id = SplitUniqueListField(VendorPrefixField(dsp.YOUTUBE, required=True)) content_type = SplitUniqueListField(fields.String(required=False)) group_by = SplitUniqueListField( fields.String(required=False, validate=validate.OneOf(VideosGroupBy.ALL_FIELDS)), required=False ) @validates_schema def validate_data(self, data: dict, *args, **kwargs): id_fields = {"video_id", "isrc"} if id_fields.isdisjoint(set(data.keys())): raise ValidationError("Missing at least one identifying parameter from set: video_id, isrc.")