fossasia/open-event-orga-server

View on GitHub
app/api/schema/tracks.py

Summary

Maintainability
A
55 mins
Test Coverage
import re

from marshmallow import validates_schema
from marshmallow_jsonapi import fields
from marshmallow_jsonapi.flask import Relationship

from app.api.helpers.errors import UnprocessableEntityError
from app.api.helpers.utilities import dasherize
from app.api.schema.base import SoftDeletionSchema


class TrackSchema(SoftDeletionSchema):
    """
    Api Schema for track model
    """

    class Meta:
        """
        Meta class for User Api Schema
        """

        type_ = 'track'
        self_view = 'v1.track_detail'
        self_view_kwargs = {'id': '<id>'}
        inflect = dasherize

    @validates_schema
    def valid_color(self, data):
        if 'color' not in data:
            raise UnprocessableEntityError(
                {'pointer': '/data/attributes/color'},
                "Color attribut is required",
            )
        if not re.search(r'^#(?:[0-9a-fA-F]{3}){1,2}$', data['color']):
            raise UnprocessableEntityError(
                {'pointer': 'data/attributes/color'},
                "Color should be proper HEX color code",
            )

    id = fields.Str(dump_only=True)
    name = fields.Str(required=True)
    description = fields.Str(allow_none=True)
    color = fields.Str(required=True)
    font_color = fields.Str(allow_none=True, dump_only=True)
    position = fields.Integer(allow_none=True, default=0)
    event = Relationship(
        self_view='v1.track_event',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.event_detail',
        related_view_kwargs={'track_id': '<id>'},
        schema='EventSchemaPublic',
        type_='event',
    )
    sessions = Relationship(
        self_view='v1.track_sessions',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.session_list',
        related_view_kwargs={'track_id': '<id>'},
        schema='SessionSchema',
        many=True,
        type_='session',
    )