From 5c6c3f436e673c845330cdcb2c6c6b18440b0ec1 Mon Sep 17 00:00:00 2001 From: Kobe Date: Mon, 2 Jun 2025 18:58:48 +0200 Subject: [PATCH] more robust migrations --- ..._add_file_attachment_fields_to_message_.py | 38 ++++++--- ...7825e3a9_add_user_authentication_fields.py | 30 +++---- .../versions/20519a2437c2_add_mails_table.py | 30 +++---- ...a158dd705_add_is_admin_to_contact_model.py | 14 ++- .../444d76da74ba_add_notifications_table.py | 20 ++--- ...b0_add_room_file_table_for_file_folder_.py | 38 +++++---- ...9_add_starred_column_to_room_file_table.py | 80 +++++++++++------- ...ea77_add_company_information_fields_to_.py | 34 +++++--- .../9faab7ef6036_add_site_settings_table.py | 31 +++---- ...user_authentication_fields.cpython-311.pyc | Bin 2104 -> 2118 bytes ...519a2437c2_add_mails_table.cpython-311.pyc | Bin 2297 -> 2580 bytes ..._is_admin_to_contact_model.cpython-311.pyc | Bin 1598 -> 1644 bytes ...m_member_permissions_table.cpython-311.pyc | Bin 1937 -> 2220 bytes ...b78_add_room_members_table.cpython-311.pyc | Bin 2259 -> 2858 bytes ...5b8d8e53cd_add_rooms_table.cpython-311.pyc | Bin 1850 -> 2133 bytes ...ba_add_notifications_table.cpython-311.pyc | Bin 2046 -> 2330 bytes ...ile_table_for_file_folder_.cpython-311.pyc | Bin 3232 -> 3508 bytes ..._column_to_room_file_table.cpython-311.pyc | Bin 3192 -> 3238 bytes ...b70efe7_fix_existing_users.cpython-311.pyc | Bin 1136 -> 1182 bytes .../76da0573e84b_merge_heads.cpython-311.pyc | Bin 821 -> 867 bytes ...any_information_fields_to_.cpython-311.pyc | Bin 3985 -> 4031 bytes ...t_name_field_in_user_model.cpython-311.pyc | Bin 1574 -> 1620 bytes ...36_add_site_settings_table.cpython-311.pyc | Bin 2483 -> 2936 bytes .../add_conversations_tables.cpython-311.pyc | Bin 3214 -> 3831 bytes ...dd_deleted_by_to_room_file.cpython-311.pyc | Bin 2182 -> 2228 bytes ...eleted_column_to_room_file.cpython-311.pyc | Bin 1682 -> 1728 bytes .../add_trashed_file_table.cpython-311.pyc | Bin 2672 -> 2955 bytes ...add_preferred_view_to_user.cpython-311.pyc | Bin 2553 -> 3050 bytes .../bd04430cda95_merge_heads.cpython-311.pyc | Bin 779 -> 825 bytes ...d_granular_permissions_to_.cpython-311.pyc | Bin 2289 -> 2335 bytes ..._add_email_templates_table.cpython-311.pyc | Bin 5655 -> 6136 bytes ...ad_add_colorsettings_table.cpython-311.pyc | Bin 3380 -> 3654 bytes ...te_user_starred_file_table.cpython-311.pyc | Bin 2731 -> 3007 bytes ...assword_hash_column_length.cpython-311.pyc | Bin 1822 -> 1868 bytes ...age_attachments_table_and_.cpython-311.pyc | Bin 3962 -> 4238 bytes ...888_add_company_logo_field.cpython-311.pyc | Bin 1620 -> 1666 bytes .../versions/add_conversations_tables.py | 52 ++++++------ .../versions/add_deleted_by_to_room_file.py | 10 ++- .../add_deleted_column_to_room_file.py | 9 +- migrations/versions/add_trashed_file_table.py | 34 ++++---- ...b978642e7b10_add_preferred_view_to_user.py | 22 +++-- ...1f7bdd10e1_add_granular_permissions_to_.py | 13 ++- ...21f243b3640_add_profile_picture_to_user.py | 12 ++- ...243d6a1843d_add_last_name_to_user_model.py | 7 +- .../c770e08966b4_add_email_templates_table.py | 50 +++++------ .../ca9026520dad_add_colorsettings_table.py | 16 ++-- .../create_user_starred_file_table.py | 20 ++--- ...81_increase_password_hash_column_length.py | 30 ++++--- .../dbcb5d2d3ed0_add_contact_model.py | 51 ++++++----- ...1f7a_add_message_attachments_table_and_.py | 24 +++--- .../f18735338888_add_company_logo_field.py | 9 +- 51 files changed, 401 insertions(+), 273 deletions(-) diff --git a/migrations/versions/0f48943140fa_add_file_attachment_fields_to_message_.py b/migrations/versions/0f48943140fa_add_file_attachment_fields_to_message_.py index bb2b839..43bb364 100644 --- a/migrations/versions/0f48943140fa_add_file_attachment_fields_to_message_.py +++ b/migrations/versions/0f48943140fa_add_file_attachment_fields_to_message_.py @@ -19,23 +19,41 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + inspector = inspect(conn) + columns = [col['name'] for col in inspector.get_columns('message')] + with op.batch_alter_table('message', schema=None) as batch_op: - batch_op.add_column(sa.Column('has_attachment', sa.Boolean(), nullable=True)) - batch_op.add_column(sa.Column('attachment_name', sa.String(length=255), nullable=True)) - batch_op.add_column(sa.Column('attachment_path', sa.String(length=512), nullable=True)) - batch_op.add_column(sa.Column('attachment_type', sa.String(length=100), nullable=True)) - batch_op.add_column(sa.Column('attachment_size', sa.Integer(), nullable=True)) + if 'has_attachment' not in columns: + batch_op.add_column(sa.Column('has_attachment', sa.Boolean(), nullable=True)) + if 'attachment_name' not in columns: + batch_op.add_column(sa.Column('attachment_name', sa.String(length=255), nullable=True)) + if 'attachment_path' not in columns: + batch_op.add_column(sa.Column('attachment_path', sa.String(length=512), nullable=True)) + if 'attachment_type' not in columns: + batch_op.add_column(sa.Column('attachment_type', sa.String(length=100), nullable=True)) + if 'attachment_size' not in columns: + batch_op.add_column(sa.Column('attachment_size', sa.Integer(), nullable=True)) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + inspector = inspect(conn) + columns = [col['name'] for col in inspector.get_columns('message')] + with op.batch_alter_table('message', schema=None) as batch_op: - batch_op.drop_column('attachment_size') - batch_op.drop_column('attachment_type') - batch_op.drop_column('attachment_path') - batch_op.drop_column('attachment_name') - batch_op.drop_column('has_attachment') + if 'attachment_size' in columns: + batch_op.drop_column('attachment_size') + if 'attachment_type' in columns: + batch_op.drop_column('attachment_type') + if 'attachment_path' in columns: + batch_op.drop_column('attachment_path') + if 'attachment_name' in columns: + batch_op.drop_column('attachment_name') + if 'has_attachment' in columns: + batch_op.drop_column('has_attachment') # ### end Alembic commands ### diff --git a/migrations/versions/1c297825e3a9_add_user_authentication_fields.py b/migrations/versions/1c297825e3a9_add_user_authentication_fields.py index 1933aaa..1423971 100644 --- a/migrations/versions/1c297825e3a9_add_user_authentication_fields.py +++ b/migrations/versions/1c297825e3a9_add_user_authentication_fields.py @@ -22,23 +22,23 @@ def upgrade(): conn = op.get_bind() inspector = sa.inspect(conn) if 'user' not in inspector.get_table_names(): - conn = op.get_bind() - inspector = inspect(conn) - tables = inspector.get_table_names() - - if 'user' not in tables: - op.create_table('user', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('username', sa.String(length=150), nullable=False), - sa.Column('email', sa.String(length=150), nullable=False), - sa.Column('password_hash', sa.String(length=128), nullable=True), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('email'), - sa.UniqueConstraint('username') - ) + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'user' not in tables: + op.create_table('user', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('username', sa.String(length=150), nullable=False), + sa.Column('email', sa.String(length=150), nullable=False), + sa.Column('password_hash', sa.String(length=128), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('email'), + sa.UniqueConstraint('username') + ) def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_table('user') - # ### end Alembic commands ### + # ### end Alembic commands ### \ No newline at end of file diff --git a/migrations/versions/20519a2437c2_add_mails_table.py b/migrations/versions/20519a2437c2_add_mails_table.py index 367cfee..5467f4b 100644 --- a/migrations/versions/20519a2437c2_add_mails_table.py +++ b/migrations/versions/20519a2437c2_add_mails_table.py @@ -19,29 +19,29 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - conn = op.get_bind() + conn = op.get_bind() inspector = inspect(conn) tables = inspector.get_table_names() if 'mails' not in tables: op.create_table('mails', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('recipient', sa.String(length=150), nullable=False), - sa.Column('subject', sa.String(length=200), nullable=False), - sa.Column('body', sa.Text(), nullable=False), - sa.Column('status', sa.String(length=20), nullable=False), - sa.Column('created_at', sa.DateTime(), nullable=True), - sa.Column('sent_at', sa.DateTime(), nullable=True), - sa.Column('template_id', sa.Integer(), nullable=True), - sa.Column('notif_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint(['notif_id'], ['notifs.id'], ), - sa.ForeignKeyConstraint(['template_id'], ['email_templates.id'], ), - sa.PrimaryKeyConstraint('id') - ) + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('recipient', sa.String(length=150), nullable=False), + sa.Column('subject', sa.String(length=200), nullable=False), + sa.Column('body', sa.Text(), nullable=False), + sa.Column('status', sa.String(length=20), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.Column('sent_at', sa.DateTime(), nullable=True), + sa.Column('template_id', sa.Integer(), nullable=True), + sa.Column('notif_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['notif_id'], ['notifs.id'], ), + sa.ForeignKeyConstraint(['template_id'], ['email_templates.id'], ), + sa.PrimaryKeyConstraint('id') + ) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_table('mails') - # ### end Alembic commands ### + # ### end Alembic commands ### \ No newline at end of file diff --git a/migrations/versions/25da158dd705_add_is_admin_to_contact_model.py b/migrations/versions/25da158dd705_add_is_admin_to_contact_model.py index e726c1b..446b2dc 100644 --- a/migrations/versions/25da158dd705_add_is_admin_to_contact_model.py +++ b/migrations/versions/25da158dd705_add_is_admin_to_contact_model.py @@ -19,15 +19,25 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + inspector = inspect(conn) + columns = [col['name'] for col in inspector.get_columns('contact')] + with op.batch_alter_table('contact', schema=None) as batch_op: - batch_op.add_column(sa.Column('is_admin', sa.Boolean(), nullable=True)) + if 'is_admin' not in columns: + batch_op.add_column(sa.Column('is_admin', sa.Boolean(), nullable=True)) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + inspector = inspect(conn) + columns = [col['name'] for col in inspector.get_columns('contact')] + with op.batch_alter_table('contact', schema=None) as batch_op: - batch_op.drop_column('is_admin') + if 'is_admin' in columns: + batch_op.drop_column('is_admin') # ### end Alembic commands ### diff --git a/migrations/versions/444d76da74ba_add_notifications_table.py b/migrations/versions/444d76da74ba_add_notifications_table.py index 6dc3859..1f36179 100644 --- a/migrations/versions/444d76da74ba_add_notifications_table.py +++ b/migrations/versions/444d76da74ba_add_notifications_table.py @@ -25,18 +25,18 @@ def upgrade(): def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - conn = op.get_bind() + conn = op.get_bind() inspector = inspect(conn) tables = inspector.get_table_names() if 'template_variables' not in tables: op.create_table('template_variables', - sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False), - sa.Column('notification_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False), - sa.Column('variable_name', sa.VARCHAR(length=50), autoincrement=False, nullable=False), - sa.Column('description', sa.VARCHAR(length=200), autoincrement=False, nullable=False), - sa.Column('example_value', sa.VARCHAR(length=200), autoincrement=False, nullable=True), - sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True), - sa.PrimaryKeyConstraint('id', name=op.f('template_variables_pkey')) - ) - # ### end Alembic commands ### + sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False), + sa.Column('notification_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False), + sa.Column('variable_name', sa.VARCHAR(length=50), autoincrement=False, nullable=False), + sa.Column('description', sa.VARCHAR(length=200), autoincrement=False, nullable=False), + sa.Column('example_value', sa.VARCHAR(length=200), autoincrement=False, nullable=True), + sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True), + sa.PrimaryKeyConstraint('id', name=op.f('template_variables_pkey')) + ) + # ### end Alembic commands ### \ No newline at end of file diff --git a/migrations/versions/64b5c28510b0_add_room_file_table_for_file_folder_.py b/migrations/versions/64b5c28510b0_add_room_file_table_for_file_folder_.py index a962180..ce5d202 100644 --- a/migrations/versions/64b5c28510b0_add_room_file_table_for_file_folder_.py +++ b/migrations/versions/64b5c28510b0_add_room_file_table_for_file_folder_.py @@ -19,27 +19,31 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - conn = op.get_bind() + conn = op.get_bind() inspector = inspect(conn) tables = inspector.get_table_names() if 'room_file' not in tables: op.create_table('room_file', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('room_id', sa.Integer(), nullable=False), - sa.Column('name', sa.String(length=255), nullable=False), - sa.Column('path', sa.String(length=1024), nullable=False), - sa.Column('type', sa.String(length=10), nullable=False), - sa.Column('size', sa.BigInteger(), nullable=True), - sa.Column('modified', sa.Float(), nullable=True), - sa.Column('uploaded_by', sa.Integer(), nullable=False), - sa.Column('uploaded_at', sa.DateTime(), nullable=False), - sa.ForeignKeyConstraint(['room_id'], ['room.id'], ), - sa.ForeignKeyConstraint(['uploaded_by'], ['user.id'], ), - sa.PrimaryKeyConstraint('id') - ) - with op.batch_alter_table('room_member_permissions', schema=None) as batch_op: - batch_op.drop_column('preferred_view') + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('room_id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=255), nullable=False), + sa.Column('path', sa.String(length=1024), nullable=False), + sa.Column('type', sa.String(length=10), nullable=False), + sa.Column('size', sa.BigInteger(), nullable=True), + sa.Column('modified', sa.Float(), nullable=True), + sa.Column('uploaded_by', sa.Integer(), nullable=False), + sa.Column('uploaded_at', sa.DateTime(), nullable=False), + sa.ForeignKeyConstraint(['room_id'], ['room.id'], ), + sa.ForeignKeyConstraint(['uploaded_by'], ['user.id'], ), + sa.PrimaryKeyConstraint('id') + ) + + # Check if preferred_view column exists before trying to drop it + columns = [col['name'] for col in inspector.get_columns('room_member_permissions')] + if 'preferred_view' in columns: + with op.batch_alter_table('room_member_permissions', schema=None) as batch_op: + batch_op.drop_column('preferred_view') # ### end Alembic commands ### @@ -50,4 +54,4 @@ def downgrade(): batch_op.add_column(sa.Column('preferred_view', sa.VARCHAR(length=10), autoincrement=False, nullable=False)) op.drop_table('room_file') - # ### end Alembic commands ### + # ### end Alembic commands ### \ No newline at end of file diff --git a/migrations/versions/6651332488d9_add_starred_column_to_room_file_table.py b/migrations/versions/6651332488d9_add_starred_column_to_room_file_table.py index c3b2ffb..9ee483d 100644 --- a/migrations/versions/6651332488d9_add_starred_column_to_room_file_table.py +++ b/migrations/versions/6651332488d9_add_starred_column_to_room_file_table.py @@ -19,43 +19,63 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + inspector = inspect(conn) + columns = [col['name'] for col in inspector.get_columns('room_file')] + with op.batch_alter_table('room_file', schema=None) as batch_op: - batch_op.add_column(sa.Column('starred', sa.Boolean(), nullable=True)) - batch_op.alter_column('path', - existing_type=sa.VARCHAR(length=1024), - type_=sa.String(length=255), - existing_nullable=False) - batch_op.alter_column('size', - existing_type=sa.BIGINT(), - type_=sa.Integer(), - existing_nullable=True) - batch_op.alter_column('uploaded_by', - existing_type=sa.INTEGER(), - nullable=True) - batch_op.alter_column('uploaded_at', - existing_type=postgresql.TIMESTAMP(), - nullable=True) + if 'starred' not in columns: + batch_op.add_column(sa.Column('starred', sa.Boolean(), nullable=True)) + + # Only alter columns if they exist + if 'path' in columns: + batch_op.alter_column('path', + existing_type=sa.VARCHAR(length=1024), + type_=sa.String(length=255), + existing_nullable=False) + if 'size' in columns: + batch_op.alter_column('size', + existing_type=sa.BIGINT(), + type_=sa.Integer(), + existing_nullable=True) + if 'uploaded_by' in columns: + batch_op.alter_column('uploaded_by', + existing_type=sa.INTEGER(), + nullable=True) + if 'uploaded_at' in columns: + batch_op.alter_column('uploaded_at', + existing_type=postgresql.TIMESTAMP(), + nullable=True) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + inspector = inspect(conn) + columns = [col['name'] for col in inspector.get_columns('room_file')] + with op.batch_alter_table('room_file', schema=None) as batch_op: - batch_op.alter_column('uploaded_at', - existing_type=postgresql.TIMESTAMP(), - nullable=False) - batch_op.alter_column('uploaded_by', - existing_type=sa.INTEGER(), - nullable=False) - batch_op.alter_column('size', - existing_type=sa.Integer(), - type_=sa.BIGINT(), - existing_nullable=True) - batch_op.alter_column('path', - existing_type=sa.String(length=255), - type_=sa.VARCHAR(length=1024), - existing_nullable=False) - batch_op.drop_column('starred') + if 'uploaded_at' in columns: + batch_op.alter_column('uploaded_at', + existing_type=postgresql.TIMESTAMP(), + nullable=False) + if 'uploaded_by' in columns: + batch_op.alter_column('uploaded_by', + existing_type=sa.INTEGER(), + nullable=False) + if 'size' in columns: + batch_op.alter_column('size', + existing_type=sa.Integer(), + type_=sa.BIGINT(), + existing_nullable=True) + if 'path' in columns: + batch_op.alter_column('path', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=1024), + existing_nullable=False) + if 'starred' in columns: + batch_op.drop_column('starred') # ### end Alembic commands ### diff --git a/migrations/versions/787468cfea77_add_company_information_fields_to_.py b/migrations/versions/787468cfea77_add_company_information_fields_to_.py index f18c8cd..2ca8683 100644 --- a/migrations/versions/787468cfea77_add_company_information_fields_to_.py +++ b/migrations/versions/787468cfea77_add_company_information_fields_to_.py @@ -19,17 +19,31 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + inspector = inspect(conn) + columns = [col['name'] for col in inspector.get_columns('site_settings')] + with op.batch_alter_table('site_settings', schema=None) as batch_op: - batch_op.add_column(sa.Column('company_website', sa.String(length=200), nullable=True)) - batch_op.add_column(sa.Column('company_email', sa.String(length=100), nullable=True)) - batch_op.add_column(sa.Column('company_phone', sa.String(length=20), nullable=True)) - batch_op.add_column(sa.Column('company_address', sa.String(length=200), nullable=True)) - batch_op.add_column(sa.Column('company_city', sa.String(length=100), nullable=True)) - batch_op.add_column(sa.Column('company_state', sa.String(length=100), nullable=True)) - batch_op.add_column(sa.Column('company_zip', sa.String(length=20), nullable=True)) - batch_op.add_column(sa.Column('company_country', sa.String(length=100), nullable=True)) - batch_op.add_column(sa.Column('company_description', sa.Text(), nullable=True)) - batch_op.add_column(sa.Column('company_industry', sa.String(length=100), nullable=True)) + if 'company_website' not in columns: + batch_op.add_column(sa.Column('company_website', sa.String(length=200), nullable=True)) + if 'company_email' not in columns: + batch_op.add_column(sa.Column('company_email', sa.String(length=100), nullable=True)) + if 'company_phone' not in columns: + batch_op.add_column(sa.Column('company_phone', sa.String(length=20), nullable=True)) + if 'company_address' not in columns: + batch_op.add_column(sa.Column('company_address', sa.String(length=200), nullable=True)) + if 'company_city' not in columns: + batch_op.add_column(sa.Column('company_city', sa.String(length=100), nullable=True)) + if 'company_state' not in columns: + batch_op.add_column(sa.Column('company_state', sa.String(length=100), nullable=True)) + if 'company_zip' not in columns: + batch_op.add_column(sa.Column('company_zip', sa.String(length=20), nullable=True)) + if 'company_country' not in columns: + batch_op.add_column(sa.Column('company_country', sa.String(length=100), nullable=True)) + if 'company_description' not in columns: + batch_op.add_column(sa.Column('company_description', sa.Text(), nullable=True)) + if 'company_industry' not in columns: + batch_op.add_column(sa.Column('company_industry', sa.String(length=100), nullable=True)) # ### end Alembic commands ### diff --git a/migrations/versions/9faab7ef6036_add_site_settings_table.py b/migrations/versions/9faab7ef6036_add_site_settings_table.py index f623d8e..d2f3564 100644 --- a/migrations/versions/9faab7ef6036_add_site_settings_table.py +++ b/migrations/versions/9faab7ef6036_add_site_settings_table.py @@ -10,6 +10,7 @@ import sqlalchemy as sa from sqlalchemy import inspect from sqlalchemy.dialects import postgresql + # revision identifiers, used by Alembic. revision = '9faab7ef6036' down_revision = 'ca9026520dad' @@ -19,35 +20,35 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - conn = op.get_bind() + conn = op.get_bind() inspector = inspect(conn) tables = inspector.get_table_names() if 'site_settings' not in tables: op.create_table('site_settings', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('primary_color', sa.String(length=7), nullable=True), - sa.Column('secondary_color', sa.String(length=7), nullable=True), - sa.Column('updated_at', sa.DateTime(), nullable=True), - sa.PrimaryKeyConstraint('id') - ) + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('primary_color', sa.String(length=7), nullable=True), + sa.Column('secondary_color', sa.String(length=7), nullable=True), + sa.Column('updated_at', sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) op.drop_table('color_settings') # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - conn = op.get_bind() + conn = op.get_bind() inspector = inspect(conn) tables = inspector.get_table_names() if 'color_settings' not in tables: op.create_table('color_settings', - sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False), - sa.Column('primary_color', sa.VARCHAR(length=7), autoincrement=False, nullable=True), - sa.Column('secondary_color', sa.VARCHAR(length=7), autoincrement=False, nullable=True), - sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True), - sa.PrimaryKeyConstraint('id', name=op.f('color_settings_pkey')) - ) + sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False), + sa.Column('primary_color', sa.VARCHAR(length=7), autoincrement=False, nullable=True), + sa.Column('secondary_color', sa.VARCHAR(length=7), autoincrement=False, nullable=True), + sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True), + sa.PrimaryKeyConstraint('id', name=op.f('color_settings_pkey')) + ) op.drop_table('site_settings') - # ### end Alembic commands ### + # ### end Alembic commands ### \ No newline at end of file diff --git a/migrations/versions/__pycache__/1c297825e3a9_add_user_authentication_fields.cpython-311.pyc b/migrations/versions/__pycache__/1c297825e3a9_add_user_authentication_fields.cpython-311.pyc index d248a1ed4a7d3b8d9f4c92d71aeb4ca204c498ac..02e294787a2fade9ebfe6ac2a86d814625ab26ab 100644 GIT binary patch delta 348 zcmdlXa7=)2IWI340}upmv(3`2~BbJ8OGtJ6P_DNY8MY=sU%?gY$-<)OA6vOM+S#1$C|n>U6L@ z;1--Ac7a#0=Ql=$b3wf6CY$&}TV0%%(_KJWlL`G|A(vr*# z#TV49FREEzQL{dfdO^VFqJYm80UwA0^`-SjODs1yUr@HVsBCdX+2Vld1p&{C0-jd{ zJRvId*BY&{+~Isd+u@?N!xe3Z6DAh~0xk*!ToDKWD!3w`zJleVfbJCmT`*61f%`=P zoht%5P@dOC0sSii`XBi@c=^6C0ErK11TP;0hv5ZwgAZH`JPJUMZ7yS*$;b^mutR`vIWI340}wn|Yn$Lw*6vMGn;~9I9ZR^bGfl z94c2hRG>VsiyZ1#IMhG#b8vEfVE_^z&sc&1B>TN((VUh{+lpasYyU BaYz6F diff --git a/migrations/versions/__pycache__/20519a2437c2_add_mails_table.cpython-311.pyc b/migrations/versions/__pycache__/20519a2437c2_add_mails_table.cpython-311.pyc index efe9953daa44da55318dd8595cac558386de577e..64e58745030a0673680a9b1a1fa051f2497a52cf 100644 GIT binary patch literal 2580 zcmb_eO=ufO6rNqlT1lRDY*$Sh=Le-GKS~qZab#O^8bfTyLHTh@l9NbTR+^2x?rK-v zU8QwMs1CUld~j)L5^%r<*`+uK(NpLt$I{boS*RHZ6iN@isko<{`c`YnUWb$rGVHv4 z^WK|p-t4^jq#t=cilF`W^ZA*H5JG>sgJxs5l+7tn9wLIWh%kgzm?E2H8CMS|fou@o zK_yUZ%eH~7EgK@CEJp&_F!TuF9-wTLgh95Gzzvj$+?^E(5sIR$7=kJ06e$|LF5Qt0 zSySVg$0!Z z;{)l@f#m4fbYFS|tY@Op4R-?xhO$~|8eW{N8YL-jQoM5!ig$wNxAxq4b%6{(->idt zh)ibNIor}#!MN6P+(%|xYk=;dRft<_#olM`F-tDuD{U7FOPG7?9cF>ifAOsvY)&MM z+1}I!?B=qcyl*&8E-3?$u3FwSx2|`9)~agKRbWVW zfmsC_T5D1f@~yBP+X=Dn{ckL8)&*hxmAlFVK6I}Eg`pdbo`_A;wgyj8Rwh%xA7Qnu zC@y8uh%V*jk}Rp_#t$$Ld?7_r3+4>vjB;)kIA-Hlu+v~pBXcxln4(!WHe#+Rns2Zd z5k&JQL<0n9wB3}7B?SmgkO{1#neuJW?nWA#(Fba`Ke>*D+ZK1w<_^9HN9XrE;$Gm6 z`OE@&GQN2E@zuqvwIK_qZJc&++VgzAGFVO5Cam6+-J5cHQ_mqFW8;j2GhTqa(p}wO z>$Q#y+ee0-Bg4<%x9}w!UvlszFW~l*++yLeyeQX>S~z9nl!H^AXJ&=1Mrz$wJZZ<1 zPCWUnY~hPGzUbhKUVySPUcIt>t$OX*q=hfo_=1BkY_ED?`B3%HvzUd)Y&_=RG0#(6 zxn9jK->TkvWzOu%ht-qIr>dv?a~#~elwG=7J6Ahx<8cR%1CDF^Z0Qqg__8&0#m3VP zp5C%f+Bo6h#6SD_Nc3L>qP|N6Q1}ph;Y~Ojly^n5xrgue%{~yX`xPaO|5keUFu_ji zE(Ir8uhOGL*GgU;|Ah48;L(qQpb?^dse1MC5sXhkH$DIX^$`p`xVCWI4)!>~9;^8@ zrY11u1c7LIL7<$dNX49--&)4_LJ^hxj8vS{djQ6}S7CkYe+uQ@<%I2FP8Zeui~!sq zDF%%asU)ey5Hz(>t-70%e$o}Kj9-R7E^4H#NMrh0aJYXEjITk|0}R8|*$@+~BUf}F zW}k)j?tIn}Shk*ZblCDg^)SLcmGFA!;R?Ur83Vz0RigD!jDZ7di2;^5P)DzdMuPtV Dg6cJn delta 1099 zcmaKp&rcIk5Xbk&>~^=LU=d?CE5f2wt8FbLR9meLKY~$9h8=7$N zVq)`3(k9!JiLUX&k(=>9*q6M7gv5i1p1fexgC2~pU9BuoCz;vVna_9M?3+@@4}a?` zpU=xs^NgitT7+V2fK3)p9MvEz=t5T1`K*V!q>HOeR@OZa`(;Ax0qPv}UTDDO>G!AdCZH5(uv^+mOPLB9L-`x$2O4 zwK8Uot&iA{z>px2_;;*Y=`=gnJ8Xz!h!coAo%!l@Gh3N3C)}D9`kS-W9`jTsY=+$; z0%|#1&RFNI2!hmWcB?#YM~CdlFosbAqkpO+7&HRf7sV%t-xwOU-NERlmwbnM z!)oi`QC>=(_0TND)%UaI)s4da+e?#EbJIo_t=DyiMzbwhFFahx8I$_7(M#WhXj9U} zZkmN!&@bsYdl;RR&qZnrt@n4ye@YkT3;Och^hF~=5xQ+=aUMOB`w^A{r`uRMa3cgc MR^4XyhWaqS0k0wCH~;_u diff --git a/migrations/versions/__pycache__/25da158dd705_add_is_admin_to_contact_model.cpython-311.pyc b/migrations/versions/__pycache__/25da158dd705_add_is_admin_to_contact_model.cpython-311.pyc index e04d7df4c586beb86b92f6b1a57873969946ab2d..ef34f796df4c90246ede4cbfa7c76ef61477cc14 100644 GIT binary patch delta 271 zcmdnT^M;3aIWI340}wn|YnzcVkynz@ZKArIE@KKy4s$MR6e}Y`3TqTw3R@I=3Ud?( z5Ob!mw=hI;rEmaA?iA)=22IY1X>Ht^jJMb`^NI^nlS?+fxx>gR3N%t=^I4`wMh^}k zvxpN!a03ZV<|1Ygn-@sj;!Y{bFNjah&neB#D-r^V6f*(|g(4A&IWI340}xDbwaD<8$ScWcHBntoktK>Xg*A#Tg*l2Hh&fW&S{R}@Q`mtd zR|<15gC@tsqPES}aK}oyNpXXtX0@x% zN)9#()ghOH4=I$U1{qvPT^Fa|KSe5nnt?!}^w67%dkQ`D&FaHef}2A;%>3rfdo#az zJ2UU?PnxD8D35J0s00IsiSHJQg*Gc65E5mMQ-~I5Axl}bNLj&jUDL7MXvxT0 zR8?=%byFy!%ZsUK;zo9oCa04#can*=g}R{4CGR9>2qD>-S#^O?qeP>N0AQI+B*!O{ z|?_(>6>z{Z1`N+ zLg&C1>Yfjg^Ab_>(jL6RgKn6jz8y~H24HUZf9HBBKyVY81o}Dmz;@8HLx7`OUW-Lm z_^^m#y&c8+sVL@(XE4bUgc!EVmL;N^D`l55-6S063|n6}>0Pc0sa&)igS2HrEn1>H zB=qj8!RV&P6*tMIw;Y66n29&aah{g+tZ5S_LVyp5p_e{%+bB?%M{-_LXzRG_8a%k* zSmlDvm1Vm`^OSMrL&veGVe_FShfyltfyaSf|X(Zxg4}jBXI3pK*k3uj9oHIJF|s z5X#;J@*!yM6eN!-`ZKI;&3&ETN>>-33=V(q|3>>(t1cgDmwwZ({Hk4PXjhxs)#}pk zN_0P1SKQqdVE!+O}1*4nMEs zxdxtV;<@&ku^;6}>JO1ek;8HwryDrk#OW7VuI;ee=60o4Iiz(w-@x-tJP&J{_^sW` zyWxFv|BK!ZXX!%w?>2C~lAD>NF?ofFTosesPf;bzDYmcdXT(Op!rlPjA>!P%+qd_Qm=4Xo3;?(158nT@{_3@c zf2`>rt9PrnHWuNEt`jGx>s&D`_(__%&OYv!mSN>qX<>t11fKTG$E@?WH@BKwkkGCPYNt0s@%E%C{Xtm2bH zS>o9^ia?<>`4&qA`$~q-pa7d3${JQL31kQZaq)K`(ZKMOg{{T^f{5;2AnnnL2ZHHi%weF~7)Seuc#xq9{o|j&fn37r~1LP}D&SO_%14(OgPoBoE!YDBL0K0`QC}hF% zXxe{q*yQG?l;)(`6{!G~FamLL?qpRCBlQm)3_MZ|95)2y8hCFAhyV#*!3M4mY&?uW QSHcN}$rCsvSU}bR00uF&?EnA( diff --git a/migrations/versions/__pycache__/2c5f57dddb78_add_room_members_table.cpython-311.pyc b/migrations/versions/__pycache__/2c5f57dddb78_add_room_members_table.cpython-311.pyc index f41ecda479e16f6829316f4877d7619ad8f5d4fb..6fa42c65242544ccbd4ebb34d7c7c9c7dc0dd4b5 100644 GIT binary patch delta 1478 zcmaJ>O>7%Q6rS1tUxy~ClhP=0X>o0!riv8P{0dRmh#P999^63WcuZojz1FUiB5<$| z96<8H)*=z4BDoyWlpm=QmtMG)yB$_av{FPbJ(DUGiYgAg+1RFbfv1_zZ@%~5%)B>m z{o9G}{k}W8t{{+=pXOID33cBnj@QqRU%-URvN=A%V?_9bK!k)y*n|XACgSHPp%4jB zCG0g6mg^ss)i8F&Ox`M_Q^oqDNv6iwAMr0vZo$q!(Ct0hKt;ZzBUD0L7_2alWdoOR zgSBt-!`J)57=la8IyS#6cAXLWkn02zTvR(c@Ipr?Ob;*GH*omnfA{2{_tc;Dlo7Ym$)CbY}48c4c2lyJTK*8TrXpspzb-Wc|ovEr2j$JOF z%%$(5Fyk_ji!PfovKBouVDGSRm7gke*^E_88M(s3C#Tm6D`t|UBXe0JmCRZTpmdDq zAjBF2sGz1Vc04w%FRWU$`e~Oq1Uqs$(=c+blChQwW@bHEOy9+>V5L^mxnx*3S?VIK zq>D?-nfwSbX)^8rT^Ezf+4K^|BH4M}G7>Zg!k5s)n`{jIfz7pGiVPuo5 z>tE@WclLDut{&XcgDpMe=%Gsdp;$h-dA%u~g|ROw)qzbP{gG?oZ?E1;e6x6K@!plD zG}Dr19BJl%EsiwNIMq(ySxRg7<%M^7eE~nsTJ6$Er}4l_yA$l>-k3(ZCf9 zm2YHrgR?uq+57QU@Uj!U3{=Y(b9}MN+k4_r?PgOPhq12@IQp4J@ZNA!kGAxvqel-A zmS4Xg+S7)2wZM)RXpFVAh@(ZCTI7HQlV|tfG4*_c%01*i=05G{=%|nBU$RJ=fIC@( z@CXn5{@678V491~i@zcam;$ydGHA484jGJo&hjEw>C2gZ3McK)gpm;ak258Ju;}%c zc?NV>NfOfT9rHBx7_)y7M$d+^c^+04{hHcsArs?f-fMd^0_P>^?6&oAuMS}-Y!@!_ M_@x8%Ja`BE4X4jyg#Z8m delta 891 zcmaJ;O=uHA7@gV7?#^zSkkq!;G_;9T>ZS*6#kPu++ESq?t)L(VA#5{?NolfSvQY#j zIrQK`pg`U3|ywg@{fLL1F{n^ zbc{ep7Ju2R8Bcv8(jPoxU!ZZcu~Yun>HFO&vl*%DFXo}t1!WeHTG=}(+V8;nu>j1d z^_gG-UTRMz0ABFkt5e`ExC53j<9Cw`FMI15>2?vd?aT^vm3%T~WlUF3=My=azG*s^ zp;2)qc3i&1?#o?4?!wcilT0P-Twa{YuAAO=uvnvyehAwfeIR^qJjS^Rn)O?ZQ;VQvD{HXgH<%h-Ho`YASae?S5RLS z^=)|-S=k00Y68Cbf!@SMw3cG;YHAY)KH%^M4li7<;8+#M)^V)nfpTvR)L~0Z+xwrt zghtcO&Q2rx7ng75kMZVo+gRA+T??bJh`QDd$0DyDs8Lw-a*Z|#@N+nS#gJT|S#a!h zHc73Fm362lL=mW=?&d&S`RwW@A&I0tTgYT-KsbVeRY#|$E{>m@bag`QT*5J@XDxb= zE4w*G=pkX!h0u444OhEycy^$`8ESB9DKo&UQ=|)-*g{3ncv%v48H9rV3yI+ diff --git a/migrations/versions/__pycache__/3a5b8d8e53cd_add_rooms_table.cpython-311.pyc b/migrations/versions/__pycache__/3a5b8d8e53cd_add_rooms_table.cpython-311.pyc index 27c05870450c0a9a08385b05ece931ea71df69c9..5261b435bd3b8ecab60eed4de866aa6c4d70af4a 100644 GIT binary patch delta 1078 zcmah|O-vI(6rS0?&i+g(1c4T;{I#@^rUru%Xqz4gi6;*d54|9;wV=?F?V=taG{%bw zF>S^JCXj$Bh|xoj#Jl%hvc#qd#EW-~o;*2AX|)F8%f2`7&HLtiZ{B1-Igebu z8L!lUmTGAC#a+n%?Ne#slWTklJ=RK-9qQ9F3(2YU^kOngj@hNYAY0*PGwF0iJb&GcRuRrX*{n^{-Q7(l zx$(7L>bFwO_R#0bfp0QiAA1>HkLJdYUF{oO0l&t%J7wJV1^W-N-^2k62XYf%9XNmA zaCDlE&SNC4H*E;^BIf(Im`&-8vZ?GZ8)(=>!xkE@X8c>do5B5?h9_)#!j>m|;4@I% zL~C&i#jA+WZcDL!$6a)nCJi)dqEQQtRx^XUOi|v!MSQ>+C~Bgpg`$5l(vDJ8O0?c3 z8Qnk;6Gbc(p=T^~ZM$pRS#pf!0T7r}a=%5!KAobV{36liC1{1Ef{x5$tqOA!9H&hZOH7BlMdLNca>X~O=2vTNkCFf>vIUZe3lML_Z7P}$|p;j*ih8r+Xf;t?PLU;wHH9^bErmIX9f&zn*jgB(I8)ex zBv%S^FoPz?#G;CcUyYa|m?m#vlTj;S1(^W>Syn`$$y!%*|>{9Au_p-rGR}U!)H+7Ojcxdsh0yXgn_vDIgn^zc*?@o;y=OdE|Bu< zNSW$1#cQI^6rUBQ7g!80vKU@rF@(sZO--7TxuE!hnD#|6?JHv18&WT@*j!|>xx!)t zQII<~XioUd$T^W4L@uzHU1Tx4!eR!I$(idk$9tyl9N!Ht7g#LoFS1x(VX;I=dCl~h zuvh@~Tw#%(5i`SYMdS+ai!4@GSgfF8E*Du8udpb76y#)O z`@#SuKA;jsGC_CPl6F7WsaitXH7sQt&Cgr3SNdv{fN{eKHtXrHZ z`Q>@(MTse?MT$Va(qsvCMK+L0n%tA^*;N>YCTFr+=z;5$J9>A;-ih^??DC06P!> DZ9=oZ diff --git a/migrations/versions/__pycache__/444d76da74ba_add_notifications_table.cpython-311.pyc b/migrations/versions/__pycache__/444d76da74ba_add_notifications_table.cpython-311.pyc index 7af98d04e02a1c335dcf8329b3be005f635fef9d..3e27fb560ce899eb09399cb13f911e4e672c379c 100644 GIT binary patch delta 1169 zcma)5OH30{6n)d_bf)c_mH+|bFAcPmQjtVKk+uX4nw0P{7+h4PO#8|&{pidfkwDso z8)FwVV}cq?SOCTViHRFFCNA0eMkmoUA#o#Hzbh8TH^nx5B=Ke5&AD^WJ@0eh{cV3% zZhOJ=7C?sebzrQ@l(W@P137o?1vzCZ4Y359LL6d4W<-Z9WLgpT0E8ei z6U!s|I`CMgMdb}uoqIIFvExbUPAn?tetczYM7>hkrfSoWps2oBao7o<$^5x(0AL=- zR51X+LbhjD9l$q{?M|qFI?YF4gm*e$jbuG$w~5<4GjySC_Zz zt}I02v2apI#3bbs(?l^!igBksblw)GNgSv#&dy#>>@Y;X=ezr4`>v}d7b!}xX*!(J8kYOr?;k{GV?te;(L-x$E& zPSx9~c{}m7K|CD8a72Y88XPIG=2FYz()30-cKcPgUvv96ui#q(h7lD;G#J_CB$fx3 zLa!w3@~JML=JIW};+w;13lRbY2Obq6$eU~>@PJ}4Al?$(@bsRh#>?<~|JjRoJh={_l3qZ21L<`BpNOyO0K4Be@z; zZ$^(z`CxK790cxGuR^*T7vj;eSmOQ}G%mzR3rixSl(TJ3dK(wYA?nYgkY1?P4(Cs# l&}2N;A)X@vy%nXLGR3x(ox)(>r@Uk@p0HD7ONUKC?+c9d1w$uHZCcZyv62r4sTR~ESc^hxO*3FHbb_@^3{Fx+7e=uQ zx8YS3X?7{P%+h6cx_kp~A%eINanpsrm0_F3Vgv~U=;}M}Esv^s1f@;%5RnmCXPSc^;)*02QNfccgzraN7&4*8ri`^F7 zRKt({u;Z)~jd1}^=g?(VK2{ej@qVoGyEBa&*a!5JJ3hHTQygFl=s7=q0Mq{8Ovey& z7J}#|?>j)(wTC?&*#EBXx*L7vLP&)XRzRQl!(Oh=?!K8}R_*9B%m|S~R}2YF32o6~ zSdO3{LX-tGCWae^)e6IDfs4WiyH>q-=ax~@%Ekm;2WZwjRPhn>1;q8Mcx37$9WOoA zo}J&AYtC=Xci_z$hO`N30_olv_8i@cwa;{NIFvF&DH2M(6Y$av3`G-)1d4ruYRlMs z&}sOvk}#D7Q4-xWzE;4XnxGO;`=m-Mx2e9a;b7bh#z`>VP2zU1CvomNhP(-R0<(E4LSXd8#Vw;<$0yQeI77l23|SMh z1hU_~k|6$KD0~})o@Eg?dT*N;4O+(eYj^dMzPwVd+&`(^F6rgvdd&bNOR1>!QG0F< lnf+UusZ_N!y?oAyQi|2LS_3_n66mdTT6VCs=3eL({tHY*!m$7V diff --git a/migrations/versions/__pycache__/64b5c28510b0_add_room_file_table_for_file_folder_.cpython-311.pyc b/migrations/versions/__pycache__/64b5c28510b0_add_room_file_table_for_file_folder_.cpython-311.pyc index 3e0ce3ef1f796adbfc1b8e93b9bc10db2018b2cb..80493716d5e78aaa427e3389bc4d58794496e01e 100644 GIT binary patch delta 1270 zcmZWpO=ufO6rRzpw12abBOKdt!dldc;&q~?k>yfTOQHV5X#<6%rBsPAvPMZ1tlf0A zZZ9@=pqGLRcE<;&I3Rd484@nn@e-bsWVb!$LeF}+nM)$ z@4flkt(^Mlbohy?%7EHOyXm{X2|*b4cC>nGpBC~P=_ZH`FD zR$4(cfk^rSiH0&FwGp4S2&Ij9+9K3rghZ#>O)he;3P)(+2Ye@8bmYj{(LS3K$5JRX zg|5CnKSYN4zBW&;&7+d9`QdZn)~awP20xyB9H9G3ThoTY61T`zBD;U_8jN>XY>R#I zPQjj?D;n5h+vrEw(9X@x7iNuIsZb_LXd|KXKA$%Y!sD(dRHU!_;mD--)2-JATnx}mOIeXe%>rpBMCaaSGi z)Pa?$KZNLJ+!11~5Zf2!)ySr@kHV{0*YKmUt@j^Z+qza8cF>56Mm#jqWQse{YVY=$ z>X~}bK^YfiJd~l#G7Y-@Xl|?cUD?rwTy4nHhUx_eO}J>nLle!|roeWzl&hsYEmdD| z(4>ndJv8~cz;d*tt0g@xS^wBU<1QNa(D;#{^w8Wg>%4=~E=qeS-C&m2?(Mu$9oQbM z4%Tc3jk;*mL!-^0($4j2cKcTKR(;YzV=fx=(AW`kb9<&bbG(p;`YWGSKB(!n(=NK= zp(|9)d^42~YsK2l!wE4TU7+qEJ@U^fRgzx-3I_}b7B^1p$z9V4ZZE-4Ul#UKaQgDD zB%Omdy6G`lJq&soL>aJaG^Gc8HMd}!MI&z&N(IBV*l)oSDdu6--`3VWCGm{RIKa?=6k zH;XQb&WS<&nNjLhn|Ve=pEy(L6}bnfvrVYPKXKC zT_YcX_*FrQYITcnkyMfw#(QLphV zkE-*{=o_?2mAggM$_3Fjn9+T%g`+m8T-{-kyG-+vN?L|K@M-G-eQcVWP0laP#2+ST z;(a1SH$B+6fM?@0|pHI17fLoI$i(`f;t2Z2$mx&dsnla8E@8`PioMkLyrMH zfkcK_1!LU{7(u?kqDYGr>#c~@<@O^3cyH6IO?ZILWdx>)6Fujx!OX+ zPQ*$?LPHk0le`2~z~T`~%~RdjJ{D&cWoACUx*l6o9fWYA4U5gCc3`{I%`0jr;mk_> z@!Fy~t1PHp_}hctTfWj3^s>%PJJ83vJ}+r_DRe;nz$R7N_RAEB#g+Bdg(0;c`^f7^ d#L#sqfF4OUpOx+^Qm5kQ=(ZwtR@6Sc>krtC`sn}w diff --git a/migrations/versions/__pycache__/6651332488d9_add_starred_column_to_room_file_table.cpython-311.pyc b/migrations/versions/__pycache__/6651332488d9_add_starred_column_to_room_file_table.cpython-311.pyc index f8b7372e0fdb86aa380d734f0a8eddce2de50209..871bd1d50c3789a6a6ab96919570f59bed655f1b 100644 GIT binary patch delta 392 zcmew%u}qS8IWI340}wn|Ynx#;kyny2Xrj83DRVAs6e}Y`3S$au4qGmJ6g!a37R8am z9>tl$9K{91+$kI_3{gBOoIsK{g*li(lWStpL=N`MyyAk?`?)Q&K)wNMUCHnn$YcN;`-{USH$SB`C)KXV0w@NuuXy6*kK85#au*m-&}3zv JKo)bLJOIq#R8ar` delta 330 zcmW;Gze@u#6bJBx`_W5tQM6!tN5LZgy5gp22X(WnL!AO5YDyh?J$a=F4t1%!A+xI@ zj`!b)ll}=V;^cb`%8f#Oz_k1veTwd&u_f3AB=4N`Y$@n3o{w^kKq7oG6vhCyyAk?Blc~g%AIK`=1rgjp;udF0 zetBMcQDRDJkpPgd2*kzgK%#-+1`9`n3s|Kl@8l$Ab)j2)#f3SEImsERxs`fAW)aKe t16xJxV6t*b#6y_)n zAm&VAZ()eyO5p&K+$qe#44Rx1(-w1UGTvg(%quQPO)i{&pj0|2RzIe-8F delta 228 zcmaFNwv~-{IWI340}xDbwaBV<+b_Dp(eA09i$x zZ~`Pz#0?~Fai-*#=cN}Vrlc0}1Nq`030@EZQliN{*^fzmaut)QF35ba3WzCi1AcMX f6xJxV6t*b#6y_)n zAm&VAZ()eyO5p&K+$qe#44Rx1)24H4GTvg(%quQPO)lB^_cXg*A#Tg*l2Hh&fW&S{R}@Q`mtd zR|<15gC@tsqUoDO7@xDTDgpHhZ{j%1!p06{6>&_y!K36W1Y!z+2tE)2vOtr$h#AC| z1QNHnQ;PBn;*;}pN^|py@?|~?Es&jHxs?o`flLOlzF!tl$9K{91+$kI_3{gBOoIsK{g*li(lWStp1P=DhyyAk?OXkj3SdASw(<0hOt`cf@}nD^dkYFamLL{p8)OCX*T2 I{8>QC00Sd1g8%>k diff --git a/migrations/versions/__pycache__/9faab7ef6036_add_site_settings_table.cpython-311.pyc b/migrations/versions/__pycache__/9faab7ef6036_add_site_settings_table.cpython-311.pyc index cba43b43653964e553b6356ab395eed26925a435..d0281bf5327c9ff9e713481df5d1ba107551168c 100644 GIT binary patch literal 2936 zcmc&$UrZcD7~j2HZjWX5pnn9d+FXJ5dd3z?g_Z-16k6rak%poVXLQ-SS>Wp4?m4?) zXxfB_zL@aPCMLzCCT-GU8faqT3%>QuKJJ=LB$G6n7!&)3L0|ghH@n=yqShKUPG-KH zzu$cGee?UxelE)r2kEOX`(}zF$Nj(>l@!^kY>q?a28X#Ehj|>)`BEeo;aNSZM{@#v z1wC4-$<_FMHF~Th=0vE+a&au?YH>6tL8-&>t6UD@T97i1Uf|NwCDM;^(kj}TVrjNr zG^VYjt>$%2lE$^UqE$4FMW zwd5d(OtPcBqw`pM=dq5?WXFljiLT7a?&DpjPo9F+(qne0G*2UDc?>>c(Xh%|!G@|- zHZ6OaXx4{1MLV~oXy;aiEwA{WI*?H)o9*DN8=TE=4_>U+m!Wf|I&g)vYpM+}>%yx592@`ujZryt`)QSES1IvOntUwP;tnxwP}se*ae#aT4|i&ZK7Dx=>GG8og>=(fN5AZQHzF6B}~k6 zpy*zd3Sg>1Yqt<*f*OBY%VK6FlgTG47CE>dKiM%khE;oKFANfW; z;>t%o`RKyA@5RQYDMxID{3tFh)-TmRLW#wpYxuJ>H-|qRy*c_tr-Qm()a{|}V8pyj z?#!?8PAcQ3GF~e4V8TJeE*kdGus^|ROx@qR`oh{FC*A9&d%bk;1KUBPE*kaFXrMyB zd*;r_?d+ZG+Mt8_UDWTPei-pk%dJ5dr9G7Xxh_^K{lbCRVB*&VS0i4{I(wU4p~Vwg zoJ!t=vvLI{DoKV4^X}&4|HV(={WtuCh1Hs6xW6k^#tWgmibxy_^=~tjxEc>*5(~h3 z&!+RwIO?D1lcsKnc=Q`HbBrKVdoS zyDdITjFG)CPMGx*=h6`>tFyLQG=NY_nqd=W9bu*rrimn&XkcOw2)Zv!S4#N!PfOvcVW5l1poQoK%mS>hV%N4?CTA6$eeaXwpNI{+xhI4y>JU(tU2a z&rA0`eA{_Xbx__#c@O0SMf%-gul2Osn({K#o0e_?uR8$mf78Hews;-st#X|77NbvWh>V+At zG#|u-;gjy$?mdo+u%KXDL0IBs>qn2u%=Dl~ys delta 1251 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 delta 253 zcmdlY*e1xkoR^o20SLNXEix`o% zQdy81U&I5F23e@dQp5~m3ruccQ&JNLGK(33ghG)dki5m2l3$*eUX+-UTBHEvgDffD z%`jPuMSAjMwq12KczG$)vibjC6xJxV6t*b#6y_)n zAm&VAZ()eyO5p&K+$qe#44Rx1(^hk9GTvg(%quQPO)l9i$jHIODh@PLXtNx13!?`I zkXghDBDjHsCUX%ph|LcqZgHm+<`szmMT!}LghG)RNRl%pzdSF!C^03q zND9c8ocxMq1tZVo$*d}Df;8&C<9dh041(GZvX%Q delta 224 zcmX@WJBgQfIWI340}yn(T4cXg*A#Tg*l2Hh&fW&S{R}@Q`mtd zR|<15gC@tsqSc!<7&(|&#ejMRH=8oIFnX{9nME8R0%W2la}hI$%?BiIai4{4_v(E0uK-vg8n)y8Q zec$}%=XrcHPi0x+XgcxZ#hL3O$NkP4wIpm;wyx01cO2w09OR*(^LZg7@T?xvLzyuB zhV@WBl8IDx5j~n0Ga{`=GchP;nqVj+(b5cK_qhy!O;pM-bd^g=3ttaHn6R;G%^;Y# zt?4LXtJ6A?q$}u-W@)C87#m3?R0x%ACxtmFzEjl)S*gVN^XJa=_4S^;Z~^v9!x*VH zN{mpEO7!;ho;}^uclu0!;!IDfhvlxGYLcWE?C+915zN9A{fL@j6;RfuRjFWFb`B%! zOPw5g^WX&R95lN_2rCku4-DC4kmco5NSucduxz z0kn7J))qjkMkB`WExGLrpzX$OuRD2v0BtvJ|BhBaad2ObhX-=}8jY*#wb;r9Mrim( zsBiloeOvz%7t~f93c)k8)<(I|;wKujxvSNZJUB(b&X`LC4UW>-7&GQ{oyBM(V$;kk z8YE#u&7&88QwVC0>d461GekDAmeUMXR|+a^hVA(Rdch`;ge`3WT_dr)3ANiAf~0w_ zpqna0P??_J(NJw7L8K$wH`ME@y&%q62zP04p~`_)k}_sNiNtcqR;D!rVixmAD{EFS z3x#pC2*_4%2VX}7OC`}^Q=iKlL>x10ltY+Aui98MawIZJN!cXEE|P0n9+CD@6C*8W zjHCHs)3E5|XogMNKf_vH#q$AeGDN~z(=bTW_N8J{+$s;tVmuRx#LM1pwNU8JYdNgi z^rEx6?;y->JgfW7H%?b!o``b=>JAa^q#y@qv3{kuM3MWWSzi43n~RGVizCn54nGP% zl)sgWV;l0JU*wZN%O_pA(~~=kqrZs9n4i+ny-YMjq~n1ngdcUNO>UTTV_{}l{!~Wl}?py2c%t)_CVUVCK z8!NX;w<;8E$OS_l81gOp>QL$O%0y|RLVrKdhgrr~CQFl*Pj>e4!13jq%Twj+UczyS4mjSu5YD{}@Q;cFv03mB!VeryQVZ^&f;2(%E5qMq zr)irN>pd#yE(=HRPd?~!!$-aFQKy!xU6U6w|1l2F!@! zkC>?c%gb1r2AMe>4dCDhaK+F&b+}<&34}4;!ZGc saHpJL-i&hKL@~C}7B9*hZS7RZ`-;+L_%Kfww=T{K{IN~$by21K4}}?y%m4rY literal 2672 zcmb_e&2JM&6yII1?a9W55CSa*iXo(xBd|k4B4bLR3Pg&krWJ55}bUj=_F~Z3p!Dh`{b!+ zX{M2!yPHd@7#G?`1#VREjaoLu$|a|!Ca+CQj9<@Y@eO5$64fTjyTEeE@v-siSH~u< zUb~UJHkKRXB|X+6MS0C5N{LJ|EA#MCDyC(ZD6ziM+39!B$YQ-S727M)`V0XNLEW2{ z`SRFeSNWvV#-bhWk#qYNVJRR71fMqHv%TLDaOkDH31hZ9;{u~PQXCG*kBSxvpmqGm z(U)iwBHQjpcUb@W{&z&>0L1?P>|-o|c+eWg54j`90%&lxe0pnt4~up@fOb^h1_Ef& zBl>nCfOe2?hdn8S0kngB`)4$?9}zxL67k8BxCyCjdq15Cff>5CVXz%Kr0wy4#qI0( zAO-Kt<^cEt)h9@q0;I)L^DNez?wF+ES;$bxsOmaTk1R?}vs}T1qzoUfnX0kmlsO?znC*Iaoa)s>A{J=TEm17o zGmZWZ4ws!-@88n4zI4$|58VW8E<3+|ypd|0?Zm}pvWrGMH1hj}fpFvx0a!E0=q1>w zBGeA?aZSbbG@0K)A`6W+D{-IScH7ov+r58conv4!Zi}hjiYr{V-A3>j2 z>wRGUarx|d+LbSQ@vzL1pgJPUR)&QC3=SApX>_K zSOeRlZBd>u8KUi<9~S366uR97sv5<`0we*VTl|Vvh=HwwX|zr>7%Q6rR~#dw0FNPDxxGk|vF##KlFaP!JX(PK4uCXnQ~*2qat~*V)-72Jfyl zYc~=&*b+g2I{)v(zR7NwO zX5PH_&G%;B{N49^IQWgC1OREbzn@+X`Rl=cI9ES4JOL4xXANK42LbY>{m7r@5t|ms z5D~uy(g7q8lo0y{h>7(}A4xIj@j25j=vuLUf07wyoDY2i@lC>fmD0D`Dk%E8a{$U< z6Ovsr+HDmgxCY8_gLPhKj$dGo?yBH1E(Wn><}$=T7Y`T!c$e$4AqIghZj&J=kkM{0 zf>pN6Zukg)NG&Q|GYR9nbHpC83kP=Jmj9?A#BT}CRrt0f9{7k(4>L6WeP(renGL;z*!Bjdp^fiJ-lxvqBttFR0ac&2+Gs53Q*ghG!qvxa^J#2Ak` z^SsAuR^Fyrk2qy^uJS05$mi^$W*LQ<_XkUbC7eb2nMB^wvUz)kOuC!>B*Z>JpbFfe z+V1Q2r}pRZ+6M=Q2lRB0E7>~sf(5K!(lORi=5kJ7xdJ`Etu54}|MvarW@96Vt$Thx{_R>7vh zBcx&ah92KZ36GOihz$EXa+6hXPf}`ApH0`MtLm@E!s}dJ`9i6l+ihjGk-HO}+KEnW z&o!c{W;8|8YXsFwGpJTy{f!T=uef}a^m|HAQ;BRuuZ3JC-caIACB6rsxCpnO-IYUk zs&O*!StDJoNK$?PJPsX{8VYoSLzY2MNLB)7dDAev7yfC&bBV*{sqK-2K9UD2@&RM37 zX+_}U1m?*1P_m_>l`}Q08@gG3$-(ujL0r8~?TA?imOg{+jp+IZ+ yk&rMfRLbi!_yw}0#P%mnS)AELP8g%8o(-bP4#Gs_+XC99l9bPyWD%5Y!(-!)jFXfYJELs9G6h}Aq=Y#y~4qA?qdS!iri1oAl86n624lmDz@s;m3+ z?d|PNp|IOut@xz~GMpW&!rHCR-Gwi@IeJr)1{b>z2N z&b&HkA%78tZ4|apn7iz8Tvm{~>;c@R!xZ+E%Om%rV|MSX{jzKud)bBVNUONoDn(Af z)po#e&Fky!5Z5}S-Y|UY0t^i%b7G|*-UT{e1A;hc^gZ$ybe`5Q7znsZ?sz_zo=O?S zOq!`2@i007o&Qa0SzgjHNoOXE^mIO%B6Ym8ot7lR9e=3y?k8gvnGFWCK_onlZmPY;yBcN^?@}iX?$b7=gIBe)2RXBcU4%au-n1 L@ delta 224 zcmdnV*3HJdoR^o20SG3zT4b!9$ScWcHBntoktK>Xg*A#Tg*l2Hh&fW&S{R}@Q`mtd zR|<15gC@tsqQ1%8jB$*dld~8-#CU)P2m|qFb|BHfaD#=T!KH|6@(D&23l5-25ht7g z*;T|1ByMr06xJxV6t*b#6y_)n zAm&VAZ()eyO5p&K+$qe#44Rx1(`IsOGTvg(%quQPO)lB^zl51v5@@6d5EmOUPF7@> z**uFypDBm~C{V-+BKScBABf-v5}M3K%pkS^khsO2Qj}j1pPZjlnwwW71{5h~1QH5G z5+F&=l>G9%^rFO+)FK%mUv9EA`!zmjVo?RE001Q9KxF_tj1N&xi=Z|-LaWC~&jGK)As1Rsdt1rZ>#HJOW;L2P~?af>^p zD8C>+IX|Z~H?K$(C{oM_BovCoL6V#)`Q>@(MTse?MbbdN>|`VMYmD5JIXP4q1t%MG xSZIN4152%B_zYw+fVKVNu*uC&Da}c>D^dlDfy^r|m^_ukX!1=CCl(bT7XVimFwX!0 diff --git a/migrations/versions/__pycache__/c770e08966b4_add_email_templates_table.cpython-311.pyc b/migrations/versions/__pycache__/c770e08966b4_add_email_templates_table.cpython-311.pyc index a6dc35426fb74b746dd14c902699ba91ab6b4022..9763a6374972dc5c74c4dd0df87604e64b9dc2aa 100644 GIT binary patch delta 2399 zcma)8TTB~A6y5Oyzh>9QU@(D#2?k=62ML&ffh0Uq9)Tp{5f!J3W!McdF*aFm($a$9 zqy1=w)R2jkM1sgjCT*2OvV>Gwsw!DkA5lJ{-D;&oD@E!@Td7}7)qGU>NoQGqFkjNNk;3hrZ#pluGOLUojI7r0cB^N#UM-+lz-og9vpTO1 z+XY@dtMeLIwbzLMCRYCm<%O&PBh9KuDVK4T|5UFFgd%g?l(72zSn;x!qHa(EAo z(4*H_^#8Ny+%=f|6@UWNKs(R_4U@?TAbO&%B6on+86%=KdjW$yn)(5A_9<9d>R!-6%#6T0LvUH1!JC((Okde8E^ zzv}GK0#R2d>FS>9jVor+?s^KDm4U15diUDkt)aD{xLbs65^R%UTiSDeeR3`ERYa_8 zk}8|z%BBP-!d__!_R6p~%?NB-V`cFgvARX7Zjq~7k~R_cNw80beYq6Vw*qT{c&!Lq zCDV;}S6@?iu>B+%#E~;7cf;v?% z?&j4CIzwg6=onL?VlC)5rWReof*NKFDprGs_2^rsk_;`ZHBX=x^nz|r^K2+-E=g%H zNmr-2B|EscnH1N;+VdRNlydau?Wi&#D^gsx(z41rcjZM|&^2>AC`OOWqqHr%4vPR# zquPdgEFGW(En9Y*%CL{$MW7blx7g1)v8fn@09J|MpPl20vK1qDg$rQ?&ChXs1>wGf zVT`XLrkwzJGq_X=?Y}I91EDFNo5g&d)L2C;1cV^>=SxCkP)%WVVG)_u1OuUq0SXI+ zFGb^p)k|bwl)_M02%Ha0`Gr6@|TpGTE*lh$n z1lloV6z||W@klYS;SWO7yr1RxF+3)B5_z=cu{MDvEaJD4zwPE3QCB1BYEtsQ$)v@W zRewU0yez_D2@cC}IPD|q-nCH?t4NGL7#HEF1V?2!n)Xev^J^c)i^QrWw^ZeptK7+P zaoj7yvl2Wj!?U>rr5k0jvPA6ztpC#zJT1f1X&)&rGjUb6xFp@;=zAiZkl=(2Cvx$b z8yFMehy+JuIFj}SHwR^BtK?kr$W9N=?mZ_$p9Fm}^u2lkwOH9KRW{3&&B^29Sl$Il zZJ3Cjh`ZwDKOXv_S?r&ZdRV!K6(J`56_WrkjOQ3)z)mO6sf!)`rg*Cw;UXKMrGj`r~tLksMmo% Hhx7ag#nNa5 delta 1828 zcma)6OH3PA6rHi}82`Uu<3K|QP-3tNIFLZ%21udhmmoqu3WZR|Gf4()L&uZ0M6|RL zsk&>?BT6ipimHj~tZIoaShQ7EX|kziq_?t~MJjdCRf*C?TUBb`^MDi6F8ZW7zH`sH z=RMEdJHH>i6|{e8vzZyP`ff$8>Z~jFO7^vt#{B^<^3DT&c4E$(Fj`wJS%f(%vIsg$sBdn)(oI0`T$#C{9FlBRPhG% zm99?HIEVJKVi$!dp0|=={?(73(5Y$)}cwgdpl#>opIPpJYP7G!%@N* z(TAKLUDP{?Q!iJJ65z8HPsuPdX0!qwtOb1!jjR>@3N;+F$gJB?)LP*$mtWfX&qV3i ziC;K#jB}N^ImvF#dS=~)KDYWVvIVL&e#Qd2Z>(|M zWAnyKQ8{*XdTu_&QqF1`UFsr%hg_*a9m9OU{0xTWQKh`$G5H<*n7?^qb!cT|btK!N zK${9}7}_-E^36-D;(AK)Hmlxd>}}2o3PeW8~o#mzzZNu|Hd;9sfnhszWtU>ExZVrKn+Mtfb?8 z=qLL=)B+|a5C1_nISVB4ZrOr9u~#735!TcdC2D)Ys;KsEt1F!awT`buHb)~`bnexP z{c^GINDn#-#n*SX+Ou73b%oJ)4ikFaHEf}OsIYh^8g=>5*RBZbK~G)#EtMoK`6<++ zz3$43btKH2WHBM6xw+_i7gC!2RA=VbA+7>ml{ zTylDTR#=dXBp)a*Oo7x&HCAFDm4#_B$qVmF9V8{SQFxicAqqetOreQF1BFI(&ePf+ zqG1b#gA@)ED9q44sgs0x6F>J(@`@DY1!}{c6laAS`Gy(;u#=-oAn=p%0%YeSpf z`YQVB@}AUN@n}4DRY)wf@M1JB#N?C&=r3<)6aBgs-pD=X83~!f+xpWONzC!r;=*xh kg5>C@Ftvm(`r6SQ-+^W?dwh#2!eJlVu*Livqzk0#AKkR+@Bjb+ diff --git a/migrations/versions/__pycache__/ca9026520dad_add_colorsettings_table.cpython-311.pyc b/migrations/versions/__pycache__/ca9026520dad_add_colorsettings_table.cpython-311.pyc index 6129b159388a1bb9164ff4b5fab51acbb793cee5..d0564e8adb15eb2735e7457241a8553f32dc19f3 100644 GIT binary patch delta 1165 zcma)*O=ufO6vt;YyV_l8R{p@YEH@-}V_RAmCr*hWa-|R%Tf~k8rSVA@$M%TC!IsQu zn^KU8A%+l8pkjJRAq589Ey)QG|r)iuF67-z$Aw@XXnFEdg>dgHW6tdk9|Mh zzWMK)nfKU7UE7BO-FD3MHpc8*q4u3dI7S)W35yMPf@Gfc@4PtLbXIjQ! zB;y13Gkq0hC^LX2Bj=IjEAwl*HlHgjW#{bjt23Sw5ox_k{6zx2%g9#cHgzka4UEwD z;B{NZMZ8AD38PJl&n|lyE_$wD{?tB@Aaq&Tmosep_hZO=_haU1$ZKMk1jS9<+V|gT zwLz_m4$t8KD2?}4`Wlo5oFLSqY!J9Cc-?HjXeMo9hI!vi|-x(%acQY32> z+R{!;`05YR8)zsW5ThiE{o)=uq8><_TI?hHC7?OYaD+Y3yilS;LCAC23#*08<5cyF zS$leRKF7H1ZM8|h+B35Y+3DQOVzwZTtHqccTh*AFNROYNN~Axvl&Uh9&*iGdzk|;6 zs<-w{p{mc$*mIYr^GgL;uDiQi{H&(09*4LMybyw`t)M^sX6cg~@lt$cY^OPRODUUQ zn=2E)n;pNI{lA+16*JgdxZ#n~m}|uz z+YU`tXv(FjdX0s3kb_U zw7KU!gpdBz86WQyzX1YI3OtP_0}pW;sgz0Rh*-z2ISakvis;Ygs4{IZ#}k{XP+-* pPxCnBWbr~-JftU^4?C#g5zpwrM?rje7aib~iF^AB7I0eb)d delta 952 zcma)(OK4L;6ozMV=f0BM*w(5|8=9s~O>b%oDJdpkEruk}M^tE5*@V;ymXew}jfhaK zXcsPxQ$eu>1z$ylKwNa;&bB-82JR}*rMRusl`CfwA`Mz_V7@v0^Pe*_XLem5I~{K{ z%?j9f7z@p1@*8qkEkyopad7%+uOOuW$wCMf+c8X0-k-o4D9pO~}+i7ibO6>Ggbl%dY9ln7~ zbzu}LG%dJwuneB7jk_OSvDQ?{$}1gHnlu~zB4o#uMiy?t;Jy8|1%P*K*2gHgee?;f z1t)zbcqv7D&`Ph1;g*vui||j<9fWt3R>kEW#Dc1toJhoGk{1$}H(^zo%@nT8rSpqR zkeeP!i4{K!jej^V@Oyv1tlSJt!VA$sEurrS0g1jrixKJKazrvLc_AJuM;be%DP9C;!@CTE2juRaGCv>&eIMU07J`UbK za+<@%;pOOOs9G_}FQyBb*<6XZB`%ZyVju zG)?6wsdL@KGtQFR5Bf{3TlWiDF)0EL0VL|qtdx|f?o7%^N-9W5s+3(wzQH9SQmE9B zkl-R}3BQu1k(_ZMlP-`J(9gRC(k?ZTr;>a37*`NkpG6wwo&t`Wp}a_AU=);vWsAMZ z6R9CI#v?GwUj}yp77HuE9CzNa9Ew1}MLzOA4_|OC`zS8a^hOfoywrFw zv<8*!!f$x5wz{1{zVd;8JdzODyE?|6GW$ftuRZ&k`YtjcbOA^n2mw(T70McUE&L9- zF`G?QK9?yB4vpjxX6LVZm{~{->6yV?Dw{FLoa5H6h@Mee&x8}GW=J>Ff6*ETdhbdLp4 z`lN*_TG-OU#UtOOrgF%X!WAi8lhtvL>EBU{>Wo`3zRDSy-CTh^7VKH_#Vask!H8`I%F6So+0}2tLD#j>lEI1I{ISL2LSqFFMUz~ba?5QFq;+jQE>*d{bGfRh-7aF2dQ3FQwR;F z^ZKQ14sT)+O+=Ud+adtBP|INVIEX_mQbGAExpO#$GI%GoBV<~x0XMm>Y!BLr_L}RB zi+V~=4`;Gh+tEl$r$3j0MeN$#kA#{ru27yDHIX8-^I delta 908 zcma)4O-NKx6u$TUp7);58uO>g!cwPk`h%h&(M*ZPa??Py8VBS#cTnTaJi9XzLZu6L z7HD^)Fv0{@iYpk=L%YSXIwW-=6oI&ePD{myqjxaZyvO=}IcuT4`& zJZ58^qg(QP?NQu6A8w7v86}}$MC61@lmrklq4Cs-I)f4h0gg39yo(~*{F8UA7srJK zfz9D#9R%lP->w?>#hr=>dw7Z65+b34mGXZpmHo=#!JcYfX3wCF4TyDEW>{-vRBWhJ z4Q=uWCi)0|B_OoMvl@GxRrXN~n!BBWeHFVy+K!r-1ih)<>kvhc(IZsUS-jGmXM@Vksa9Up@yrc!Y8ri!l$p3&AN~ybQ*Ew&Nhs)xHHDg$ z2^XRzh#JA-NuNp{oR49(4VybMB?EY`id+&G(WEJtgSzpeM(H5Ql9a zSVnyw*gW2NqgUMQm13g$Nx?Dk?O|xaQvrTw>R+7JbGS$Szes^YM6Ilhp5S#^w+I@-%rSE3v7tfsJ69?9OJP1#%5o;YxBaSvSF#xi-C&TrfQlyHX0vC}0IC20`tLoO delta 261 zcmX@ZH;<2ZIWI340}xDbwa9Rp$ScWcHBntoktK>Xg*A#Tg*l2Hh&fW&S{R}@Q`mtd zR|<15gC@tsqTbD1j7m(b(m=h!n+=(7F{ZEsnME8R0%T$lABf-q5!^r`q=+9#YO)nE zgG7Wugb0Wb1rg#PLJUMm0EuEoAfZqs1tf2ArsS9Br57cpq!!5m`ErvDnT;neVx7n) z1LSFPPqt)JVHBO5%x0klatK(>N`}usCIeXiFAkgB{FKt1RJ$S#pcu&D;@rtc*^DN0 KvfHz$1Gxa^)-MzQ diff --git a/migrations/versions/__pycache__/e7e4ff171f7a_add_message_attachments_table_and_.cpython-311.pyc b/migrations/versions/__pycache__/e7e4ff171f7a_add_message_attachments_table_and_.cpython-311.pyc index 1ed7d4579f840d2712b10a07e25d1387cc15043d..b56ee19cccc4b8ecb4ce0da05d4084cffaed7d4b 100644 GIT binary patch delta 1281 zcmb7^O-vI(6vt<}+wJalb_=zoh*FCnvM6dKsGt}t1wqk^986;*g((Utt=X=c7?7HH zF(HOJCTfDQM#Rqp1`k}ksqxq~8zoIhycn+-J?X`nwt^%O<7DT*Z{Gag%iFiJ`_q4; zN`0&-GN8lvs`cC@DXo^nj`UW41H^oc8@7k-5MX;)z(Ux8xv)s5gdNvFSjHk%C+1E9 zO-c{kcWN-_7>p;+NBa$8hr2yJJOHa4yFW34d&CGn^zQSCh}sy?%AV{!c=n#7oXg z0=Akpa!5r&Uz2bai8pH!YO#)wHusj*D|M}SM(L*PBNSHthGmlGHm&eD$!o4@3tDPO zDF!dx(>B^(It!x-jB+DfMxhP%lI^^kE7)6$cP~jT`Ml)WvOR0@+hDD#b2Lp(JR3E7 z`v&7!r>_{~Tx@AX`eM=Ecw{)5BzECygU09h{zN>UlZs~|q347=l+1~J5u^WHZ{mEC z#Rmcba$7hxwv*Z(I+GQ&+7$TWRL1vTZyj$`=V?$<7)}fgWZ9$aBUD@*O3rHRBn!xuCPaeJ7J=s0elts-ZYPL{wVJG(J@YK-< z-BaCjbSG${poM}9Xp997-0Pbhe3H!i8%=+sLsQAq#~HvHuU?ENU}Rn}ynz zGYs90O~z(=vZ%#GEf#8FJ4d=ESYgK=9G^Nq7y7F()k4*o)0q=9r)N%>sNF*C6lXqK zm}VjE+d5g2e*h|rOo&bV>V8)ntnaMk-dFOSRgU*Hu(N9Rm#A>wGTL9=$E1>p!bByN z$k)Ms0s2NJ8<$Fe5Jh~2fjc^>$)E3ZWnpo)|@U*bkB3P1rX3jW!G-kRi20p6(6Q^v3O`{f%TBTo5a(=!v1J5fO0N#W*#gNRD9qhE*> zXFfrG@mkv4_KrNSJVZ;q$-#s-=}mQ{VY>#~b=aP-1fTV;4z74ty_=-crNJ&8cI7L# zmZp-kYtgjDsac%5#kmAzLYFLBaI_xHC>h)J?(56G%*Gie=zcU0`3j9<2T=CY~ z;}~dUcN*b9i?Cw{11(!WB!yk5BB!NVDC#LnC=`NAV|GJE@z2L1v*Bqq5DJ82szi%* z6txsJ6crTJ6ebFRz%J#kNo^)NBl{7Wn2rSJLt)iQ6AjcAZuE@wUG5pl;0MZao7zge z+$Ek+?X)bR$ldU5)sF(Ii@ZCw-YDAu81cQbCSb)c%Q_wOqI0zk<{Obr?z=tF6N;eu zVBoy!As+oJq9H7pTzy%QDXEQ%yC!Q~*)^F7l=8To1Dp diff --git a/migrations/versions/__pycache__/f18735338888_add_company_logo_field.cpython-311.pyc b/migrations/versions/__pycache__/f18735338888_add_company_logo_field.cpython-311.pyc index 3b0259b1ede28067acc51c4279f844d5e5af6868..9685bd7754a1975af6d89495e28460afaafca84e 100644 GIT binary patch delta 280 zcmcb@)5OcWoR^o20SF$fwauuT$ScX{Hc?$pmobGUhdGxuij|Qeg*A#Tg)NFbg*l1? zh&fZ(TNt9aQaFGlcM5YbgC^(1w0dq$##`)}dBp{($t4?~eq`hl2O22?#Krq3Z)B0# z{D&!n(SrlXFX99d+(1H;xriCW<_8kDxKoPq3*wXWb4qjbiop69fx-$!VjxM*l>G9% z^rFO+)FLS$UuN