import enum from typing import TYPE_CHECKING from uuid import UUID from tortoise import fields from .base import TimestampedModel if TYPE_CHECKING: from .placement import Placement from .subscriber import Subscriber from .target_channel import TargetChannel class SubscriptionStatus(str, enum.Enum): ACTIVE = 'active' UNSUBSCRIBED = 'unsubscribed' class Subscription(TimestampedModel): id = fields.UUIDField(pk=True) invite_link = fields.CharField(max_length=512, index=True) status = fields.CharEnumField(SubscriptionStatus, default=SubscriptionStatus.ACTIVE) unsubscribed_at = fields.DatetimeField(null=True) placement: fields.ForeignKeyRelation['Placement'] = fields.ForeignKeyField( 'models.Placement', related_name='subscriptions', on_delete=fields.CASCADE, index=True ) subscriber: fields.ForeignKeyRelation['Subscriber'] = fields.ForeignKeyField( 'models.Subscriber', related_name='subscriptions', on_delete=fields.CASCADE, index=True ) target_channel: fields.ForeignKeyRelation['TargetChannel'] = fields.ForeignKeyField( 'models.TargetChannel', related_name='subscriptions', on_delete=fields.CASCADE, index=True ) if TYPE_CHECKING: placement_id: UUID subscriber_id: UUID target_channel_id: UUID class Meta: table = 'subscription'