from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel, Field, field_serializer
from .serializer_helpers import serialize_datetime
[docs]
class ShareOfVoiceBrands(BaseModel):
"""Represents a list of brands in the Share of Voice response."""
brand: Optional[str] = Field(default=None, description="The name of the brand.")
combined_products: Optional[int] = Field(default=None, description="The count of combined products.")
combined_weighted_sov: Optional[float] = Field(default=None, description="The combined weighted share of voice.")
combined_basic_sov: Optional[float] = Field(default=None, description="The combined basic share of voice.")
combined_average_position: Optional[float] = Field(default=None, description="The combined average position.")
combined_average_price: Optional[float] = Field(default=None, description="The combined average price.")
organic_products: Optional[int] = Field(default=None, description="The organic products.")
organic_weighted_sov: Optional[float] = Field(default=None, description="The organic weighted share of voice.")
organic_basic_sov: Optional[float] = Field(default=None, description="The organic basic share of voice.")
organic_average_position: Optional[float] = Field(default=None, description="The organic average position.")
organic_average_price: Optional[float] = Field(default=None, description="The organic average price.")
sponsored_products: Optional[int] = Field(default=None, description="The sponsored products.")
sponsored_weighted_sov: Optional[float] = Field(default=None, description="The sponsored weighted share of voice.")
sponsored_basic_sov: Optional[float] = Field(default=None, description="The sponsored basic share of voice.")
sponsored_average_position: Optional[float] = Field(default=None, description="The sponsored average position.")
sponsored_average_price: Optional[float] = Field(default=None, description="The sponsored average price.")
[docs]
class ShareOfVoiceTopAsins(BaseModel):
"""Represents a list of top ASINs in the Share of Voice response."""
asin: Optional[str] = Field(default=None, description="The ASIN.")
name: Optional[str] = Field(default=None, description="The name.")
brand: Optional[str] = Field(default=None, description="The brand.")
clicks: Optional[int] = Field(default=None, description="The clicks.")
conversions: Optional[int] = Field(default=None, description="The conversions.")
conversion_rate: Optional[float] = Field(default=None, description="The conversion rate.")
[docs]
class ShareOfVoiceAttributes(BaseModel):
"""Attributes for the Share of Voice response."""
estimated_30_day_search_volume: int = Field(default=..., description="The estimated 30-day search volume.")
exact_suggested_bid_median: Optional[float] = Field(
default=None, description="The median of the exact suggested bid."
)
product_count: int = Field(default=..., description="The count of products.")
updated_at: datetime = Field(
default=..., description="The date and time when the Share of Voice data was last updated."
)
brands: List[ShareOfVoiceBrands] = Field(
default=..., description="The brands associated with the Share of Voice data."
)
top_asins: List[ShareOfVoiceTopAsins] = Field(
default=..., description="The top ASINs associated with the Share of Voice data."
)
top_asins_model_start_date: Optional[datetime] = Field(
default=..., description="The start date of the top ASINs model."
)
top_asins_model_end_date: Optional[datetime] = Field(
default=..., description="The end date of the top ASINs model."
)
@field_serializer("top_asins_model_start_date")
def _serialize_top_asins_model_start_date(self, v: datetime): # noqa: PLR6301
return serialize_datetime(v)
@field_serializer("top_asins_model_end_date")
def _serialize_top_asins_model_end_date(self, v: datetime): # noqa: PLR6301
return serialize_datetime(v)
@field_serializer("updated_at")
def _serialize_updated_at(self, v: datetime): # noqa: PLR6301
return serialize_datetime(v)
[docs]
class ShareOfVoice(BaseModel):
"""Represents the Share of Voice response from the Jungle Scout API."""
type: str = Field(default=..., description="The type of the Share of Voice response.")
id: str = Field(default=..., description="The ID of the Share of Voice response.")
attributes: ShareOfVoiceAttributes = Field(
default=..., description="The attributes of the Share of Voice response."
)