from datetime import date from marshmallow import ValidationError, fields, validates_schema def get_date_range_mixin( required: bool = True, start_field: str = "start_date", end_field: str = "end_date", start_missing: date or None = None, end_missing: date or None = None, ) -> type: class DateRangeParams: """Date range validation mixin.""" start_date = fields.Date( required=required, format="iso", description="Date range start value (ISO8601-formatted).", data_key=start_field, **({} if required else {"missing": start_missing}), ) end_date = fields.Date( required=required, format="iso", description="Date range end value (ISO8601-formatted).", data_key=end_field, **({} if required else {"missing": end_missing}), ) @validates_schema def validate_date_range(self, data, **kwargs): if data.get("start_date") and data.get("end_date") and data["start_date"] > data["end_date"]: raise ValidationError("The end date can not be before the start date.") return DateRangeParams DateRangeMixin = get_date_range_mixin() DateRangeOptionalMixin = get_date_range_mixin(required=False)