from datetime import datetime, date
from typing import Optional, Dict, Any
[docs]
def serialize_datetime_in_dict(value: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
"""
Serialize datetime/date objects in a dictionary to ISO 8601 date strings.
:param value: Optional dictionary that may contain datetime/date objects
:type value: Optional[Dict[str, Any]]
:returns: Dictionary with datetime/date objects converted to ISO 8601 date strings,
or None if input is None
:rtype: Optional[Dict[str, Any]]
"""
if value is None:
return None
serialized = {}
for key, val in value.items():
if isinstance(val, (datetime, date)):
# Convert datetime/date to ISO 8601 date format (YYYY-MM-DD)
if isinstance(val, datetime):
serialized[key] = val.date().isoformat()
else:
serialized[key] = val.isoformat()
else:
# Pass string values directly to the backend without modification
serialized[key] = val
return serialized
[docs]
def model_dump_for_query_params(
model, exclude_none=True, by_alias=True, exclude=None
):
"""
Serializes a Pydantic model for use as query parameters.
Converts list values to comma-separated strings for APIs that expect this format.
Filters out empty values (empty strings and empty lists).
:param model: A Pydantic BaseModel instance
:type model: BaseModel
:param exclude_none: Whether to exclude None values (default: True)
:type exclude_none: bool
:param by_alias: Whether to use field aliases (default: True)
:type by_alias: bool
:param exclude: Field names to omit (e.g. URL path params), passed to model_dump
:type exclude: set[str] | None
:returns: Serialized model data with lists converted to comma-separated strings
:rtype: dict
"""
dump_kwargs = {"exclude_none": exclude_none, "by_alias": by_alias}
if exclude is not None:
dump_kwargs["exclude"] = exclude
data = model.model_dump(**dump_kwargs)
filtered_data = {}
for key, value in data.items():
# Filter out empty strings
if value == "":
continue
# Filter out empty lists
if isinstance(value, list) and len(value) == 0:
continue
# Convert lists to comma-separated strings
if isinstance(value, list):
filtered_data[key] = ",".join(str(item) for item in value)
else:
filtered_data[key] = value
return filtered_data