from typing import Type from marshmallow import Schema, fields from apollo_messages_views.schemas.base import BaseMessage, MetaExcludeUnknown, PlaylistItem, TrackItem, data_mixin class ChartMixin: class ChartItem(MetaExcludeUnknown): name = fields.Str(required=True) chart = fields.Nested(ChartItem, required=True) class TrackMixin: track = fields.Nested(TrackItem, required=True) current_position = fields.Integer(missing=None) previous_position = fields.Integer(missing=None) class PlaylistMixin: playlist = fields.Nested(PlaylistItem, required=True) class BodyTitleMixin: title = fields.Str(missing="") body = fields.Str(required=True) class TrackChartItem(BodyTitleMixin, TrackMixin, ChartMixin, MetaExcludeUnknown): pass class TrackPlaylistItem(BodyTitleMixin, TrackMixin, PlaylistMixin, MetaExcludeUnknown): pass class PlaylistExtendedItem(BodyTitleMixin, PlaylistMixin, MetaExcludeUnknown): pass class ChartExtendedItem(BodyTitleMixin, ChartMixin, MetaExcludeUnknown): pass def get_input_message_schema(content_item) -> Type[Schema]: class InputMessageSchema(data_mixin(content_item), BaseMessage): pass return InputMessageSchema TrackChartInputMessage = get_input_message_schema(TrackChartItem) TrackPlaylistInputMessage = get_input_message_schema(TrackPlaylistItem) PlaylistInputMessage = get_input_message_schema(PlaylistExtendedItem) ChartInputMessage = get_input_message_schema(ChartExtendedItem)