chore: restructured project
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
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
|
||||
Reference in New Issue
Block a user