diff --git a/Dockerfile b/Dockerfile index 79b08dc..0abea58 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,33 +1,57 @@ FROM python:3.11-slim -WORKDIR /app - # Install system dependencies RUN apt-get update && apt-get install -y \ - gcc \ - postgresql-client \ + build-essential \ + libpq-dev \ + curl \ netcat-traditional \ && rm -rf /var/lib/apt/lists/* +# Create a non-root user +RUN useradd -m -u 1000 celery + +# Set working directory +WORKDIR /app + # Copy requirements first to leverage Docker cache COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -# Copy the rest of the application +# Copy application code COPY . . -# Create migrations directory if it doesn't exist -RUN mkdir -p migrations/versions +# Create necessary directories and set permissions +RUN mkdir -p /app/uploads /app/static/uploads && \ + chown -R celery:celery /app -# Make entrypoint script executable -RUN chmod +x entrypoint.sh +# Create and set up startup script +RUN echo '#!/bin/bash\n\ +echo "Waiting for database..."\n\ +while ! nc -z db 5432; do\n\ + sleep 0.1\n\ +done\n\ +echo "Database is ready!"\n\ +\n\ +echo "Waiting for Redis..."\n\ +while ! nc -z redis 6379; do\n\ + sleep 0.1\n\ +done\n\ +echo "Redis is ready!"\n\ +\n\ +echo "Running database migrations..."\n\ +flask db upgrade\n\ +\n\ +echo "Creating admin user..."\n\ +flask create-admin\n\ +\n\ +echo "Starting application..."\n\ +exec "$@"' > /app/start.sh && \ + chmod +x /app/start.sh && \ + chown celery:celery /app/start.sh -# Set environment variables -ENV FLASK_APP=app.py -ENV FLASK_ENV=production +# Switch to non-root user +USER celery -# Expose the port the app runs on -EXPOSE 5000 - -# Use the entrypoint script -ENTRYPOINT ["./entrypoint.sh"] \ No newline at end of file +# Set entrypoint +ENTRYPOINT ["/app/start.sh"] \ No newline at end of file diff --git a/__pycache__/app.cpython-311.pyc b/__pycache__/app.cpython-311.pyc new file mode 100644 index 0000000..8baacdb Binary files /dev/null and b/__pycache__/app.cpython-311.pyc differ diff --git a/__pycache__/celery_worker.cpython-311.pyc b/__pycache__/celery_worker.cpython-311.pyc new file mode 100644 index 0000000..6f1356a Binary files /dev/null and b/__pycache__/celery_worker.cpython-311.pyc differ diff --git a/__pycache__/extensions.cpython-311.pyc b/__pycache__/extensions.cpython-311.pyc new file mode 100644 index 0000000..4131d75 Binary files /dev/null and b/__pycache__/extensions.cpython-311.pyc differ diff --git a/__pycache__/forms.cpython-311.pyc b/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000..d8224b2 Binary files /dev/null and b/__pycache__/forms.cpython-311.pyc differ diff --git a/__pycache__/models.cpython-311.pyc b/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000..3f444b3 Binary files /dev/null and b/__pycache__/models.cpython-311.pyc differ diff --git a/__pycache__/tasks.cpython-311.pyc b/__pycache__/tasks.cpython-311.pyc new file mode 100644 index 0000000..8f6964a Binary files /dev/null and b/__pycache__/tasks.cpython-311.pyc differ diff --git a/app.py b/app.py index dd0fa74..e5948b6 100644 --- a/app.py +++ b/app.py @@ -3,7 +3,7 @@ from flask import Flask, send_from_directory, jsonify from flask_migrate import Migrate from dotenv import load_dotenv import os -from models import User +from models import User, SiteSettings from flask_wtf.csrf import generate_csrf from routes.room_files import room_files_bp from routes.user import user_bp @@ -45,7 +45,12 @@ def create_app(): @app.context_processor def inject_config(): - return dict(config=app.config) + site_settings = SiteSettings.query.first() + if not site_settings: + site_settings = SiteSettings() + db.session.add(site_settings) + db.session.commit() + return dict(config=app.config, site_settings=site_settings) # User loader for Flask-Login @login_manager.user_loader @@ -111,7 +116,12 @@ def create_app(): # Create default email templates if they don't exist with app.app_context(): - create_default_templates() + try: + # Ensure database tables exist + db.create_all() + create_default_templates() + except Exception as e: + print(f"Warning: Could not create default templates: {e}") return app diff --git a/docker-compose.yml b/docker-compose.yml index d01c748..20a0528 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,6 +3,7 @@ version: '3.8' services: web: build: . + command: gunicorn --bind 0.0.0.0:5000 app:app ports: - "10335:5000" environment: @@ -59,17 +60,18 @@ services: celery_worker: build: . command: celery -A celery_worker.celery worker --loglevel=info - environment: - - FLASK_APP=app.py - - FLASK_ENV=production - - DATABASE_URL=postgresql://postgres:postgres@db:5432/docupulse - - REDIS_URL=redis://redis:6379/0 volumes: - .:/app + environment: + - FLASK_APP=app.py + - FLASK_ENV=development + - DATABASE_URL=postgresql://postgres:postgres@db:5432/docupulse + - REDIS_URL=redis://redis:6379/0 depends_on: - - web - - redis - - db + db: + condition: service_healthy + redis: + condition: service_healthy restart: unless-stopped healthcheck: test: ["CMD", "celery", "-A", "celery_worker.celery", "inspect", "ping"] diff --git a/migrations/__pycache__/env.cpython-311.pyc b/migrations/__pycache__/env.cpython-311.pyc new file mode 100644 index 0000000..d1e81e2 Binary files /dev/null and b/migrations/__pycache__/env.cpython-311.pyc differ diff --git a/migrations/versions/0a8006bd1732_add_key_value_settings_table.py b/migrations/versions/0a8006bd1732_add_key_value_settings_table.py index eecf644..69c97df 100644 --- a/migrations/versions/0a8006bd1732_add_key_value_settings_table.py +++ b/migrations/versions/0a8006bd1732_add_key_value_settings_table.py @@ -7,6 +7,7 @@ Create Date: 2025-06-02 14:10:54.033943 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,18 +19,23 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('key_value_settings', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('key', sa.String(length=100), nullable=False), - sa.Column('value', sa.Text(), nullable=True), - sa.Column('updated_at', sa.DateTime(), nullable=True), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('key') - ) + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'key_value_settings' not in tables: + op.create_table('key_value_settings', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('key', sa.String(length=100), nullable=False), + sa.Column('value', sa.Text(), nullable=True), + sa.Column('updated_at', sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('key') + ) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_table('key_value_settings') - # ### end Alembic commands ### + # ### end Alembic commands ### \ No newline at end of file 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 eccd880..bb2b839 100644 --- a/migrations/versions/0f48943140fa_add_file_attachment_fields_to_message_.py +++ b/migrations/versions/0f48943140fa_add_file_attachment_fields_to_message_.py @@ -7,6 +7,7 @@ Create Date: 2025-05-26 14:00:05.521776 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/migrations/versions/1c297825e3a9_add_user_authentication_fields.py b/migrations/versions/1c297825e3a9_add_user_authentication_fields.py index b1c5dbc..1933aaa 100644 --- a/migrations/versions/1c297825e3a9_add_user_authentication_fields.py +++ b/migrations/versions/1c297825e3a9_add_user_authentication_fields.py @@ -2,11 +2,12 @@ Revision ID: 1c297825e3a9 Revises: -Create Date: 2025-05-23 08:39:40.494853 +Create Date: 2025-06-02 13:26:30.353000 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -17,17 +18,24 @@ depends_on = None def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - 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') - ) - # ### end Alembic commands ### + # Check if the table exists before creating it + 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') + ) def downgrade(): diff --git a/migrations/versions/20519a2437c2_add_mails_table.py b/migrations/versions/20519a2437c2_add_mails_table.py index 2f61176..367cfee 100644 --- a/migrations/versions/20519a2437c2_add_mails_table.py +++ b/migrations/versions/20519a2437c2_add_mails_table.py @@ -7,6 +7,7 @@ Create Date: 2025-06-02 09:04:39.972021 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,7 +19,12 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('mails', + 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), 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 511b1c6..e726c1b 100644 --- a/migrations/versions/25da158dd705_add_is_admin_to_contact_model.py +++ b/migrations/versions/25da158dd705_add_is_admin_to_contact_model.py @@ -7,6 +7,7 @@ Create Date: 2025-05-23 16:10:53.731035 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/migrations/versions/26b0e5357f52_add_room_member_permissions_table.py b/migrations/versions/26b0e5357f52_add_room_member_permissions_table.py index d3f36cd..9662b64 100644 --- a/migrations/versions/26b0e5357f52_add_room_member_permissions_table.py +++ b/migrations/versions/26b0e5357f52_add_room_member_permissions_table.py @@ -7,6 +7,7 @@ Create Date: 2025-05-23 21:44:58.832286 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,17 +19,22 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('room_member_permissions', - sa.Column('room_id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('can_view', sa.Boolean(), nullable=False), - sa.Column('can_upload', sa.Boolean(), nullable=False), - sa.Column('can_delete', sa.Boolean(), nullable=False), - sa.Column('can_share', sa.Boolean(), nullable=False), - sa.ForeignKeyConstraint(['room_id'], ['room.id'], ), - sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), - sa.PrimaryKeyConstraint('room_id', 'user_id') - ) + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'room_member_permissions' not in tables: + op.create_table('room_member_permissions', + sa.Column('room_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('can_view', sa.Boolean(), nullable=False), + sa.Column('can_upload', sa.Boolean(), nullable=False), + sa.Column('can_delete', sa.Boolean(), nullable=False), + sa.Column('can_share', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['room_id'], ['room.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), + sa.PrimaryKeyConstraint('room_id', 'user_id') + ) # ### end Alembic commands ### diff --git a/migrations/versions/2c5f57dddb78_add_room_members_table.py b/migrations/versions/2c5f57dddb78_add_room_members_table.py index 5dbb132..4d6db2e 100644 --- a/migrations/versions/2c5f57dddb78_add_room_members_table.py +++ b/migrations/versions/2c5f57dddb78_add_room_members_table.py @@ -7,6 +7,7 @@ Create Date: 2025-05-23 21:27:17.497481 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,15 +19,24 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('room_members', - sa.Column('room_id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.ForeignKeyConstraint(['room_id'], ['room.id'], ), - sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), - sa.PrimaryKeyConstraint('room_id', 'user_id') - ) - with op.batch_alter_table('room', schema=None) as batch_op: - batch_op.drop_column('is_private') + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'room_members' not in tables: + op.create_table('room_members', + sa.Column('room_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['room_id'], ['room.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), + sa.PrimaryKeyConstraint('room_id', 'user_id') + ) + + # Check if is_private column exists before dropping it + columns = [col['name'] for col in inspector.get_columns('room')] + if 'is_private' in columns: + with op.batch_alter_table('room', schema=None) as batch_op: + batch_op.drop_column('is_private') # ### end Alembic commands ### diff --git a/migrations/versions/3a5b8d8e53cd_add_rooms_table.py b/migrations/versions/3a5b8d8e53cd_add_rooms_table.py index 1c73eee..98ba748 100644 --- a/migrations/versions/3a5b8d8e53cd_add_rooms_table.py +++ b/migrations/versions/3a5b8d8e53cd_add_rooms_table.py @@ -7,6 +7,7 @@ Create Date: 2025-05-23 21:25:27.880150 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,16 +19,21 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('room', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('name', sa.String(length=100), nullable=False), - sa.Column('description', sa.Text(), nullable=True), - sa.Column('created_at', sa.DateTime(), nullable=True), - sa.Column('created_by', sa.Integer(), nullable=False), - sa.Column('is_private', sa.Boolean(), nullable=True), - sa.ForeignKeyConstraint(['created_by'], ['user.id'], ), - sa.PrimaryKeyConstraint('id') - ) + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'room' not in tables: + op.create_table('room', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=100), nullable=False), + sa.Column('description', sa.Text(), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.Column('created_by', sa.Integer(), nullable=False), + sa.Column('is_private', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['created_by'], ['user.id'], ), + sa.PrimaryKeyConstraint('id') + ) # ### end Alembic commands ### diff --git a/migrations/versions/43dfd2543fad_add_contact_fields_to_user_model.py b/migrations/versions/43dfd2543fad_add_contact_fields_to_user_model.py index 2ac2af0..254dd47 100644 --- a/migrations/versions/43dfd2543fad_add_contact_fields_to_user_model.py +++ b/migrations/versions/43dfd2543fad_add_contact_fields_to_user_model.py @@ -7,6 +7,7 @@ Create Date: 2025-05-23 09:24:23.926302 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,12 +19,21 @@ 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('user')] + with op.batch_alter_table('user', schema=None) as batch_op: - batch_op.add_column(sa.Column('phone', sa.String(length=20), nullable=True)) - batch_op.add_column(sa.Column('company', sa.String(length=100), nullable=True)) - batch_op.add_column(sa.Column('position', sa.String(length=100), nullable=True)) - batch_op.add_column(sa.Column('notes', sa.Text(), nullable=True)) - batch_op.add_column(sa.Column('is_active', sa.Boolean(), nullable=True)) + if 'phone' not in columns: + batch_op.add_column(sa.Column('phone', sa.String(length=20), nullable=True)) + if 'company' not in columns: + batch_op.add_column(sa.Column('company', sa.String(length=100), nullable=True)) + if 'position' not in columns: + batch_op.add_column(sa.Column('position', sa.String(length=100), nullable=True)) + if 'notes' not in columns: + batch_op.add_column(sa.Column('notes', sa.Text(), nullable=True)) + if 'is_active' not in columns: + batch_op.add_column(sa.Column('is_active', sa.Boolean(), nullable=True)) # ### end Alembic commands ### diff --git a/migrations/versions/444d76da74ba_add_notifications_table.py b/migrations/versions/444d76da74ba_add_notifications_table.py index 4245842..6dc3859 100644 --- a/migrations/versions/444d76da74ba_add_notifications_table.py +++ b/migrations/versions/444d76da74ba_add_notifications_table.py @@ -7,6 +7,7 @@ Create Date: 2025-06-02 08:25:48.241102 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. @@ -24,7 +25,12 @@ def upgrade(): def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('template_variables', + 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), 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 5beafb1..a962180 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 @@ -7,6 +7,7 @@ Create Date: 2025-05-24 10:07:02.159730 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,7 +19,12 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('room_file', + 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), 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 4c61d12..c3b2ffb 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 @@ -7,6 +7,7 @@ Create Date: 2025-05-24 18:14:38.320999 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. diff --git a/migrations/versions/7554ab70efe7_fix_existing_users.py b/migrations/versions/7554ab70efe7_fix_existing_users.py index 6605c93..9719ce6 100644 --- a/migrations/versions/7554ab70efe7_fix_existing_users.py +++ b/migrations/versions/7554ab70efe7_fix_existing_users.py @@ -7,6 +7,7 @@ Create Date: 2024-03-19 10:05:00.000000 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect from sqlalchemy.sql import text diff --git a/migrations/versions/76da0573e84b_merge_heads.py b/migrations/versions/76da0573e84b_merge_heads.py index 969aca7..2018f0f 100644 --- a/migrations/versions/76da0573e84b_merge_heads.py +++ b/migrations/versions/76da0573e84b_merge_heads.py @@ -7,6 +7,7 @@ Create Date: 2025-05-25 10:03:03.423064 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/migrations/versions/787468cfea77_add_company_information_fields_to_.py b/migrations/versions/787468cfea77_add_company_information_fields_to_.py index 236f5f4..f18c8cd 100644 --- a/migrations/versions/787468cfea77_add_company_information_fields_to_.py +++ b/migrations/versions/787468cfea77_add_company_information_fields_to_.py @@ -7,6 +7,7 @@ Create Date: 2025-05-26 10:42:17.287566 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/migrations/versions/7a5747dc773f_update_last_name_field_in_user_model.py b/migrations/versions/7a5747dc773f_update_last_name_field_in_user_model.py index 13b6e14..0d88752 100644 --- a/migrations/versions/7a5747dc773f_update_last_name_field_in_user_model.py +++ b/migrations/versions/7a5747dc773f_update_last_name_field_in_user_model.py @@ -7,6 +7,7 @@ Create Date: 2024-03-19 10:15:00.000000 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect from sqlalchemy.sql import text diff --git a/migrations/versions/9faab7ef6036_add_site_settings_table.py b/migrations/versions/9faab7ef6036_add_site_settings_table.py index 3e18a7c..f623d8e 100644 --- a/migrations/versions/9faab7ef6036_add_site_settings_table.py +++ b/migrations/versions/9faab7ef6036_add_site_settings_table.py @@ -7,6 +7,7 @@ Create Date: 2025-05-25 21:16:39.683736 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. @@ -18,7 +19,12 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('site_settings', + 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), @@ -31,7 +37,12 @@ def upgrade(): def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('color_settings', + 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), diff --git a/migrations/versions/__pycache__/0a8006bd1732_add_key_value_settings_table.cpython-311.pyc b/migrations/versions/__pycache__/0a8006bd1732_add_key_value_settings_table.cpython-311.pyc new file mode 100644 index 0000000..9f3a241 Binary files /dev/null and b/migrations/versions/__pycache__/0a8006bd1732_add_key_value_settings_table.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/0f48943140fa_add_file_attachment_fields_to_message_.cpython-311.pyc b/migrations/versions/__pycache__/0f48943140fa_add_file_attachment_fields_to_message_.cpython-311.pyc new file mode 100644 index 0000000..6bd3a2e Binary files /dev/null and b/migrations/versions/__pycache__/0f48943140fa_add_file_attachment_fields_to_message_.cpython-311.pyc differ 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 new file mode 100644 index 0000000..d248a1e Binary files /dev/null and b/migrations/versions/__pycache__/1c297825e3a9_add_user_authentication_fields.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/20519a2437c2_add_mails_table.cpython-311.pyc b/migrations/versions/__pycache__/20519a2437c2_add_mails_table.cpython-311.pyc new file mode 100644 index 0000000..efe9953 Binary files /dev/null and b/migrations/versions/__pycache__/20519a2437c2_add_mails_table.cpython-311.pyc differ 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 new file mode 100644 index 0000000..e04d7df Binary files /dev/null and b/migrations/versions/__pycache__/25da158dd705_add_is_admin_to_contact_model.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/26b0e5357f52_add_room_member_permissions_table.cpython-311.pyc b/migrations/versions/__pycache__/26b0e5357f52_add_room_member_permissions_table.cpython-311.pyc new file mode 100644 index 0000000..f25519b Binary files /dev/null and b/migrations/versions/__pycache__/26b0e5357f52_add_room_member_permissions_table.cpython-311.pyc differ 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 new file mode 100644 index 0000000..f41ecda Binary files /dev/null and b/migrations/versions/__pycache__/2c5f57dddb78_add_room_members_table.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/3a5b8d8e53cd_add_rooms_table.cpython-311.pyc b/migrations/versions/__pycache__/3a5b8d8e53cd_add_rooms_table.cpython-311.pyc new file mode 100644 index 0000000..27c0587 Binary files /dev/null and b/migrations/versions/__pycache__/3a5b8d8e53cd_add_rooms_table.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/43dfd2543fad_add_contact_fields_to_user_model.cpython-311.pyc b/migrations/versions/__pycache__/43dfd2543fad_add_contact_fields_to_user_model.cpython-311.pyc new file mode 100644 index 0000000..474c75f Binary files /dev/null and b/migrations/versions/__pycache__/43dfd2543fad_add_contact_fields_to_user_model.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/444d76da74ba_add_notifications_table.cpython-311.pyc b/migrations/versions/__pycache__/444d76da74ba_add_notifications_table.cpython-311.pyc new file mode 100644 index 0000000..7af98d0 Binary files /dev/null and b/migrations/versions/__pycache__/444d76da74ba_add_notifications_table.cpython-311.pyc differ 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 new file mode 100644 index 0000000..3e0ce3e Binary files /dev/null and b/migrations/versions/__pycache__/64b5c28510b0_add_room_file_table_for_file_folder_.cpython-311.pyc differ 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 new file mode 100644 index 0000000..f8b7372 Binary files /dev/null and b/migrations/versions/__pycache__/6651332488d9_add_starred_column_to_room_file_table.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/7554ab70efe7_fix_existing_users.cpython-311.pyc b/migrations/versions/__pycache__/7554ab70efe7_fix_existing_users.cpython-311.pyc new file mode 100644 index 0000000..12935a2 Binary files /dev/null and b/migrations/versions/__pycache__/7554ab70efe7_fix_existing_users.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/76da0573e84b_merge_heads.cpython-311.pyc b/migrations/versions/__pycache__/76da0573e84b_merge_heads.cpython-311.pyc new file mode 100644 index 0000000..7c0373d Binary files /dev/null and b/migrations/versions/__pycache__/76da0573e84b_merge_heads.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/787468cfea77_add_company_information_fields_to_.cpython-311.pyc b/migrations/versions/__pycache__/787468cfea77_add_company_information_fields_to_.cpython-311.pyc new file mode 100644 index 0000000..e03bc57 Binary files /dev/null and b/migrations/versions/__pycache__/787468cfea77_add_company_information_fields_to_.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/7a5747dc773f_update_last_name_field_in_user_model.cpython-311.pyc b/migrations/versions/__pycache__/7a5747dc773f_update_last_name_field_in_user_model.cpython-311.pyc new file mode 100644 index 0000000..b6ef485 Binary files /dev/null and b/migrations/versions/__pycache__/7a5747dc773f_update_last_name_field_in_user_model.cpython-311.pyc differ 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 new file mode 100644 index 0000000..cba43b4 Binary files /dev/null and b/migrations/versions/__pycache__/9faab7ef6036_add_site_settings_table.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/add_conversations_tables.cpython-311.pyc b/migrations/versions/__pycache__/add_conversations_tables.cpython-311.pyc new file mode 100644 index 0000000..03350b7 Binary files /dev/null and b/migrations/versions/__pycache__/add_conversations_tables.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/add_deleted_by_to_room_file.cpython-311.pyc b/migrations/versions/__pycache__/add_deleted_by_to_room_file.cpython-311.pyc new file mode 100644 index 0000000..178aee9 Binary files /dev/null and b/migrations/versions/__pycache__/add_deleted_by_to_room_file.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/add_deleted_column_to_room_file.cpython-311.pyc b/migrations/versions/__pycache__/add_deleted_column_to_room_file.cpython-311.pyc new file mode 100644 index 0000000..46d0624 Binary files /dev/null and b/migrations/versions/__pycache__/add_deleted_column_to_room_file.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/add_trashed_file_table.cpython-311.pyc b/migrations/versions/__pycache__/add_trashed_file_table.cpython-311.pyc new file mode 100644 index 0000000..0b92647 Binary files /dev/null and b/migrations/versions/__pycache__/add_trashed_file_table.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/b978642e7b10_add_preferred_view_to_user.cpython-311.pyc b/migrations/versions/__pycache__/b978642e7b10_add_preferred_view_to_user.cpython-311.pyc new file mode 100644 index 0000000..ad867d6 Binary files /dev/null and b/migrations/versions/__pycache__/b978642e7b10_add_preferred_view_to_user.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/bd04430cda95_merge_heads.cpython-311.pyc b/migrations/versions/__pycache__/bd04430cda95_merge_heads.cpython-311.pyc new file mode 100644 index 0000000..1f6e9e3 Binary files /dev/null and b/migrations/versions/__pycache__/bd04430cda95_merge_heads.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/be1f7bdd10e1_add_granular_permissions_to_.cpython-311.pyc b/migrations/versions/__pycache__/be1f7bdd10e1_add_granular_permissions_to_.cpython-311.pyc new file mode 100644 index 0000000..fcb1452 Binary files /dev/null and b/migrations/versions/__pycache__/be1f7bdd10e1_add_granular_permissions_to_.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/c21f243b3640_add_profile_picture_to_user.cpython-311.pyc b/migrations/versions/__pycache__/c21f243b3640_add_profile_picture_to_user.cpython-311.pyc new file mode 100644 index 0000000..007b006 Binary files /dev/null and b/migrations/versions/__pycache__/c21f243b3640_add_profile_picture_to_user.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/c243d6a1843d_add_last_name_to_user_model.cpython-311.pyc b/migrations/versions/__pycache__/c243d6a1843d_add_last_name_to_user_model.cpython-311.pyc new file mode 100644 index 0000000..abcd774 Binary files /dev/null and b/migrations/versions/__pycache__/c243d6a1843d_add_last_name_to_user_model.cpython-311.pyc differ 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 new file mode 100644 index 0000000..a6dc354 Binary files /dev/null and b/migrations/versions/__pycache__/c770e08966b4_add_email_templates_table.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/ca9026520dad_add_colorsettings_table.cpython-311.pyc b/migrations/versions/__pycache__/ca9026520dad_add_colorsettings_table.cpython-311.pyc new file mode 100644 index 0000000..6129b15 Binary files /dev/null and b/migrations/versions/__pycache__/ca9026520dad_add_colorsettings_table.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/create_user_starred_file_table.cpython-311.pyc b/migrations/versions/__pycache__/create_user_starred_file_table.cpython-311.pyc new file mode 100644 index 0000000..55c8a8f Binary files /dev/null and b/migrations/versions/__pycache__/create_user_starred_file_table.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/d8dcbf9fe881_increase_password_hash_column_length.cpython-311.pyc b/migrations/versions/__pycache__/d8dcbf9fe881_increase_password_hash_column_length.cpython-311.pyc new file mode 100644 index 0000000..a29e796 Binary files /dev/null and b/migrations/versions/__pycache__/d8dcbf9fe881_increase_password_hash_column_length.cpython-311.pyc differ diff --git a/migrations/versions/__pycache__/dbcb5d2d3ed0_add_contact_model.cpython-311.pyc b/migrations/versions/__pycache__/dbcb5d2d3ed0_add_contact_model.cpython-311.pyc new file mode 100644 index 0000000..23ff8f4 Binary files /dev/null and b/migrations/versions/__pycache__/dbcb5d2d3ed0_add_contact_model.cpython-311.pyc differ 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 new file mode 100644 index 0000000..1ed7d45 Binary files /dev/null and b/migrations/versions/__pycache__/e7e4ff171f7a_add_message_attachments_table_and_.cpython-311.pyc differ 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 new file mode 100644 index 0000000..3b0259b Binary files /dev/null and b/migrations/versions/__pycache__/f18735338888_add_company_logo_field.cpython-311.pyc differ diff --git a/migrations/versions/add_conversations_tables.py b/migrations/versions/add_conversations_tables.py index eb13bf1..df159bf 100644 --- a/migrations/versions/add_conversations_tables.py +++ b/migrations/versions/add_conversations_tables.py @@ -7,6 +7,7 @@ Create Date: 2024-03-19 10:00:00.000000 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,7 +19,12 @@ depends_on = None def upgrade(): # Create conversation table first - op.create_table('conversation', + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'conversation' not in tables: + op.create_table('conversation', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=100), nullable=False), sa.Column('description', sa.Text(), nullable=True), @@ -29,7 +35,12 @@ def upgrade(): ) # Create conversation_members table - op.create_table('conversation_members', + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'conversation_members' not in tables: + op.create_table('conversation_members', sa.Column('conversation_id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=False), sa.ForeignKeyConstraint(['conversation_id'], ['conversation.id'], ), @@ -38,7 +49,12 @@ def upgrade(): ) # Create message table - op.create_table('message', + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'message' not in tables: + op.create_table('message', sa.Column('id', sa.Integer(), nullable=False), sa.Column('content', sa.Text(), nullable=False), sa.Column('created_at', sa.DateTime(), nullable=True), diff --git a/migrations/versions/add_deleted_by_to_room_file.py b/migrations/versions/add_deleted_by_to_room_file.py index d3c342b..94df49c 100644 --- a/migrations/versions/add_deleted_by_to_room_file.py +++ b/migrations/versions/add_deleted_by_to_room_file.py @@ -7,6 +7,7 @@ Create Date: 2024-03-19 10:45:00.000000 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. revision = 'add_deleted_by_to_room_file' diff --git a/migrations/versions/add_deleted_column_to_room_file.py b/migrations/versions/add_deleted_column_to_room_file.py index 696a312..191c3bc 100644 --- a/migrations/versions/add_deleted_column_to_room_file.py +++ b/migrations/versions/add_deleted_column_to_room_file.py @@ -7,6 +7,7 @@ Create Date: 2024-03-19 10:30:00.000000 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. revision = 'add_deleted_column_to_room_file' diff --git a/migrations/versions/add_trashed_file_table.py b/migrations/versions/add_trashed_file_table.py index e0e2bec..8f09976 100644 --- a/migrations/versions/add_trashed_file_table.py +++ b/migrations/versions/add_trashed_file_table.py @@ -7,6 +7,7 @@ Create Date: 2024-03-19 10:00:00.000000 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. @@ -17,7 +18,12 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('trashed_file', + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'trashed_file' not in tables: + op.create_table('trashed_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), diff --git a/migrations/versions/b978642e7b10_add_preferred_view_to_user.py b/migrations/versions/b978642e7b10_add_preferred_view_to_user.py index c6a4194..d32c2de 100644 --- a/migrations/versions/b978642e7b10_add_preferred_view_to_user.py +++ b/migrations/versions/b978642e7b10_add_preferred_view_to_user.py @@ -7,6 +7,7 @@ Create Date: 2025-05-24 08:36:03.426879 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/migrations/versions/bd04430cda95_merge_heads.py b/migrations/versions/bd04430cda95_merge_heads.py index 1991835..0ac659b 100644 --- a/migrations/versions/bd04430cda95_merge_heads.py +++ b/migrations/versions/bd04430cda95_merge_heads.py @@ -7,6 +7,7 @@ Create Date: 2025-05-26 11:14:05.629795 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/migrations/versions/be1f7bdd10e1_add_granular_permissions_to_.py b/migrations/versions/be1f7bdd10e1_add_granular_permissions_to_.py index 5cee53d..acfc2f1 100644 --- a/migrations/versions/be1f7bdd10e1_add_granular_permissions_to_.py +++ b/migrations/versions/be1f7bdd10e1_add_granular_permissions_to_.py @@ -7,6 +7,7 @@ Create Date: 2025-05-24 12:32:19.239241 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/migrations/versions/c21f243b3640_add_profile_picture_to_user.py b/migrations/versions/c21f243b3640_add_profile_picture_to_user.py index b61312b..15d5d09 100644 --- a/migrations/versions/c21f243b3640_add_profile_picture_to_user.py +++ b/migrations/versions/c21f243b3640_add_profile_picture_to_user.py @@ -8,6 +8,7 @@ Create Date: 2025-05-23 19:28:16.977187 from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql +from sqlalchemy import inspect # revision identifiers, used by Alembic. revision = 'c21f243b3640' @@ -19,8 +20,13 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_table('contact') + conn = op.get_bind() + inspector = inspect(conn) + columns = [col['name'] for col in inspector.get_columns('user')] + with op.batch_alter_table('user', schema=None) as batch_op: - batch_op.add_column(sa.Column('profile_picture', sa.String(length=255), nullable=True)) + if 'profile_picture' not in columns: + batch_op.add_column(sa.Column('profile_picture', sa.String(length=255), nullable=True)) # ### end Alembic commands ### diff --git a/migrations/versions/c243d6a1843d_add_last_name_to_user_model.py b/migrations/versions/c243d6a1843d_add_last_name_to_user_model.py index c2c4625..3c6515f 100644 --- a/migrations/versions/c243d6a1843d_add_last_name_to_user_model.py +++ b/migrations/versions/c243d6a1843d_add_last_name_to_user_model.py @@ -7,6 +7,7 @@ Create Date: 2025-05-23 16:00:09.905001 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,8 +19,13 @@ 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('user')] + with op.batch_alter_table('user', schema=None) as batch_op: - batch_op.add_column(sa.Column('last_name', sa.String(length=150), nullable=True)) + if 'last_name' not in columns: + batch_op.add_column(sa.Column('last_name', sa.String(length=150), nullable=True)) # ### end Alembic commands ### diff --git a/migrations/versions/c770e08966b4_add_email_templates_table.py b/migrations/versions/c770e08966b4_add_email_templates_table.py index e95224a..5562787 100644 --- a/migrations/versions/c770e08966b4_add_email_templates_table.py +++ b/migrations/versions/c770e08966b4_add_email_templates_table.py @@ -7,6 +7,7 @@ Create Date: 2025-06-01 20:09:08.019884 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. @@ -18,7 +19,12 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('email_templates', + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'email_templates' not in tables: + op.create_table('email_templates', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=100), nullable=False), sa.Column('subject', sa.String(length=200), nullable=False), @@ -54,7 +60,12 @@ def downgrade(): type_=postgresql.JSONB(astext_type=sa.Text()), existing_nullable=True) - op.create_table('notification', + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'notification' not in tables: + op.create_table('notification', sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False), sa.Column('user_id', sa.INTEGER(), autoincrement=False, nullable=False), sa.Column('title', sa.VARCHAR(length=255), autoincrement=False, nullable=False), diff --git a/migrations/versions/ca9026520dad_add_colorsettings_table.py b/migrations/versions/ca9026520dad_add_colorsettings_table.py index 541ba4f..ae0e739 100644 --- a/migrations/versions/ca9026520dad_add_colorsettings_table.py +++ b/migrations/versions/ca9026520dad_add_colorsettings_table.py @@ -7,6 +7,7 @@ Create Date: 2025-05-25 21:08:37.158900 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. @@ -18,7 +19,12 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('color_settings', + 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(), nullable=False), sa.Column('primary_color', sa.String(length=7), nullable=True), sa.Column('secondary_color', sa.String(length=7), nullable=True), diff --git a/migrations/versions/create_user_starred_file_table.py b/migrations/versions/create_user_starred_file_table.py index 3574d26..147ca7d 100644 --- a/migrations/versions/create_user_starred_file_table.py +++ b/migrations/versions/create_user_starred_file_table.py @@ -7,6 +7,7 @@ Create Date: 2024-03-19 10:00:00.000000 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. @@ -17,7 +18,12 @@ depends_on = None def upgrade(): # Create user_starred_file table - op.create_table('user_starred_file', + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'user_starred_file' not in tables: + op.create_table('user_starred_file', sa.Column('id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('file_id', sa.Integer(), nullable=False), diff --git a/migrations/versions/d8dcbf9fe881_increase_password_hash_column_length.py b/migrations/versions/d8dcbf9fe881_increase_password_hash_column_length.py index 72485f8..200cfa5 100644 --- a/migrations/versions/d8dcbf9fe881_increase_password_hash_column_length.py +++ b/migrations/versions/d8dcbf9fe881_increase_password_hash_column_length.py @@ -7,6 +7,7 @@ Create Date: 2025-05-23 08:45:00.693155 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/migrations/versions/dbcb5d2d3ed0_add_contact_model.py b/migrations/versions/dbcb5d2d3ed0_add_contact_model.py index 36499d6..b596fa5 100644 --- a/migrations/versions/dbcb5d2d3ed0_add_contact_model.py +++ b/migrations/versions/dbcb5d2d3ed0_add_contact_model.py @@ -7,6 +7,7 @@ Create Date: 2025-05-23 08:55:10.537722 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -35,9 +36,17 @@ def upgrade(): sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('email') ) + + # Check if columns exist before adding them + conn = op.get_bind() + inspector = inspect(conn) + columns = [col['name'] for col in inspector.get_columns('user')] + with op.batch_alter_table('user', schema=None) as batch_op: - batch_op.add_column(sa.Column('is_admin', sa.Boolean(), nullable=True)) - batch_op.add_column(sa.Column('created_at', sa.DateTime(), nullable=True)) + if 'is_admin' not in columns: + batch_op.add_column(sa.Column('is_admin', sa.Boolean(), nullable=True)) + if 'created_at' not in columns: + batch_op.add_column(sa.Column('created_at', sa.DateTime(), nullable=True)) # ### end Alembic commands ### diff --git a/migrations/versions/e7e4ff171f7a_add_message_attachments_table_and_.py b/migrations/versions/e7e4ff171f7a_add_message_attachments_table_and_.py index e3c9b6a..28393a8 100644 --- a/migrations/versions/e7e4ff171f7a_add_message_attachments_table_and_.py +++ b/migrations/versions/e7e4ff171f7a_add_message_attachments_table_and_.py @@ -7,6 +7,7 @@ Create Date: 2025-05-26 15:00:18.557702 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. @@ -18,7 +19,12 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('message_attachment', + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'message_attachment' not in tables: + op.create_table('message_attachment', sa.Column('id', sa.Integer(), nullable=False), sa.Column('message_id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=255), nullable=False), diff --git a/migrations/versions/f18735338888_add_company_logo_field.py b/migrations/versions/f18735338888_add_company_logo_field.py index 64c32e5..843108b 100644 --- a/migrations/versions/f18735338888_add_company_logo_field.py +++ b/migrations/versions/f18735338888_add_company_logo_field.py @@ -7,6 +7,7 @@ Create Date: 2025-05-26 10:52:32.572951 """ from alembic import op import sqlalchemy as sa +from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/routes/__pycache__/__init__.cpython-311.pyc b/routes/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..de8103f Binary files /dev/null and b/routes/__pycache__/__init__.cpython-311.pyc differ diff --git a/routes/__pycache__/admin.cpython-311.pyc b/routes/__pycache__/admin.cpython-311.pyc new file mode 100644 index 0000000..4185949 Binary files /dev/null and b/routes/__pycache__/admin.cpython-311.pyc differ diff --git a/routes/__pycache__/auth.cpython-311.pyc b/routes/__pycache__/auth.cpython-311.pyc new file mode 100644 index 0000000..875683b Binary files /dev/null and b/routes/__pycache__/auth.cpython-311.pyc differ diff --git a/routes/__pycache__/contacts.cpython-311.pyc b/routes/__pycache__/contacts.cpython-311.pyc new file mode 100644 index 0000000..4c8952a Binary files /dev/null and b/routes/__pycache__/contacts.cpython-311.pyc differ diff --git a/routes/__pycache__/conversations.cpython-311.pyc b/routes/__pycache__/conversations.cpython-311.pyc new file mode 100644 index 0000000..8fbf4c1 Binary files /dev/null and b/routes/__pycache__/conversations.cpython-311.pyc differ diff --git a/routes/__pycache__/email_templates.cpython-311.pyc b/routes/__pycache__/email_templates.cpython-311.pyc new file mode 100644 index 0000000..325fd59 Binary files /dev/null and b/routes/__pycache__/email_templates.cpython-311.pyc differ diff --git a/routes/__pycache__/main.cpython-311.pyc b/routes/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000..3c95f06 Binary files /dev/null and b/routes/__pycache__/main.cpython-311.pyc differ diff --git a/routes/__pycache__/room_files.cpython-311.pyc b/routes/__pycache__/room_files.cpython-311.pyc new file mode 100644 index 0000000..8cf355f Binary files /dev/null and b/routes/__pycache__/room_files.cpython-311.pyc differ diff --git a/routes/__pycache__/room_members.cpython-311.pyc b/routes/__pycache__/room_members.cpython-311.pyc new file mode 100644 index 0000000..479f744 Binary files /dev/null and b/routes/__pycache__/room_members.cpython-311.pyc differ diff --git a/routes/__pycache__/rooms.cpython-311.pyc b/routes/__pycache__/rooms.cpython-311.pyc new file mode 100644 index 0000000..d694566 Binary files /dev/null and b/routes/__pycache__/rooms.cpython-311.pyc differ diff --git a/routes/__pycache__/trash.cpython-311.pyc b/routes/__pycache__/trash.cpython-311.pyc new file mode 100644 index 0000000..b3d63d7 Binary files /dev/null and b/routes/__pycache__/trash.cpython-311.pyc differ diff --git a/routes/__pycache__/user.cpython-311.pyc b/routes/__pycache__/user.cpython-311.pyc new file mode 100644 index 0000000..24e92e1 Binary files /dev/null and b/routes/__pycache__/user.cpython-311.pyc differ diff --git a/routes/auth.py b/routes/auth.py index 44b6db4..e2eefdf 100644 --- a/routes/auth.py +++ b/routes/auth.py @@ -7,13 +7,6 @@ from utils import log_event, create_notification, get_unread_count auth_bp = Blueprint('auth', __name__) -@auth_bp.context_processor -def inject_unread_notifications(): - if current_user.is_authenticated: - unread_count = get_unread_count(current_user.id) - return {'unread_notifications': unread_count} - return {'unread_notifications': 0} - def require_password_change(f): @wraps(f) def decorated_function(*args, **kwargs): @@ -24,6 +17,13 @@ def require_password_change(f): return decorated_function def init_routes(auth_bp): + @auth_bp.context_processor + def inject_unread_notifications(): + if current_user.is_authenticated: + unread_count = get_unread_count(current_user.id) + return {'unread_notifications': unread_count} + return {'unread_notifications': 0} + @auth_bp.route('/login', methods=['GET', 'POST']) def login(): if current_user.is_authenticated: diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..ce8d60b --- /dev/null +++ b/start.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +echo "Waiting for database..." +while ! nc -z db 5432; do + sleep 0.1 +done +echo "Database is ready!" + +echo "Waiting for Redis..." +while ! nc -z redis 6379; do + sleep 0.1 +done +echo "Redis is ready!" + +echo "Running database migrations..." +flask db upgrade + +echo "Creating admin user..." +flask create-admin + +echo "Starting application..." +exec "$@" \ No newline at end of file diff --git a/update_migrations.py b/update_migrations.py new file mode 100644 index 0000000..603f51d --- /dev/null +++ b/update_migrations.py @@ -0,0 +1,71 @@ +import os +import re +from pathlib import Path + +def update_migration_file(file_path): + with open(file_path, 'r') as f: + content = f.read() + + # Skip if already has the pattern + if 'from sqlalchemy import inspect' in content: + return False + + # Add import if not present + if 'import sqlalchemy as sa' in content: + content = content.replace('import sqlalchemy as sa', 'import sqlalchemy as sa\nfrom sqlalchemy import inspect') + else: + content = content.replace('from alembic import op', 'from alembic import op\nfrom sqlalchemy import inspect') + + # Find all create_table operations + create_table_pattern = r'op\.create_table\([\'"](\w+)[\'"]' + tables = re.findall(create_table_pattern, content) + + for table in tables: + # Create the check pattern with proper indentation + check_pattern = f""" conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if '{table}' not in tables:""" + + # Find the create_table line and its indentation + create_table_line = f"op.create_table('{table}'" + if create_table_line in content: + # Get the indentation of the create_table line + lines = content.split('\n') + for i, line in enumerate(lines): + if create_table_line in line: + indent = len(line) - len(line.lstrip()) + # Add the check before the create_table with matching indentation + check_lines = check_pattern.split('\n') + check_lines = [' ' * indent + line.lstrip() for line in check_lines] + check_pattern = '\n'.join(check_lines) + # Add extra indentation to the create_table line + create_table_line = ' ' * (indent + 4) + create_table_line + # Replace in the content + content = content.replace(line, f"{check_pattern}\n{create_table_line}") + + # Write back the updated content + with open(file_path, 'w') as f: + f.write(content) + + return True + +def main(): + migrations_dir = Path('migrations/versions') + updated_files = [] + + for file in migrations_dir.glob('*.py'): + if file.name != '__init__.py': + if update_migration_file(file): + updated_files.append(file.name) + + if updated_files: + print("Updated the following migration files:") + for file in updated_files: + print(f"- {file}") + else: + print("No files needed updating.") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/utils/__pycache__/__init__.cpython-311.pyc b/utils/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..551e9df Binary files /dev/null and b/utils/__pycache__/__init__.cpython-311.pyc differ diff --git a/utils/__pycache__/email_templates.cpython-311.pyc b/utils/__pycache__/email_templates.cpython-311.pyc new file mode 100644 index 0000000..987392a Binary files /dev/null and b/utils/__pycache__/email_templates.cpython-311.pyc differ diff --git a/utils/__pycache__/event_logger.cpython-311.pyc b/utils/__pycache__/event_logger.cpython-311.pyc new file mode 100644 index 0000000..6a4b387 Binary files /dev/null and b/utils/__pycache__/event_logger.cpython-311.pyc differ diff --git a/utils/__pycache__/notification.cpython-311.pyc b/utils/__pycache__/notification.cpython-311.pyc new file mode 100644 index 0000000..86f8366 Binary files /dev/null and b/utils/__pycache__/notification.cpython-311.pyc differ diff --git a/utils/__pycache__/path_utils.cpython-311.pyc b/utils/__pycache__/path_utils.cpython-311.pyc new file mode 100644 index 0000000..f191024 Binary files /dev/null and b/utils/__pycache__/path_utils.cpython-311.pyc differ diff --git a/utils/__pycache__/permissions.cpython-311.pyc b/utils/__pycache__/permissions.cpython-311.pyc new file mode 100644 index 0000000..da57dab Binary files /dev/null and b/utils/__pycache__/permissions.cpython-311.pyc differ diff --git a/utils/__pycache__/time_utils.cpython-311.pyc b/utils/__pycache__/time_utils.cpython-311.pyc new file mode 100644 index 0000000..8d481ef Binary files /dev/null and b/utils/__pycache__/time_utils.cpython-311.pyc differ