diff --git a/.gitignore b/.gitignore index 0ccb35d..4f00b69 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,7 @@ logs/ *.log # Testing -coverage/ \ No newline at end of file +coverage/ + +# Python cache +__pycache__/ \ No newline at end of file diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index 22801ae..8ac1093 100644 Binary files a/__pycache__/app.cpython-313.pyc and b/__pycache__/app.cpython-313.pyc differ diff --git a/__pycache__/extensions.cpython-313.pyc b/__pycache__/extensions.cpython-313.pyc index e639f70..6df1ab4 100644 Binary files a/__pycache__/extensions.cpython-313.pyc and b/__pycache__/extensions.cpython-313.pyc differ diff --git a/__pycache__/forms.cpython-313.pyc b/__pycache__/forms.cpython-313.pyc index 36a76b8..ebfddfa 100644 Binary files a/__pycache__/forms.cpython-313.pyc and b/__pycache__/forms.cpython-313.pyc differ diff --git a/__pycache__/models.cpython-313.pyc b/__pycache__/models.cpython-313.pyc index 704ae3b..acd6ac8 100644 Binary files a/__pycache__/models.cpython-313.pyc and b/__pycache__/models.cpython-313.pyc differ diff --git a/migrations/add_events_table.py b/migrations/add_events_table.py deleted file mode 100644 index db198aa..0000000 --- a/migrations/add_events_table.py +++ /dev/null @@ -1,61 +0,0 @@ -import os -import sys -from pathlib import Path - -# Add the parent directory to Python path so we can import from root -sys.path.append(str(Path(__file__).parent.parent)) - -from flask import Flask -from flask_sqlalchemy import SQLAlchemy -from extensions import db -from sqlalchemy import text - -def upgrade(): - # Create events table - with db.engine.connect() as conn: - conn.execute(text(''' - CREATE TABLE IF NOT EXISTS events ( - id SERIAL PRIMARY KEY, - event_type VARCHAR(50) NOT NULL, - user_id INTEGER NOT NULL REFERENCES "user" (id), - timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - details JSONB, - ip_address VARCHAR(45), - user_agent VARCHAR(255) - ); - - -- Create index on event_type for faster filtering - CREATE INDEX IF NOT EXISTS idx_events_event_type ON events(event_type); - - -- Create index on timestamp for faster date-based queries - CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp); - - -- Create index on user_id for faster user-based queries - CREATE INDEX IF NOT EXISTS idx_events_user_id ON events(user_id); - ''')) - conn.commit() - -def downgrade(): - # Drop events table and its indexes - with db.engine.connect() as conn: - conn.execute(text(''' - DROP INDEX IF EXISTS idx_events_event_type; - DROP INDEX IF EXISTS idx_events_timestamp; - DROP INDEX IF EXISTS idx_events_user_id; - DROP TABLE IF EXISTS events; - ''')) - conn.commit() - -if __name__ == '__main__': - app = Flask(__name__) - - # Use the same database configuration as in app.py - app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'postgresql://postgres:1253@localhost:5432/docupulse') - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False - - print("Connecting to database...") - - db.init_app(app) - - with app.app_context(): - upgrade() \ No newline at end of file diff --git a/migrations/add_notifs_table.py b/migrations/add_notifs_table.py deleted file mode 100644 index 4153c77..0000000 --- a/migrations/add_notifs_table.py +++ /dev/null @@ -1,61 +0,0 @@ -import os -import sys -from pathlib import Path - -# Add the parent directory to Python path so we can import from root -sys.path.append(str(Path(__file__).parent.parent)) - -from flask import Flask -from flask_sqlalchemy import SQLAlchemy -from extensions import db -from sqlalchemy import text - -def upgrade(): - # Create notifs table - with db.engine.connect() as conn: - conn.execute(text(''' - CREATE TABLE IF NOT EXISTS notifs ( - id SERIAL PRIMARY KEY, - notif_type VARCHAR(50) NOT NULL, - user_id INTEGER NOT NULL REFERENCES "user" (id), - sender_id INTEGER REFERENCES "user" (id), - timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - read BOOLEAN NOT NULL DEFAULT FALSE, - details JSONB - ); - - -- Create indexes for faster queries - CREATE INDEX IF NOT EXISTS idx_notifs_notif_type ON notifs(notif_type); - CREATE INDEX IF NOT EXISTS idx_notifs_timestamp ON notifs(timestamp); - CREATE INDEX IF NOT EXISTS idx_notifs_user_id ON notifs(user_id); - CREATE INDEX IF NOT EXISTS idx_notifs_sender_id ON notifs(sender_id); - CREATE INDEX IF NOT EXISTS idx_notifs_read ON notifs(read); - ''')) - conn.commit() - -def downgrade(): - # Drop notifs table and its indexes - with db.engine.connect() as conn: - conn.execute(text(''' - DROP INDEX IF EXISTS idx_notifs_notif_type; - DROP INDEX IF EXISTS idx_notifs_timestamp; - DROP INDEX IF EXISTS idx_notifs_user_id; - DROP INDEX IF EXISTS idx_notifs_sender_id; - DROP INDEX IF EXISTS idx_notifs_read; - DROP TABLE IF EXISTS notifs; - ''')) - conn.commit() - -if __name__ == '__main__': - app = Flask(__name__) - - # Use the same database configuration as in app.py - app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'postgresql://postgres:1253@localhost:5432/docupulse') - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False - - print("Connecting to database...") - - db.init_app(app) - - with app.app_context(): - upgrade() \ No newline at end of file diff --git a/migrations/versions/__pycache__/0a8006bd1732_add_key_value_settings_table.cpython-313.pyc b/migrations/versions/__pycache__/0a8006bd1732_add_key_value_settings_table.cpython-313.pyc index db91cf9..17f608f 100644 Binary files a/migrations/versions/__pycache__/0a8006bd1732_add_key_value_settings_table.cpython-313.pyc and b/migrations/versions/__pycache__/0a8006bd1732_add_key_value_settings_table.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/0f48943140fa_add_file_attachment_fields_to_message_.cpython-313.pyc b/migrations/versions/__pycache__/0f48943140fa_add_file_attachment_fields_to_message_.cpython-313.pyc index c78a729..8ca136b 100644 Binary files a/migrations/versions/__pycache__/0f48943140fa_add_file_attachment_fields_to_message_.cpython-313.pyc and b/migrations/versions/__pycache__/0f48943140fa_add_file_attachment_fields_to_message_.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/1c297825e3a9_add_user_authentication_fields.cpython-313.pyc b/migrations/versions/__pycache__/1c297825e3a9_add_user_authentication_fields.cpython-313.pyc index c3ba359..979b3a2 100644 Binary files a/migrations/versions/__pycache__/1c297825e3a9_add_user_authentication_fields.cpython-313.pyc and b/migrations/versions/__pycache__/1c297825e3a9_add_user_authentication_fields.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/20519a2437c2_add_mails_table.cpython-313.pyc b/migrations/versions/__pycache__/20519a2437c2_add_mails_table.cpython-313.pyc index 573e08f..8896c3d 100644 Binary files a/migrations/versions/__pycache__/20519a2437c2_add_mails_table.cpython-313.pyc and b/migrations/versions/__pycache__/20519a2437c2_add_mails_table.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/25da158dd705_add_is_admin_to_contact_model.cpython-313.pyc b/migrations/versions/__pycache__/25da158dd705_add_is_admin_to_contact_model.cpython-313.pyc index 650458a..167989b 100644 Binary files a/migrations/versions/__pycache__/25da158dd705_add_is_admin_to_contact_model.cpython-313.pyc and b/migrations/versions/__pycache__/25da158dd705_add_is_admin_to_contact_model.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/26b0e5357f52_add_room_member_permissions_table.cpython-313.pyc b/migrations/versions/__pycache__/26b0e5357f52_add_room_member_permissions_table.cpython-313.pyc index 7149de9..a8bf513 100644 Binary files a/migrations/versions/__pycache__/26b0e5357f52_add_room_member_permissions_table.cpython-313.pyc and b/migrations/versions/__pycache__/26b0e5357f52_add_room_member_permissions_table.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/2c5f57dddb78_add_room_members_table.cpython-313.pyc b/migrations/versions/__pycache__/2c5f57dddb78_add_room_members_table.cpython-313.pyc index 4e341c1..92f1cd7 100644 Binary files a/migrations/versions/__pycache__/2c5f57dddb78_add_room_members_table.cpython-313.pyc and b/migrations/versions/__pycache__/2c5f57dddb78_add_room_members_table.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/3a5b8d8e53cd_add_rooms_table.cpython-313.pyc b/migrations/versions/__pycache__/3a5b8d8e53cd_add_rooms_table.cpython-313.pyc index cffd41e..c8ce1ae 100644 Binary files a/migrations/versions/__pycache__/3a5b8d8e53cd_add_rooms_table.cpython-313.pyc and b/migrations/versions/__pycache__/3a5b8d8e53cd_add_rooms_table.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/43dfd2543fad_add_contact_fields_to_user_model.cpython-313.pyc b/migrations/versions/__pycache__/43dfd2543fad_add_contact_fields_to_user_model.cpython-313.pyc index a627b59..5b6a7c4 100644 Binary files a/migrations/versions/__pycache__/43dfd2543fad_add_contact_fields_to_user_model.cpython-313.pyc and b/migrations/versions/__pycache__/43dfd2543fad_add_contact_fields_to_user_model.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/444d76da74ba_add_notifications_table.cpython-313.pyc b/migrations/versions/__pycache__/444d76da74ba_add_notifications_table.cpython-313.pyc index 0f458ec..5b4a046 100644 Binary files a/migrations/versions/__pycache__/444d76da74ba_add_notifications_table.cpython-313.pyc and b/migrations/versions/__pycache__/444d76da74ba_add_notifications_table.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/64b5c28510b0_add_room_file_table_for_file_folder_.cpython-313.pyc b/migrations/versions/__pycache__/64b5c28510b0_add_room_file_table_for_file_folder_.cpython-313.pyc index 0b51f76..5e2d94e 100644 Binary files a/migrations/versions/__pycache__/64b5c28510b0_add_room_file_table_for_file_folder_.cpython-313.pyc and b/migrations/versions/__pycache__/64b5c28510b0_add_room_file_table_for_file_folder_.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/6651332488d9_add_starred_column_to_room_file_table.cpython-313.pyc b/migrations/versions/__pycache__/6651332488d9_add_starred_column_to_room_file_table.cpython-313.pyc index dcb79da..324f419 100644 Binary files a/migrations/versions/__pycache__/6651332488d9_add_starred_column_to_room_file_table.cpython-313.pyc and b/migrations/versions/__pycache__/6651332488d9_add_starred_column_to_room_file_table.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/7554ab70efe7_fix_existing_users.cpython-313.pyc b/migrations/versions/__pycache__/7554ab70efe7_fix_existing_users.cpython-313.pyc index 6601fda..c83170e 100644 Binary files a/migrations/versions/__pycache__/7554ab70efe7_fix_existing_users.cpython-313.pyc and b/migrations/versions/__pycache__/7554ab70efe7_fix_existing_users.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/76da0573e84b_merge_heads.cpython-313.pyc b/migrations/versions/__pycache__/76da0573e84b_merge_heads.cpython-313.pyc index c3f2a58..2a254d6 100644 Binary files a/migrations/versions/__pycache__/76da0573e84b_merge_heads.cpython-313.pyc and b/migrations/versions/__pycache__/76da0573e84b_merge_heads.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/787468cfea77_add_company_information_fields_to_.cpython-313.pyc b/migrations/versions/__pycache__/787468cfea77_add_company_information_fields_to_.cpython-313.pyc index 10a9891..5ad4a67 100644 Binary files a/migrations/versions/__pycache__/787468cfea77_add_company_information_fields_to_.cpython-313.pyc and b/migrations/versions/__pycache__/787468cfea77_add_company_information_fields_to_.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/7a5747dc773f_update_last_name_field_in_user_model.cpython-313.pyc b/migrations/versions/__pycache__/7a5747dc773f_update_last_name_field_in_user_model.cpython-313.pyc index 2ae9513..85bfd73 100644 Binary files a/migrations/versions/__pycache__/7a5747dc773f_update_last_name_field_in_user_model.cpython-313.pyc and b/migrations/versions/__pycache__/7a5747dc773f_update_last_name_field_in_user_model.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/9faab7ef6036_add_site_settings_table.cpython-313.pyc b/migrations/versions/__pycache__/9faab7ef6036_add_site_settings_table.cpython-313.pyc index a05bed2..7f47ce5 100644 Binary files a/migrations/versions/__pycache__/9faab7ef6036_add_site_settings_table.cpython-313.pyc and b/migrations/versions/__pycache__/9faab7ef6036_add_site_settings_table.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/add_conversations_tables.cpython-313.pyc b/migrations/versions/__pycache__/add_conversations_tables.cpython-313.pyc index 31a94fe..07f97ce 100644 Binary files a/migrations/versions/__pycache__/add_conversations_tables.cpython-313.pyc and b/migrations/versions/__pycache__/add_conversations_tables.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/add_deleted_by_to_room_file.cpython-313.pyc b/migrations/versions/__pycache__/add_deleted_by_to_room_file.cpython-313.pyc index 65b7a36..6577614 100644 Binary files a/migrations/versions/__pycache__/add_deleted_by_to_room_file.cpython-313.pyc and b/migrations/versions/__pycache__/add_deleted_by_to_room_file.cpython-313.pyc differ diff --git a/migrations/versions/__pycache__/add_deleted_column_to_room_file.cpython-313.pyc b/migrations/versions/__pycache__/add_deleted_column_to_room_file.cpython-313.pyc index b63e597..79d831d 100644 Binary files a/migrations/versions/__pycache__/add_deleted_column_to_room_file.cpython-313.pyc and b/migrations/versions/__pycache__/add_deleted_column_to_room_file.cpython-313.pyc differ diff --git a/migrations/versions/add_events_table.py b/migrations/versions/add_events_table.py new file mode 100644 index 0000000..b6bcb1e --- /dev/null +++ b/migrations/versions/add_events_table.py @@ -0,0 +1,42 @@ +"""create events table + +Revision ID: add_events_table +Revises: f18735338888 +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. +revision = 'add_events_table' +down_revision = 'f18735338888' +branch_labels = None +depends_on = None + +def upgrade(): + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'events' not in tables: + op.create_table( + 'events', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('event_type', sa.String(50), nullable=False), + sa.Column('user_id', sa.Integer, sa.ForeignKey('user.id'), nullable=True), + sa.Column('timestamp', sa.DateTime, nullable=False), + sa.Column('details', sa.JSON), + sa.Column('ip_address', sa.String(45)), + sa.Column('user_agent', sa.String(255)), + ) + op.create_index('idx_events_event_type', 'events', ['event_type']) + op.create_index('idx_events_timestamp', 'events', ['timestamp']) + op.create_index('idx_events_user_id', 'events', ['user_id']) + +def downgrade(): + op.drop_index('idx_events_event_type', table_name='events') + op.drop_index('idx_events_timestamp', table_name='events') + op.drop_index('idx_events_user_id', table_name='events') + op.drop_table('events') \ No newline at end of file diff --git a/migrations/versions/add_notifs_table.py b/migrations/versions/add_notifs_table.py new file mode 100644 index 0000000..bb295ad --- /dev/null +++ b/migrations/versions/add_notifs_table.py @@ -0,0 +1,46 @@ +"""create notifs table + +Revision ID: add_notifs_table +Revises: add_events_table +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. +revision = 'add_notifs_table' +down_revision = 'add_events_table' +branch_labels = None +depends_on = None + +def upgrade(): + conn = op.get_bind() + inspector = inspect(conn) + tables = inspector.get_table_names() + + if 'notifs' not in tables: + op.create_table( + 'notifs', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('notif_type', sa.String(50), nullable=False), + sa.Column('user_id', sa.Integer, sa.ForeignKey('user.id'), nullable=False), + sa.Column('sender_id', sa.Integer, sa.ForeignKey('user.id'), nullable=True), + sa.Column('timestamp', sa.DateTime, nullable=False), + sa.Column('read', sa.Boolean, nullable=False, default=False), + sa.Column('details', sa.JSON), + ) + op.create_index('idx_notifs_notif_type', 'notifs', ['notif_type']) + op.create_index('idx_notifs_timestamp', 'notifs', ['timestamp']) + op.create_index('idx_notifs_user_id', 'notifs', ['user_id']) + op.create_index('idx_notifs_sender_id', 'notifs', ['sender_id']) + op.create_index('idx_notifs_read', 'notifs', ['read']) + +def downgrade(): + op.drop_index('idx_notifs_notif_type', table_name='notifs') + op.drop_index('idx_notifs_timestamp', table_name='notifs') + op.drop_index('idx_notifs_user_id', table_name='notifs') + op.drop_index('idx_notifs_sender_id', table_name='notifs') + op.drop_index('idx_notifs_read', table_name='notifs') + op.drop_table('notifs') \ No newline at end of file diff --git a/migrations/versions/make_events_user_id_nullable.py b/migrations/versions/make_events_user_id_nullable.py new file mode 100644 index 0000000..eed184c --- /dev/null +++ b/migrations/versions/make_events_user_id_nullable.py @@ -0,0 +1,27 @@ +"""make events user_id nullable + +Revision ID: make_events_user_id_nullable +Revises: f18735338888 +Create Date: 2024-03-19 10:00:00.000000 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'make_events_user_id_nullable' +down_revision = 'f18735338888' # This should be the latest migration +branch_labels = None +depends_on = None + +def upgrade(): + # Make user_id nullable in events table + op.alter_column('events', 'user_id', + existing_type=sa.Integer(), + nullable=True) + +def downgrade(): + # Make user_id non-nullable again + op.alter_column('events', 'user_id', + existing_type=sa.Integer(), + nullable=False) \ No newline at end of file diff --git a/models.py b/models.py index 5b69336..5ecca45 100644 --- a/models.py +++ b/models.py @@ -284,7 +284,7 @@ class Event(db.Model): __tablename__ = 'events' id = db.Column(db.Integer, primary_key=True) event_type = db.Column(db.String(50), nullable=False) - user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True) timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) details = db.Column(db.JSON) # Store additional event-specific data ip_address = db.Column(db.String(45)) # IPv6 addresses can be up to 45 chars diff --git a/routes/__pycache__/__init__.cpython-313.pyc b/routes/__pycache__/__init__.cpython-313.pyc index 3cb40c7..f9adde5 100644 Binary files a/routes/__pycache__/__init__.cpython-313.pyc and b/routes/__pycache__/__init__.cpython-313.pyc differ diff --git a/routes/__pycache__/auth.cpython-313.pyc b/routes/__pycache__/auth.cpython-313.pyc index a08b475..5945f21 100644 Binary files a/routes/__pycache__/auth.cpython-313.pyc and b/routes/__pycache__/auth.cpython-313.pyc differ diff --git a/routes/__pycache__/contacts.cpython-313.pyc b/routes/__pycache__/contacts.cpython-313.pyc index 5033b2b..a3236ba 100644 Binary files a/routes/__pycache__/contacts.cpython-313.pyc and b/routes/__pycache__/contacts.cpython-313.pyc differ diff --git a/routes/__pycache__/conversations.cpython-313.pyc b/routes/__pycache__/conversations.cpython-313.pyc index c049c16..8e064bc 100644 Binary files a/routes/__pycache__/conversations.cpython-313.pyc and b/routes/__pycache__/conversations.cpython-313.pyc differ diff --git a/routes/__pycache__/email_templates.cpython-313.pyc b/routes/__pycache__/email_templates.cpython-313.pyc index a6ccd06..b0b1d47 100644 Binary files a/routes/__pycache__/email_templates.cpython-313.pyc and b/routes/__pycache__/email_templates.cpython-313.pyc differ diff --git a/routes/__pycache__/main.cpython-313.pyc b/routes/__pycache__/main.cpython-313.pyc index 235ab63..599ff98 100644 Binary files a/routes/__pycache__/main.cpython-313.pyc and b/routes/__pycache__/main.cpython-313.pyc differ diff --git a/routes/__pycache__/room_files.cpython-313.pyc b/routes/__pycache__/room_files.cpython-313.pyc index 325372a..68acc76 100644 Binary files a/routes/__pycache__/room_files.cpython-313.pyc and b/routes/__pycache__/room_files.cpython-313.pyc differ diff --git a/routes/__pycache__/room_members.cpython-313.pyc b/routes/__pycache__/room_members.cpython-313.pyc index 1f599c7..0dae646 100644 Binary files a/routes/__pycache__/room_members.cpython-313.pyc and b/routes/__pycache__/room_members.cpython-313.pyc differ diff --git a/routes/__pycache__/rooms.cpython-313.pyc b/routes/__pycache__/rooms.cpython-313.pyc index 4dc7618..998c3b6 100644 Binary files a/routes/__pycache__/rooms.cpython-313.pyc and b/routes/__pycache__/rooms.cpython-313.pyc differ diff --git a/routes/__pycache__/trash.cpython-313.pyc b/routes/__pycache__/trash.cpython-313.pyc index dc05ee3..9454b69 100644 Binary files a/routes/__pycache__/trash.cpython-313.pyc and b/routes/__pycache__/trash.cpython-313.pyc differ diff --git a/utils/__pycache__/__init__.cpython-313.pyc b/utils/__pycache__/__init__.cpython-313.pyc index 0005d16..e291b18 100644 Binary files a/utils/__pycache__/__init__.cpython-313.pyc and b/utils/__pycache__/__init__.cpython-313.pyc differ diff --git a/utils/__pycache__/email_templates.cpython-313.pyc b/utils/__pycache__/email_templates.cpython-313.pyc index 8f5e9ae..354ae44 100644 Binary files a/utils/__pycache__/email_templates.cpython-313.pyc and b/utils/__pycache__/email_templates.cpython-313.pyc differ diff --git a/utils/__pycache__/event_logger.cpython-313.pyc b/utils/__pycache__/event_logger.cpython-313.pyc index d89842b..dad25b1 100644 Binary files a/utils/__pycache__/event_logger.cpython-313.pyc and b/utils/__pycache__/event_logger.cpython-313.pyc differ diff --git a/utils/__pycache__/notification.cpython-313.pyc b/utils/__pycache__/notification.cpython-313.pyc index c6b6d5d..4d2532f 100644 Binary files a/utils/__pycache__/notification.cpython-313.pyc and b/utils/__pycache__/notification.cpython-313.pyc differ diff --git a/utils/__pycache__/path_utils.cpython-313.pyc b/utils/__pycache__/path_utils.cpython-313.pyc index e5a3042..f6995fe 100644 Binary files a/utils/__pycache__/path_utils.cpython-313.pyc and b/utils/__pycache__/path_utils.cpython-313.pyc differ diff --git a/utils/__pycache__/permissions.cpython-313.pyc b/utils/__pycache__/permissions.cpython-313.pyc index 60f7b0b..ca5d04b 100644 Binary files a/utils/__pycache__/permissions.cpython-313.pyc and b/utils/__pycache__/permissions.cpython-313.pyc differ diff --git a/utils/__pycache__/time_utils.cpython-313.pyc b/utils/__pycache__/time_utils.cpython-313.pyc index 4510000..2ad6f49 100644 Binary files a/utils/__pycache__/time_utils.cpython-313.pyc and b/utils/__pycache__/time_utils.cpython-313.pyc differ