user logging

This commit is contained in:
2025-05-29 22:33:05 +02:00
parent 5dbdd43785
commit 8f24e21d5d
9 changed files with 340 additions and 113 deletions

View File

@@ -1,4 +1,4 @@
from flask import render_template, Blueprint, redirect, url_for, request, flash, Response, jsonify
from flask import render_template, Blueprint, redirect, url_for, request, flash, Response, jsonify, session
from flask_login import current_user, login_required
from models import User, db, Room, RoomFile, RoomMemberPermission, SiteSettings, Event
from routes.auth import require_password_change
@@ -9,7 +9,6 @@ from datetime import datetime, timedelta
import logging
import sys
import time
from flask import session
# Set up logging to show in console
logging.basicConfig(
@@ -356,11 +355,62 @@ def init_routes(main_bp):
site_settings = SiteSettings.get_settings()
active_tab = request.args.get('tab', 'colors')
# Get events data if events tab is active
events = None
total_pages = 1
current_page = 1
users = []
if active_tab == 'events':
# Get filter parameters
event_type = request.args.get('event_type')
date_range = request.args.get('date_range', '7d')
user_id = request.args.get('user_id')
page = request.args.get('page', 1, type=int)
per_page = 50
# Calculate date range
end_date = datetime.utcnow()
if date_range == '24h':
start_date = end_date - timedelta(days=1)
elif date_range == '7d':
start_date = end_date - timedelta(days=7)
elif date_range == '30d':
start_date = end_date - timedelta(days=30)
else:
start_date = None
# Build query
query = Event.query
if event_type:
query = query.filter_by(event_type=event_type)
if start_date:
query = query.filter(Event.timestamp >= start_date)
if user_id:
query = query.filter_by(user_id=user_id)
# Get total count for pagination
total_events = query.count()
total_pages = (total_events + per_page - 1) // per_page
# Get paginated events
events = query.order_by(Event.timestamp.desc()).paginate(page=page, per_page=per_page)
# Get all users for filter dropdown
users = User.query.order_by(User.username).all()
return render_template('settings/settings.html',
primary_color=site_settings.primary_color,
secondary_color=site_settings.secondary_color,
active_tab=active_tab,
site_settings=site_settings)
site_settings=site_settings,
events=events.items if events else None,
total_pages=total_pages,
current_page=current_page,
users=users,
csrf_token=session.get('csrf_token'))
@main_bp.route('/settings/colors', methods=['POST'])
@login_required
@@ -578,13 +628,29 @@ def init_routes(main_bp):
# Get all users for filter dropdown
users = User.query.order_by(User.username).all()
return render_template('settings/tabs/events.html',
# Check if this is an AJAX request
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
logger.info(f"Processing AJAX request for events. Found {len(events.items)} events")
return render_template('settings/tabs/events.html',
events=events.items,
total_pages=total_pages,
current_page=page,
event_type=event_type,
date_range=date_range,
user_id=user_id,
users=users,
csrf_token=session.get('csrf_token'))
# For full page requests, render the full settings page
site_settings = SiteSettings.get_settings()
return render_template('settings/settings.html',
primary_color=site_settings.primary_color,
secondary_color=site_settings.secondary_color,
active_tab='events',
site_settings=site_settings,
events=events.items,
total_pages=total_pages,
current_page=page,
event_type=event_type,
date_range=date_range,
user_id=user_id,
users=users,
csrf_token=session.get('csrf_token'))
@@ -595,16 +661,33 @@ def init_routes(main_bp):
return jsonify({'error': 'Unauthorized'}), 403
event = Event.query.get_or_404(event_id)
return jsonify({
logger.info(f"Raw event object: {event}")
logger.info(f"Event details type: {type(event.details)}")
logger.info(f"Event details value: {event.details}")
# Convert details to dict if it's a string
details = event.details
if isinstance(details, str):
try:
import json
details = json.loads(details)
except json.JSONDecodeError:
details = {'raw_details': details}
# Return the raw event data
response_data = {
'id': event.id,
'event_type': event.event_type,
'timestamp': event.timestamp.isoformat(),
'user': {
'id': event.user.id,
'username': event.user.username,
'last_name': event.user.last_name
},
'timestamp': event.timestamp.isoformat(),
'details': event.details,
} if event.user else None,
'ip_address': event.ip_address,
'user_agent': event.user_agent
})
'user_agent': event.user_agent,
'details': details
}
logger.info(f"Sending response: {response_data}")
return jsonify(response_data)