first
This commit is contained in:
110
routes/trash.py
Normal file
110
routes/trash.py
Normal file
@@ -0,0 +1,110 @@
|
||||
from flask import Blueprint, jsonify, request, abort
|
||||
from flask_login import login_required, current_user
|
||||
from models import db, Room, RoomFile, TrashedFile
|
||||
from utils import user_has_permission, clean_path
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
trash_bp = Blueprint('trash', __name__)
|
||||
|
||||
@trash_bp.route('/<int:room_id>/trash', methods=['GET'])
|
||||
@login_required
|
||||
def list_trashed_files(room_id):
|
||||
room = Room.query.get_or_404(room_id)
|
||||
if not user_has_permission(room, 'can_view'):
|
||||
abort(403)
|
||||
|
||||
# Get all trashed files in the room
|
||||
files = TrashedFile.query.filter_by(room_id=room_id).order_by(TrashedFile.deleted_at.desc()).all()
|
||||
|
||||
result = []
|
||||
for f in files:
|
||||
uploader_full_name = None
|
||||
uploader_profile_pic = None
|
||||
if f.uploader:
|
||||
uploader_full_name = f.uploader.username
|
||||
if getattr(f.uploader, 'last_name', None):
|
||||
uploader_full_name += ' ' + f.uploader.last_name
|
||||
uploader_profile_pic = f.uploader.profile_picture if getattr(f.uploader, 'profile_picture', None) else None
|
||||
|
||||
deleter_full_name = None
|
||||
if f.deleter:
|
||||
deleter_full_name = f.deleter.username
|
||||
if getattr(f.deleter, 'last_name', None):
|
||||
deleter_full_name += ' ' + f.deleter.last_name
|
||||
|
||||
result.append({
|
||||
'id': f.id,
|
||||
'name': f.name,
|
||||
'type': f.type,
|
||||
'size': f.size if f.type == 'file' else '-',
|
||||
'modified': f.modified,
|
||||
'uploaded_by': uploader_full_name,
|
||||
'uploader_profile_pic': uploader_profile_pic,
|
||||
'uploaded_at': f.uploaded_at.isoformat() if f.uploaded_at else None,
|
||||
'original_path': f.original_path,
|
||||
'deleted_by': deleter_full_name,
|
||||
'deleted_at': f.deleted_at.isoformat()
|
||||
})
|
||||
|
||||
return jsonify(result)
|
||||
|
||||
@trash_bp.route('/<int:room_id>/trash/<int:trash_id>/restore', methods=['POST'])
|
||||
@login_required
|
||||
def restore_file(room_id, trash_id):
|
||||
room = Room.query.get_or_404(room_id)
|
||||
if not user_has_permission(room, 'can_upload'):
|
||||
abort(403)
|
||||
|
||||
trashed_file = TrashedFile.query.get_or_404(trash_id)
|
||||
if trashed_file.room_id != room_id:
|
||||
abort(404)
|
||||
|
||||
# Create new RoomFile entry
|
||||
rf = RoomFile(
|
||||
room_id=room_id,
|
||||
name=trashed_file.name,
|
||||
path=trashed_file.original_path,
|
||||
type=trashed_file.type,
|
||||
size=trashed_file.size,
|
||||
modified=trashed_file.modified,
|
||||
uploaded_by=trashed_file.uploaded_by,
|
||||
uploaded_at=trashed_file.uploaded_at
|
||||
)
|
||||
db.session.add(rf)
|
||||
|
||||
# Delete the trashed file entry
|
||||
db.session.delete(trashed_file)
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({'success': True})
|
||||
|
||||
@trash_bp.route('/<int:room_id>/trash/<int:trash_id>', methods=['DELETE'])
|
||||
@login_required
|
||||
def permanently_delete_file(room_id, trash_id):
|
||||
room = Room.query.get_or_404(room_id)
|
||||
if not user_has_permission(room, 'can_delete'):
|
||||
abort(403)
|
||||
|
||||
trashed_file = TrashedFile.query.get_or_404(trash_id)
|
||||
if trashed_file.room_id != room_id:
|
||||
abort(404)
|
||||
|
||||
# Delete the trashed file entry
|
||||
db.session.delete(trashed_file)
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({'success': True})
|
||||
|
||||
@trash_bp.route('/<int:room_id>/trash/empty', methods=['POST'])
|
||||
@login_required
|
||||
def empty_trash(room_id):
|
||||
room = Room.query.get_or_404(room_id)
|
||||
if not user_has_permission(room, 'can_delete'):
|
||||
abort(403)
|
||||
|
||||
# Delete all trashed files for this room
|
||||
TrashedFile.query.filter_by(room_id=room_id).delete()
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({'success': True})
|
||||
Reference in New Issue
Block a user