File preview
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -1021,4 +1021,71 @@ def init_routes(main_bp):
|
||||
}
|
||||
|
||||
logger.info(f"Sending response: {response_data}")
|
||||
return jsonify(response_data)
|
||||
return jsonify(response_data)
|
||||
|
||||
@main_bp.route('/settings/events/download')
|
||||
@login_required
|
||||
def download_events():
|
||||
if not current_user.is_admin:
|
||||
flash('Only administrators can download event logs.', 'error')
|
||||
return redirect(url_for('main.dashboard'))
|
||||
|
||||
# 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')
|
||||
|
||||
# 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 all events
|
||||
events = query.order_by(Event.timestamp.desc()).all()
|
||||
|
||||
# Create CSV content
|
||||
import csv
|
||||
import io
|
||||
|
||||
output = io.StringIO()
|
||||
writer = csv.writer(output)
|
||||
|
||||
# Write header
|
||||
writer.writerow(['Timestamp', 'Event Type', 'User', 'Details', 'IP Address'])
|
||||
|
||||
# Write data
|
||||
for event in events:
|
||||
user_name = f"{event.user.username} {event.user.last_name}" if event.user else "System"
|
||||
writer.writerow([
|
||||
event.timestamp.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
event.event_type,
|
||||
user_name,
|
||||
str(event.details),
|
||||
event.ip_address
|
||||
])
|
||||
|
||||
# Create the response
|
||||
output.seek(0)
|
||||
return Response(
|
||||
output,
|
||||
mimetype='text/csv',
|
||||
headers={
|
||||
'Content-Disposition': f'attachment; filename=event_log_{datetime.utcnow().strftime("%Y%m%d_%H%M%S")}.csv'
|
||||
}
|
||||
)
|
||||
@@ -275,41 +275,53 @@ def upload_room_file(room_id):
|
||||
@login_required
|
||||
def download_room_file(room_id, filename):
|
||||
"""
|
||||
Download a file from a room.
|
||||
Download or preview a file from a room.
|
||||
|
||||
Args:
|
||||
room_id (int): ID of the room containing the file
|
||||
filename (str): Name of the file to download
|
||||
filename (str): Name of the file to download/preview
|
||||
|
||||
Returns:
|
||||
File download response or error message
|
||||
File download/preview response or error message
|
||||
"""
|
||||
room = Room.query.get_or_404(room_id)
|
||||
if not user_has_permission(room, 'can_download'):
|
||||
abort(403)
|
||||
|
||||
rel_path = clean_path(request.args.get('path', ''))
|
||||
preview_mode = request.args.get('preview', 'false').lower() == 'true'
|
||||
|
||||
# Lookup in RoomFile
|
||||
rf = RoomFile.query.filter_by(room_id=room_id, name=filename, path=rel_path).first()
|
||||
if not rf or rf.type != 'file':
|
||||
return jsonify({'error': 'File not found'}), 404
|
||||
|
||||
room_dir = get_room_dir(room_id)
|
||||
file_path = os.path.join(room_dir, rel_path, filename) if rel_path else os.path.join(room_dir, filename)
|
||||
if not os.path.exists(file_path):
|
||||
return jsonify({'error': 'File not found'}), 404
|
||||
|
||||
# Log the event
|
||||
log_event(
|
||||
event_type='file_download',
|
||||
event_type='file_download' if not preview_mode else 'file_preview',
|
||||
details={
|
||||
'downloaded_by': f"{current_user.username} {current_user.last_name}",
|
||||
'user': f"{current_user.username} {current_user.last_name}",
|
||||
'filename': filename,
|
||||
'room_id': room_id,
|
||||
'path': rel_path,
|
||||
'size': rf.size if rf else None
|
||||
'size': rf.size if rf else None,
|
||||
'preview': preview_mode
|
||||
},
|
||||
user_id=current_user.id
|
||||
)
|
||||
db.session.commit()
|
||||
return send_from_directory(os.path.dirname(file_path), filename, as_attachment=True)
|
||||
|
||||
# For preview mode, we don't set as_attachment
|
||||
return send_from_directory(
|
||||
os.path.dirname(file_path),
|
||||
filename,
|
||||
as_attachment=not preview_mode
|
||||
)
|
||||
|
||||
@room_files_bp.route('/<int:room_id>/files/<path:filename>', methods=['DELETE'])
|
||||
@login_required
|
||||
|
||||
Reference in New Issue
Block a user