"""Schema for get_orders.""" from marshmallow import fields from marshmallow import pre_load from marshmallow import Schema from marshmallow import validate from marshmallow import ValidationError from marshmallow.validate import Range from ows_product_physical.constant.delivery_order import ORDER_DIR from ows_product_physical.constant.delivery_order import ORDER_ORDER_BY from ows_product_physical.constant.delivery_order import ORDER_STATUS from ows_product_physical.constant.delivery_order import ORDER_TYPE def validate_order_by(value): """Validates order_by parameter value.""" if value is not None and value not in ORDER_ORDER_BY: raise ValidationError(f'Invalid order_by value: {value}') return value def validate_order_dir(value): """Validates order_dir parameter value.""" if value is not None and value not in ORDER_DIR: raise ValidationError(f'Invalid order_dir value: {value}') return value class GetOrdersSchema(Schema): """Validation schema for payload of GET /order endpoint.""" ids = fields.List(fields.Integer(required=True), required=False) delivery_store_ids = fields.List(fields.Integer(required=True)) status = fields.String( required=False, validate=validate.OneOf(ORDER_STATUS)) delivery_type = fields.String( required=False, validate=validate.OneOf(ORDER_TYPE)) limit = fields.Integer(required=False, validate=Range(min=1)) offset = fields.Integer(required=False, validate=Range(min=0)) order_by = fields.String(required=False, validate=validate_order_by) order_dir = fields.String(required=False, validate=validate_order_dir) delivery_types = fields.List(fields.String(required=True), required=False) delivery_statuses = fields.List(fields.String(required=True), required=False) @pre_load def deconstruct_lists(self, data, **kwargs): """Pre load args.""" if 'ids' in data: data['ids'] = data['ids'].split(',') if 'delivery_store_ids' in data: data['delivery_store_ids'] = data['delivery_store_ids'].split(',') if 'delivery_types' in data: data['delivery_types'] = data['delivery_types'].split(',') if 'delivery_statuses' in data: data['delivery_statuses'] = data['delivery_statuses'].split(',') return data