import enum import uuid from typing import TYPE_CHECKING from tortoise import fields from .base import TimestampedModel if TYPE_CHECKING: from .channel import Channel from .creative import Creative from .project import Project __all__ = ['Placement', 'PlacementStatus', 'PlacementType', 'InviteLinkType', 'CostType'] class CostType(enum.StrEnum): FIXED = 'fixed' CPM = 'cpm' class PlacementStatus(enum.StrEnum): PLANNED = 'planned' APPROVED = 'approved' REJECTED = 'rejected' IN_PROGRESS = 'in_progress' COMPLETED = 'completed' class PlacementType(enum.StrEnum): SELF_PROMO = 'self_promo' STANDARD = 'standard' class InviteLinkType(enum.StrEnum): PUBLIC = 'public' # открытая ссылка APPROVAL = 'approval' # с одобрением ботом class Placement(TimestampedModel): """Размещение, управляемое пользователем (бывший PurchaseChannel + Purchase)""" status = fields.CharEnumField(PlacementStatus, default=PlacementStatus.PLANNED) placement_at = fields.DatetimeField(null=True) payment_at = fields.DatetimeField(null=True) cost_type = fields.CharEnumField(CostType, null=True, max_length=8) cost_value = fields.FloatField(null=True) cost_before_bargain = fields.FloatField(null=True) placement_type = fields.CharEnumField(PlacementType, null=True, max_length=16) format = fields.TextField(null=True) comment = fields.TextField(null=True) invite_link = fields.CharField(max_length=512) invite_link_type = fields.CharEnumField(InviteLinkType) project: fields.ForeignKeyRelation['Project'] = fields.ForeignKeyField( 'models.Project', related_name='placements', on_delete=fields.CASCADE, index=True ) creative: fields.ForeignKeyRelation['Creative'] = fields.ForeignKeyField( 'models.Creative', related_name='placements', on_delete=fields.CASCADE, index=True ) channel: fields.ForeignKeyRelation['Channel'] = fields.ForeignKeyField( 'models.Channel', related_name='placements', on_delete=fields.CASCADE, index=True ) if TYPE_CHECKING: project_id: uuid.UUID creative_id: uuid.UUID channel_id: uuid.UUID class Meta: table = 'placement' indexes = (('project', 'status'),) # DEPRECATED: старые модели, будут удалены после миграции # class PurchaseStatus(enum.StrEnum): # ACTIVE = 'active' # ARCHIVED = 'archived' # # class PurchaseChannelStatus(enum.StrEnum): # PLANNED = 'planned' # APPROVED = 'approved' # REJECTED = 'rejected' # IN_PROGRESS = 'in_progress' # COMPLETED = 'completed' # # class PurchaseType(enum.StrEnum): # SELF_PROMO = 'self_promo' # STANDARD = 'standard' # # class Purchase(TimestampedModel): # ... # # class PurchaseChannel(TimestampedModel): # ...