Files
AdNova/solution/services/backend/api/v1/campaigns/schemas.py
T
2025-02-21 08:25:45 +03:00

110 lines
3.2 KiB
Python

from typing import Any, ClassVar
from uuid import UUID
from ninja import ModelSchema, Schema
from pydantic import field_validator
from pydantic.types import NonNegativeInt, PositiveInt
from apps.campaign.models import Campaign
class CampaignTargeting(ModelSchema):
class Meta:
model = Campaign
fields: ClassVar[tuple[str]] = (
Campaign.gender.field.name,
Campaign.age_from.field.name,
Campaign.age_to.field.name,
Campaign.location.field.name,
)
fields_optional = "__all__"
class CampaignOut(ModelSchema):
campaign_id: UUID
advertiser_id: UUID
targeting: CampaignTargeting = None
class Meta:
model = Campaign
fields: ClassVar[tuple[str]] = (
Campaign.ad_title.field.name,
Campaign.ad_text.field.name,
Campaign.ad_image.field.name,
Campaign.impressions_limit.field.name,
Campaign.clicks_limit.field.name,
Campaign.cost_per_impression.field.name,
Campaign.cost_per_click.field.name,
Campaign.start_date.field.name,
Campaign.end_date.field.name,
)
class CampaignCreateIn(ModelSchema):
targeting: CampaignTargeting = None
class Meta:
model = Campaign
fields: ClassVar[tuple[str]] = (
Campaign.ad_title.field.name,
Campaign.ad_text.field.name,
Campaign.impressions_limit.field.name,
Campaign.clicks_limit.field.name,
Campaign.cost_per_impression.field.name,
Campaign.cost_per_click.field.name,
Campaign.start_date.field.name,
Campaign.end_date.field.name,
)
@field_validator("targeting", mode="before")
@classmethod
def validate_targeting(cls, value: Any) -> Any:
if (
not isinstance(value, dict)
and not isinstance(
value,
CampaignTargeting,
)
and value
):
err = "The 'targeting' field must be a valid object or null."
raise ValueError(err)
return value
class CampaignUpdateIn(ModelSchema):
targeting: CampaignTargeting = None
class Meta:
model = Campaign
fields: ClassVar[tuple[str]] = (
Campaign.impressions_limit.field.name,
Campaign.clicks_limit.field.name,
Campaign.ad_title.field.name,
Campaign.ad_text.field.name,
Campaign.cost_per_impression.field.name,
Campaign.cost_per_click.field.name,
Campaign.start_date.field.name,
Campaign.end_date.field.name,
)
@field_validator("targeting", mode="before")
@classmethod
def validate_targeting(cls, value: Any) -> Any:
if (
not isinstance(value, dict)
and not isinstance(
value,
CampaignTargeting,
)
and value
):
err = "The 'targeting' field must be a valid object or null."
raise ValueError(err)
return value
class CampaignListFilters(Schema):
page: PositiveInt = 1
size: NonNegativeInt = 100