Fix issues with new changes

This commit is contained in:
Minecon724 2025-04-07 10:02:54 +02:00
commit 5633ec7898
Signed by untrusted user who does not match committer: m724
GPG key ID: A02E6E67AB961189
8 changed files with 64 additions and 41 deletions

View file

@ -5,7 +5,7 @@ import os
from dotenv import load_dotenv from dotenv import load_dotenv
from flask_limiter import Limiter from flask_limiter import Limiter
from flask_limiter.util import get_remote_address from flask_limiter.util import get_remote_address
from flask import render_template, request, jsonify from flask import jsonify
from flask_wtf.csrf import CSRFProtect from flask_wtf.csrf import CSRFProtect
from flask_session import Session from flask_session import Session
import redis import redis
@ -43,13 +43,15 @@ DEFAULTS = {
} }
def get(key, type: type = str): def get(key, type: type = str):
env_value = os.environ.get(key) value = os.environ.get(key)
if value is None:
return DEFAULTS[key]
if env_value is not None:
if type == bool: if type == bool:
env_value = env_value.lower() == 'true' value = value.lower() == 'true'
return env_value or DEFAULTS[key] return value
app = Flask(__name__) app = Flask(__name__)
app.config['SECRET_KEY'] = get('SECRET_KEY') app.config['SECRET_KEY'] = get('SECRET_KEY')

View file

@ -0,0 +1,32 @@
from sqlalchemy import Column, DateTime, inspect
from sqlalchemy.sql import text
from flask import current_app
def run_migration(db):
"""Add deletion_timestamp column to the Inquiry table if it doesn't exist."""
current_app.logger.info("Running migration: add_deletion_timestamp")
# Check if the column already exists
inspector = inspect(db.engine)
columns = [col['name'] for col in inspector.get_columns('inquiry')]
# Track if we need to commit changes
changes_made = False
# Add deletion_timestamp column if it doesn't exist
if 'deletion_timestamp' not in columns:
current_app.logger.info("Adding deletion_timestamp column to inquiry table")
with db.engine.connect() as conn:
conn.execute(text("ALTER TABLE inquiry ADD COLUMN deletion_timestamp TIMESTAMP DEFAULT '9999-12-31 23:59:59'"))
# We need to commit within the connection context for some database types
conn.commit()
changes_made = True
else:
current_app.logger.info("deletion_timestamp column already exists in inquiry table")
if changes_made:
current_app.logger.info("Migration completed successfully")
else:
current_app.logger.info("No changes needed, column already exists")
return changes_made

View file

@ -1,7 +1,6 @@
from .. import db from .. import db
import secrets import secrets
from datetime import datetime, timedelta from datetime import datetime, timedelta, timezone
from flask import current_app
class Inquiry(db.Model): class Inquiry(db.Model):
id = db.Column(db.String(16), primary_key=True, unique=True, default=lambda: secrets.token_hex(8)) id = db.Column(db.String(16), primary_key=True, unique=True, default=lambda: secrets.token_hex(8))
@ -10,31 +9,25 @@ class Inquiry(db.Model):
order_by='Message.message_number') order_by='Message.message_number')
is_closed = db.Column(db.Boolean, default=False) is_closed = db.Column(db.Boolean, default=False)
closing_timestamp = db.Column(db.DateTime, nullable=True) closing_timestamp = db.Column(db.DateTime, nullable=True)
deletion_timestamp = db.Column(db.DateTime, nullable=True)
def close(self): def close(self, auto_delete_hours: int):
"""Mark an inquiry as closed""" """Mark an inquiry as closed"""
self.is_closed = True self.is_closed = True
self.closing_timestamp = datetime.utcnow() self.closing_timestamp = datetime.now(timezone.utc)
self.deletion_timestamp = self.closing_timestamp + timedelta(hours=auto_delete_hours)
def reopen(self): def reopen(self):
"""Reopen a closed inquiry""" """Reopen a closed inquiry"""
self.is_closed = False self.is_closed = False
self.closing_timestamp = None self.closing_timestamp = None
self.deletion_timestamp = None
@staticmethod @staticmethod
def get_expired_inquiries(hours=None): def get_expired_inquiries():
"""Get inquiries that have been closed for more than the specified hours""" """Get inquiries that have been closed for more than the specified hours and should be deleted"""
if hours is None: now = datetime.now(timezone.utc)
hours = current_app.config.get('AUTO_DELETE_HOURS')
expiry_date = datetime.utcnow() - timedelta(hours=hours)
return Inquiry.query.filter( return Inquiry.query.filter(
Inquiry.is_closed == True, Inquiry.is_closed == True,
Inquiry.closing_timestamp <= expiry_date Inquiry.deletion_timestamp <= now
).all() ).all()
def get_deletion_date(self):
"""Get the deletion date for a closed inquiry"""
if self.is_closed:
hours = current_app.config.get('AUTO_DELETE_HOURS')
return self.closing_timestamp + timedelta(hours=hours)
return None

View file

