Merge branch 'v2_functions'
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-02-17 00:31:26 +09:00
36 changed files with 4396 additions and 352 deletions

View File

@@ -0,0 +1,26 @@
"""add_is_chat_banned_to_users
Revision ID: b4c435a7dc5f
Revises: 1f1631301809
Create Date: 2026-02-15 04:03:00.221540
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'b4c435a7dc5f'
down_revision = '1f1631301809'
branch_labels = None
depends_on = None
def upgrade() -> None:
# Добавление колонки is_chat_banned в таблицу users
op.add_column('users', sa.Column('is_chat_banned', sa.Boolean(), nullable=False, server_default='false'))
def downgrade() -> None:
# Удаление колонки is_chat_banned из таблицы users
op.drop_column('users', 'is_chat_banned')

View File

@@ -0,0 +1,24 @@
"""add_broadcast_system_tables
Revision ID: d19b1c0718df
Revises: 64c4f8a81afa
Create Date: 2026-02-15 10:33:39.894994
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'd19b1c0718df'
down_revision = '64c4f8a81afa'
branch_labels = None
depends_on = None
def upgrade() -> None:
pass
def downgrade() -> None:
pass

View File

@@ -0,0 +1,91 @@
"""add_broadcast_system_tables
Revision ID: 71376bb89294
Revises: d19b1c0718df
Create Date: 2026-02-15 10:33:55.664377
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '71376bb89294'
down_revision = 'd19b1c0718df'
branch_labels = None
depends_on = None
def upgrade() -> None:
# Создание таблицы broadcast_channels
op.create_table(
'broadcast_channels',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('chat_id', sa.BigInteger(), nullable=False),
sa.Column('chat_type', sa.String(length=20), nullable=False),
sa.Column('title', sa.String(length=255), nullable=False),
sa.Column('username', sa.String(length=255), nullable=True),
sa.Column('description', sa.Text(), nullable=True),
sa.Column('is_active', sa.Boolean(), nullable=True),
sa.Column('added_by', sa.Integer(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(['added_by'], ['users.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_broadcast_channels_chat_id'), 'broadcast_channels', ['chat_id'], unique=True)
op.create_index(op.f('ix_broadcast_channels_is_active'), 'broadcast_channels', ['is_active'], unique=False)
# Создание таблицы blocked_users
op.create_table(
'blocked_users',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('telegram_id', sa.BigInteger(), nullable=False),
sa.Column('error_type', sa.String(length=100), nullable=False),
sa.Column('error_message', sa.Text(), nullable=True),
sa.Column('first_blocked_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('last_attempt_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('attempt_count', sa.Integer(), nullable=True),
sa.Column('is_active', sa.Boolean(), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_blocked_users_telegram_id'), 'blocked_users', ['telegram_id'], unique=True)
op.create_index(op.f('ix_blocked_users_is_active'), 'blocked_users', ['is_active'], unique=False)
# Создание таблицы broadcast_logs
op.create_table(
'broadcast_logs',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('broadcast_type', sa.String(length=20), nullable=False),
sa.Column('target_id', sa.BigInteger(), nullable=True),
sa.Column('message_type', sa.String(length=20), nullable=False),
sa.Column('message_text', sa.Text(), nullable=True),
sa.Column('file_id', sa.String(length=255), nullable=True),
sa.Column('total_recipients', sa.Integer(), nullable=True),
sa.Column('success_count', sa.Integer(), nullable=True),
sa.Column('failed_count', sa.Integer(), nullable=True),
sa.Column('blocked_count', sa.Integer(), nullable=True),
sa.Column('created_by', sa.Integer(), nullable=False),
sa.Column('started_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('completed_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('status', sa.String(length=20), nullable=True),
sa.ForeignKeyConstraint(['created_by'], ['users.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_broadcast_logs_broadcast_type'), 'broadcast_logs', ['broadcast_type'], unique=False)
op.create_index(op.f('ix_broadcast_logs_status'), 'broadcast_logs', ['status'], unique=False)
def downgrade() -> None:
# Удаление таблиц в обратном порядке
op.drop_index(op.f('ix_broadcast_logs_status'), table_name='broadcast_logs')
op.drop_index(op.f('ix_broadcast_logs_broadcast_type'), table_name='broadcast_logs')
op.drop_table('broadcast_logs')
op.drop_index(op.f('ix_blocked_users_is_active'), table_name='blocked_users')
op.drop_index(op.f('ix_blocked_users_telegram_id'), table_name='blocked_users')
op.drop_table('blocked_users')
op.drop_index(op.f('ix_broadcast_channels_is_active'), table_name='broadcast_channels')
op.drop_index(op.f('ix_broadcast_channels_chat_id'), table_name='broadcast_channels')
op.drop_table('broadcast_channels')

View File

@@ -0,0 +1,31 @@
"""add_last_activity_to_users
Revision ID: 1f1631301809
Revises: 71376bb89294
Create Date: 2026-02-15 12:01:08.471873
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '1f1631301809'
down_revision = '71376bb89294'
branch_labels = None
depends_on = None
def upgrade() -> None:
# Добавляем поле last_activity
op.add_column('users', sa.Column('last_activity', sa.DateTime(timezone=True), nullable=True))
# Заполняем существующие записи значением created_at
op.execute('UPDATE users SET last_activity = created_at WHERE last_activity IS NULL')
# Делаем поле NOT NULL после заполнения
op.alter_column('users', 'last_activity', nullable=False)
def downgrade() -> None:
op.drop_column('users', 'last_activity')