98 lines
2.9 KiB
Python
98 lines
2.9 KiB
Python
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):
|
||
# ...
|