@ -50,7 +50,7 @@ def _send_event(event_type: str, inquiry_id: str, message: str = None, is_async:
title=EVENT_TYPES[event_type].format(inquiry_id), title=EVENT_TYPES[event_type].format(inquiry_id),
inquiry_id=inquiry_id, inquiry_id=inquiry_id,
data={ data={
'message': _get_message_preview(message) 'message': _get_message_preview(message) if message else None
}, },
is_async=is_async is_async=is_async
) )
@ -59,7 +59,7 @@ def _send_event(event_type: str, inquiry_id: str, message: str = None, is_async:
event_type=event_type, event_type=event_type,
data={ data={
'inquiry_id': inquiry_id, 'inquiry_id': inquiry_id,
'message': _get_message_preview(message) 'message': _get_message_preview(message) if message else None
}, },
is_async=is_async is_async=is_async
) )

View file

@ -1,8 +1,7 @@
from flask import request, jsonify, render_template, redirect, url_for, flash, session, make_response from flask import request, jsonify, render_template, redirect, url_for, flash, make_response
from . import app, db, limiter, csrf, notifiers from . import app, db, limiter, notifiers
from .models import Inquiry, Message, Settings, Admin from .models import Inquiry, Message, Settings
import os
import json import json
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
@ -225,7 +224,8 @@ def close_inquiry(inquiry_id):
# Only close if not already closed # Only close if not already closed
if not inquiry.is_closed: if not inquiry.is_closed:
inquiry.close() settings = Settings.query.first()
inquiry.close(settings.auto_delete_hours)
db.session.commit() db.session.commit()
# Send notifications for closed inquiry # Send notifications for closed inquiry

View file

@ -1,7 +1,6 @@
from flask import current_app from flask import current_app
from . import db from . import db
from .models import Inquiry from .models import Inquiry
from datetime import datetime
def check_and_delete_expired_inquiries(): def check_and_delete_expired_inquiries():
"""Check and delete inquiries that have been closed for more than the configured number of hours""" """Check and delete inquiries that have been closed for more than the configured number of hours"""
@ -9,8 +8,7 @@ def check_and_delete_expired_inquiries():
app = current_app._get_current_object() app = current_app._get_current_object()
with app.app_context(): with app.app_context():
auto_delete_hours = app.config.get('AUTO_DELETE_HOURS') app.logger.info(f"Running scheduled task: check_and_delete_expired_inquiries")
app.logger.info(f"Running scheduled task: check_and_delete_expired_inquiries (delete after {auto_delete_hours} hours)")
expired_inquiries = Inquiry.get_expired_inquiries() expired_inquiries = Inquiry.get_expired_inquiries()
deleted_count = 0 deleted_count = 0

View file

@ -28,11 +28,9 @@
<td> <td>
{% if item.inquiry.is_closed %} {% if item.inquiry.is_closed %}
<span style="color: #d3d3d3; font-size: 0.8rem; padding: 0.2rem 0.4rem; background-color: #444444; border-radius: 0.25rem;">CLOSED</span> <span style="color: #d3d3d3; font-size: 0.8rem; padding: 0.2rem 0.4rem; background-color: #444444; border-radius: 0.25rem;">CLOSED</span>
{% if item.inquiry.closing_timestamp %}
<span style="display: block; font-size: 0.7rem; margin-top: 0.2rem; color: #a9a9a9;"> <span style="display: block; font-size: 0.7rem; margin-top: 0.2rem; color: #a9a9a9;">
Closed on {{ item.inquiry.closing_timestamp.strftime('%Y-%m-%d %H:%M') }} Closed on {{ item.inquiry.closing_timestamp.strftime('%Y-%m-%d %H:%M') }}
</span> </span>
{% endif %}
{% else %} {% else %}
<span style="color: #4caf50; font-size: 0.8rem; padding: 0.2rem 0.4rem; background-color: #333333; border-radius: 0.25rem;">OPEN</span> <span style="color: #4caf50; font-size: 0.8rem; padding: 0.2rem 0.4rem; background-color: #333333; border-radius: 0.25rem;">OPEN</span>
{% endif %} {% endif %}

View file

@ -22,7 +22,7 @@
{% if inquiry.is_closed %} {% if inquiry.is_closed %}
<div style="margin-bottom: 1rem; padding: 0.75rem; background-color: #3a3a3a; border-radius: 0.25rem; border-left: 4px solid #8c8c8c; color: #f0f0f0;"> <div style="margin-bottom: 1rem; padding: 0.75rem; background-color: #3a3a3a; border-radius: 0.25rem; border-left: 4px solid #8c8c8c; color: #f0f0f0;">
<strong>This inquiry is closed.</strong> <strong>This inquiry is closed.</strong>
{% if inquiry.closing_timestamp %}It will be deleted on {{ inquiry.get_deletion_date().strftime('%Y-%m-%d %H:%M') }} UTC.{% endif %} {% if inquiry.closing_timestamp %}It will be deleted on {{ inquiry.deletion_timestamp.strftime('%Y-%m-%d %H:%M') }} UTC.{% endif %}
</div> </div>
{% endif %} {% endif %}