64 lines
1.9 KiB
Python
64 lines
1.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 .project import Project
|
|
from .workspace import Workspace
|
|
|
|
|
|
class PurchasePlanStatus(str, enum.Enum):
|
|
ACTIVE = 'active'
|
|
ARCHIVED = 'archived'
|
|
|
|
|
|
class PurchasePlanChannelStatus(str, enum.Enum):
|
|
PLANNED = 'planned'
|
|
APPROVED = 'approved'
|
|
REJECTED = 'rejected'
|
|
IN_PROGRESS = 'in_progress'
|
|
COMPLETED = 'completed'
|
|
|
|
|
|
class PurchasePlan(TimestampedModel):
|
|
id = fields.UUIDField(pk=True)
|
|
status = fields.CharEnumField(PurchasePlanStatus, default=PurchasePlanStatus.ACTIVE)
|
|
|
|
workspace: fields.ForeignKeyRelation['Workspace'] = fields.ForeignKeyField(
|
|
'models.Workspace', related_name='purchase_plans', on_delete=fields.CASCADE, index=True
|
|
)
|
|
project: fields.ForeignKeyRelation['Project'] = fields.ForeignKeyField(
|
|
'models.Project', related_name='purchase_plans', on_delete=fields.CASCADE, index=True
|
|
)
|
|
|
|
class Meta:
|
|
table = 'purchase_plan'
|
|
indexes = (('project', 'status'),)
|
|
|
|
|
|
class PurchasePlanChannel(TimestampedModel):
|
|
id = fields.UUIDField(pk=True)
|
|
status = fields.CharEnumField(PurchasePlanChannelStatus, default=PurchasePlanChannelStatus.PLANNED)
|
|
planned_cost = fields.FloatField(null=True)
|
|
comment = fields.TextField(null=True)
|
|
|
|
purchase_plan: fields.ForeignKeyRelation['PurchasePlan'] = fields.ForeignKeyField(
|
|
'models.PurchasePlan', related_name='channels', on_delete=fields.CASCADE, index=True
|
|
)
|
|
channel: fields.ForeignKeyRelation['Channel'] = fields.ForeignKeyField(
|
|
'models.Channel', related_name='purchase_plan_channels', on_delete=fields.CASCADE, index=True
|
|
)
|
|
|
|
if TYPE_CHECKING:
|
|
purchase_plan_id: uuid.UUID
|
|
channel_id: uuid.UUID
|
|
|
|
class Meta:
|
|
table = 'purchase_plan_channel'
|
|
unique_together = (('purchase_plan_id', 'channel_id'),)
|