85 lines
3.2 KiB
Python
85 lines
3.2 KiB
Python
from sqlalchemy import Table, Column, Integer, String, Text, Enum as SQLAEnum, JSON, ForeignKey, DateTime, Index, PrimaryKeyConstraint
|
|
from sqlalchemy.sql import func
|
|
from enum import Enum, auto
|
|
|
|
from api.db.sql_types import UnsignedInt
|
|
|
|
from api.db import metadata
|
|
|
|
|
|
# Определение перечислений для статуса процесса
|
|
class ProcessStatus(str, Enum):
|
|
ACTIVE = auto()
|
|
STOPPING = auto()
|
|
STOPPED = auto()
|
|
DELETED = auto()
|
|
|
|
# Определение таблицы process_schema
|
|
process_schema_table = Table(
|
|
'process_schema', metadata,
|
|
Column('id', UnsignedInt, primary_key=True, autoincrement=True),
|
|
Column('title', String(100), nullable=False),
|
|
Column('description', Text, nullable=False),
|
|
Column('owner_id', UnsignedInt, ForeignKey('account.id'), nullable=False),
|
|
Column('creator_id', UnsignedInt, ForeignKey('account.id'), nullable=False),
|
|
Column('created_at', DateTime(timezone=True), server_default=func.now()),
|
|
Column('settings', JSON, default={}),
|
|
Column('status', SQLAEnum(ProcessStatus), nullable=False),
|
|
|
|
Index('idx_owner_id', 'owner_id',)
|
|
)
|
|
|
|
process_version_archive_table = Table(
|
|
'process_version_archive', metadata,
|
|
Column('id', UnsignedInt, autoincrement=True, nullable=False),
|
|
Column('ps_id', UnsignedInt, ForeignKey('process_schema.id'), nullable=False),
|
|
Column('version', UnsignedInt, default=1, nullable=False),
|
|
Column('snapshot', JSON, default={}),
|
|
Column('owner_id', UnsignedInt, ForeignKey('account.id'), nullable=False),
|
|
Column('created_at', DateTime(timezone=True), server_default=func.now()),
|
|
Column('is_last', UnsignedInt, default=0),
|
|
PrimaryKeyConstraint('id', 'version') )
|
|
|
|
class NodeStatus(str, Enum):
|
|
ACTIVE = auto()
|
|
DISABLED = auto()
|
|
DELETED = auto()
|
|
|
|
class NodeType(Enum):
|
|
TYPE1 = 'Type1'
|
|
TYPE2 = 'Type2'
|
|
TYPE3 = 'Type3'
|
|
|
|
ps_node_table = Table(
|
|
'ps_node', metadata,
|
|
Column('id', UnsignedInt, autoincrement=True, primary_key=True, nullable=False),
|
|
Column('ps_id', UnsignedInt, ForeignKey('process_schema.id'), nullable=False),
|
|
Column('node_type', SQLAEnum(NodeType), nullable=False),
|
|
Column('settings', JSON, default={}),
|
|
Column('creator_id', UnsignedInt, ForeignKey('account.id'), nullable=False),
|
|
Column('created_at', DateTime(timezone=True), server_default=func.now()),
|
|
Column('status', SQLAEnum(NodeStatus), nullable=False),
|
|
|
|
Index('idx_ps_id', 'ps_id')
|
|
)
|
|
|
|
class NodeLinkStatus(str, Enum):
|
|
ACTIVE = auto()
|
|
STOPPING = auto()
|
|
STOPPED = auto()
|
|
DELETED = auto()
|
|
|
|
node_link_table = Table(
|
|
'node_link', metadata,
|
|
Column('id', UnsignedInt, autoincrement=True, primary_key=True, nullable=False),
|
|
Column('link_name', String(20), nullable=False),
|
|
Column('node_id', UnsignedInt, ForeignKey('ps_node.id'), nullable=False),
|
|
Column('next_node_id', UnsignedInt, ForeignKey('ps_node.id'), nullable=False),
|
|
Column('settings', JSON, default={}),
|
|
Column('creator_id', UnsignedInt, ForeignKey('account.id'), nullable=False),
|
|
Column('created_at', DateTime(timezone=True), server_default=func.now()),
|
|
Column('status', SQLAEnum(NodeLinkStatus),nullable=False),
|
|
|
|
Index('idx_node_id', 'node_id'),
|
|
Index('idx_next_node_id', 'next_node_id'))
|