hesabixArc/hesabixAPI/migrations/versions/5553f8745c6e_add_support_tables.py

151 lines
8.6 KiB
Python
Raw Normal View History

2025-09-20 22:46:06 +03:30
"""add_support_tables
Revision ID: 5553f8745c6e
Revises: 20250117_000007
Create Date: 2025-09-20 14:02:19.543853
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
2025-10-15 21:21:11 +03:30
from sqlalchemy import inspect
2025-09-20 22:46:06 +03:30
# revision identifiers, used by Alembic.
revision = '5553f8745c6e'
down_revision = '20250117_000007'
branch_labels = None
depends_on = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
2025-10-15 21:21:11 +03:30
bind = op.get_bind()
inspector = inspect(bind)
tables = set(inspector.get_table_names())
# Only create tables if they don't exist
if 'support_categories' not in tables:
op.create_table('support_categories',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('name', sa.String(length=100), nullable=False),
sa.Column('description', sa.Text(), nullable=True),
sa.Column('is_active', sa.Boolean(), nullable=False),
sa.Column('created_at', sa.DateTime(), nullable=False),
sa.Column('updated_at', sa.DateTime(), nullable=False),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_support_categories_name'), 'support_categories', ['name'], unique=False)
if 'support_priorities' not in tables:
op.create_table('support_priorities',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('name', sa.String(length=50), nullable=False),
sa.Column('description', sa.Text(), nullable=True),
sa.Column('color', sa.String(length=7), nullable=True),
sa.Column('order', sa.Integer(), nullable=False),
sa.Column('created_at', sa.DateTime(), nullable=False),
sa.Column('updated_at', sa.DateTime(), nullable=False),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_support_priorities_name'), 'support_priorities', ['name'], unique=False)
if 'support_statuses' not in tables:
op.create_table('support_statuses',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('name', sa.String(length=50), nullable=False),
sa.Column('description', sa.Text(), nullable=True),
sa.Column('color', sa.String(length=7), nullable=True),
sa.Column('is_final', sa.Boolean(), nullable=False),
sa.Column('created_at', sa.DateTime(), nullable=False),
sa.Column('updated_at', sa.DateTime(), nullable=False),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_support_statuses_name'), 'support_statuses', ['name'], unique=False)
if 'support_tickets' not in tables:
op.create_table('support_tickets',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('title', sa.String(length=255), nullable=False),
sa.Column('description', sa.Text(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('category_id', sa.Integer(), nullable=False),
sa.Column('priority_id', sa.Integer(), nullable=False),
sa.Column('status_id', sa.Integer(), nullable=False),
sa.Column('assigned_operator_id', sa.Integer(), nullable=True),
sa.Column('is_internal', sa.Boolean(), nullable=False),
sa.Column('closed_at', sa.DateTime(), nullable=True),
sa.Column('created_at', sa.DateTime(), nullable=False),
sa.Column('updated_at', sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(['assigned_operator_id'], ['users.id'], ondelete='SET NULL'),
sa.ForeignKeyConstraint(['category_id'], ['support_categories.id'], ondelete='RESTRICT'),
sa.ForeignKeyConstraint(['priority_id'], ['support_priorities.id'], ondelete='RESTRICT'),
sa.ForeignKeyConstraint(['status_id'], ['support_statuses.id'], ondelete='RESTRICT'),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_support_tickets_assigned_operator_id'), 'support_tickets', ['assigned_operator_id'], unique=False)
op.create_index(op.f('ix_support_tickets_category_id'), 'support_tickets', ['category_id'], unique=False)
op.create_index(op.f('ix_support_tickets_priority_id'), 'support_tickets', ['priority_id'], unique=False)
op.create_index(op.f('ix_support_tickets_status_id'), 'support_tickets', ['status_id'], unique=False)
op.create_index(op.f('ix_support_tickets_title'), 'support_tickets', ['title'], unique=False)
op.create_index(op.f('ix_support_tickets_user_id'), 'support_tickets', ['user_id'], unique=False)
if 'support_messages' not in tables:
op.create_table('support_messages',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('ticket_id', sa.Integer(), nullable=False),
sa.Column('sender_id', sa.Integer(), nullable=False),
sa.Column('sender_type', sa.Enum('USER', 'OPERATOR', 'SYSTEM', name='sendertype'), nullable=False),
sa.Column('content', sa.Text(), nullable=False),
sa.Column('is_internal', sa.Boolean(), nullable=False),
sa.Column('created_at', sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(['sender_id'], ['users.id'], ondelete='CASCADE'),
sa.ForeignKeyConstraint(['ticket_id'], ['support_tickets.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_support_messages_sender_id'), 'support_messages', ['sender_id'], unique=False)
op.create_index(op.f('ix_support_messages_sender_type'), 'support_messages', ['sender_type'], unique=False)
op.create_index(op.f('ix_support_messages_ticket_id'), 'support_messages', ['ticket_id'], unique=False)
# Only alter columns if businesses table exists
if 'businesses' in tables:
op.alter_column('businesses', 'business_type',
existing_type=mysql.ENUM('شرکت', 'مغازه', 'فروشگاه', 'اتحادیه', 'باشگاه', 'موسسه', 'شخصی', collation='utf8mb4_general_ci'),
type_=sa.Enum('COMPANY', 'SHOP', 'STORE', 'UNION', 'CLUB', 'INSTITUTE', 'INDIVIDUAL', name='businesstype'),
existing_nullable=False)
op.alter_column('businesses', 'business_field',
existing_type=mysql.ENUM('تولیدی', 'بازرگانی', 'خدماتی', 'سایر', collation='utf8mb4_general_ci'),
type_=sa.Enum('MANUFACTURING', 'TRADING', 'SERVICE', 'OTHER', name='businessfield'),
existing_nullable=False)
2025-09-20 22:46:06 +03:30
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('businesses', 'business_field',
existing_type=sa.Enum('MANUFACTURING', 'TRADING', 'SERVICE', 'OTHER', name='businessfield'),
type_=mysql.ENUM('تولیدی', 'بازرگانی', 'خدماتی', 'سایر', collation='utf8mb4_general_ci'),
existing_nullable=False)
op.alter_column('businesses', 'business_type',
existing_type=sa.Enum('COMPANY', 'SHOP', 'STORE', 'UNION', 'CLUB', 'INSTITUTE', 'INDIVIDUAL', name='businesstype'),
type_=mysql.ENUM('شرکت', 'مغازه', 'فروشگاه', 'اتحادیه', 'باشگاه', 'موسسه', 'شخصی', collation='utf8mb4_general_ci'),
existing_nullable=False)
op.drop_index(op.f('ix_support_messages_ticket_id'), table_name='support_messages')
op.drop_index(op.f('ix_support_messages_sender_type'), table_name='support_messages')
op.drop_index(op.f('ix_support_messages_sender_id'), table_name='support_messages')
op.drop_table('support_messages')
op.drop_index(op.f('ix_support_tickets_user_id'), table_name='support_tickets')
op.drop_index(op.f('ix_support_tickets_title'), table_name='support_tickets')
op.drop_index(op.f('ix_support_tickets_status_id'), table_name='support_tickets')
op.drop_index(op.f('ix_support_tickets_priority_id'), table_name='support_tickets')
op.drop_index(op.f('ix_support_tickets_category_id'), table_name='support_tickets')
op.drop_index(op.f('ix_support_tickets_assigned_operator_id'), table_name='support_tickets')
op.drop_table('support_tickets')
op.drop_index(op.f('ix_support_statuses_name'), table_name='support_statuses')
op.drop_table('support_statuses')
op.drop_index(op.f('ix_support_priorities_name'), table_name='support_priorities')
op.drop_table('support_priorities')
op.drop_index(op.f('ix_support_categories_name'), table_name='support_categories')
op.drop_table('support_categories')
# ### end Alembic commands ###