updated features to upload pptx files
This commit is contained in:
@@ -8,7 +8,7 @@ from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from app.extensions import db, bcrypt
|
||||
from app.models import User, Player, Group, Content, ServerLog
|
||||
from app.models import User, Player, Group, Content, ServerLog, Playlist
|
||||
from app.utils.logger import log_action
|
||||
|
||||
admin_bp = Blueprint('admin', __name__, url_prefix='/admin')
|
||||
@@ -38,7 +38,7 @@ def admin_panel():
|
||||
# Get statistics
|
||||
total_users = User.query.count()
|
||||
total_players = Player.query.count()
|
||||
total_groups = Group.query.count()
|
||||
total_playlists = Playlist.query.count()
|
||||
total_content = Content.query.count()
|
||||
|
||||
# Get recent logs
|
||||
@@ -62,7 +62,7 @@ def admin_panel():
|
||||
return render_template('admin/admin.html',
|
||||
total_users=total_users,
|
||||
total_players=total_players,
|
||||
total_groups=total_groups,
|
||||
total_playlists=total_playlists,
|
||||
total_content=total_content,
|
||||
storage_mb=storage_mb,
|
||||
users=users,
|
||||
@@ -347,3 +347,146 @@ def system_info():
|
||||
except Exception as e:
|
||||
log_action('error', f'Error getting system info: {str(e)}')
|
||||
return jsonify({'error': str(e)}), 500
|
||||
|
||||
|
||||
@admin_bp.route('/leftover-media')
|
||||
@login_required
|
||||
@admin_required
|
||||
def leftover_media():
|
||||
"""Display leftover media files not assigned to any playlist."""
|
||||
from app.models.playlist import playlist_content
|
||||
from sqlalchemy import select
|
||||
|
||||
try:
|
||||
# Get all content IDs that are in playlists
|
||||
stmt = select(playlist_content.c.content_id).distinct()
|
||||
content_in_playlists = set(row[0] for row in db.session.execute(stmt))
|
||||
|
||||
# Get all content
|
||||
all_content = Content.query.all()
|
||||
|
||||
# Filter content not in any playlist
|
||||
leftover_content = [c for c in all_content if c.id not in content_in_playlists]
|
||||
|
||||
# Separate by type
|
||||
leftover_images = [c for c in leftover_content if c.content_type == 'image']
|
||||
leftover_videos = [c for c in leftover_content if c.content_type == 'video']
|
||||
leftover_pdfs = [c for c in leftover_content if c.content_type == 'pdf']
|
||||
leftover_pptx = [c for c in leftover_content if c.content_type == 'pptx']
|
||||
|
||||
# Calculate storage
|
||||
total_leftover_size = sum(c.file_size for c in leftover_content)
|
||||
images_size = sum(c.file_size for c in leftover_images)
|
||||
videos_size = sum(c.file_size for c in leftover_videos)
|
||||
pdfs_size = sum(c.file_size for c in leftover_pdfs)
|
||||
pptx_size = sum(c.file_size for c in leftover_pptx)
|
||||
|
||||
return render_template('admin/leftover_media.html',
|
||||
leftover_images=leftover_images,
|
||||
leftover_videos=leftover_videos,
|
||||
leftover_pdfs=leftover_pdfs,
|
||||
leftover_pptx=leftover_pptx,
|
||||
total_leftover=len(leftover_content),
|
||||
total_leftover_size_mb=total_leftover_size / (1024 * 1024),
|
||||
images_size_mb=images_size / (1024 * 1024),
|
||||
videos_size_mb=videos_size / (1024 * 1024),
|
||||
pdfs_size_mb=pdfs_size / (1024 * 1024),
|
||||
pptx_size_mb=pptx_size / (1024 * 1024))
|
||||
|
||||
except Exception as e:
|
||||
log_action('error', f'Error loading leftover media: {str(e)}')
|
||||
flash('Error loading leftover media.', 'danger')
|
||||
return redirect(url_for('admin.admin_panel'))
|
||||
|
||||
|
||||
@admin_bp.route('/delete-leftover-images', methods=['POST'])
|
||||
@login_required
|
||||
@admin_required
|
||||
def delete_leftover_images():
|
||||
"""Delete all leftover images that are not part of any playlist"""
|
||||
from app.models.playlist import playlist_content
|
||||
|
||||
try:
|
||||
# Find all leftover image content
|
||||
leftover_images = db.session.query(Content).filter(
|
||||
Content.media_type == 'image',
|
||||
~Content.id.in_(
|
||||
db.session.query(playlist_content.c.content_id)
|
||||
)
|
||||
).all()
|
||||
|
||||
deleted_count = 0
|
||||
errors = []
|
||||
|
||||
for content in leftover_images:
|
||||
try:
|
||||
# Delete physical file
|
||||
if content.file_path:
|
||||
file_path = os.path.join(current_app.config['UPLOAD_FOLDER'], content.file_path)
|
||||
if os.path.exists(file_path):
|
||||
os.remove(file_path)
|
||||
|
||||
# Delete database record
|
||||
db.session.delete(content)
|
||||
deleted_count += 1
|
||||
except Exception as e:
|
||||
errors.append(f"Error deleting {content.file_path}: {str(e)}")
|
||||
|
||||
db.session.commit()
|
||||
|
||||
if errors:
|
||||
flash(f'Deleted {deleted_count} images with {len(errors)} errors', 'warning')
|
||||
else:
|
||||
flash(f'Successfully deleted {deleted_count} leftover images', 'success')
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
flash(f'Error deleting leftover images: {str(e)}', 'danger')
|
||||
|
||||
return redirect(url_for('admin.leftover_media'))
|
||||
|
||||
@admin_bp.route('/delete-leftover-videos', methods=['POST'])
|
||||
@login_required
|
||||
@admin_required
|
||||
def delete_leftover_videos():
|
||||
"""Delete all leftover videos that are not part of any playlist"""
|
||||
from app.models.playlist import playlist_content
|
||||
|
||||
try:
|
||||
# Find all leftover video content
|
||||
leftover_videos = db.session.query(Content).filter(
|
||||
Content.media_type == 'video',
|
||||
~Content.id.in_(
|
||||
db.session.query(playlist_content.c.content_id)
|
||||
)
|
||||
).all()
|
||||
|
||||
deleted_count = 0
|
||||
errors = []
|
||||
|
||||
for content in leftover_videos:
|
||||
try:
|
||||
# Delete physical file
|
||||
if content.file_path:
|
||||
file_path = os.path.join(current_app.config['UPLOAD_FOLDER'], content.file_path)
|
||||
if os.path.exists(file_path):
|
||||
os.remove(file_path)
|
||||
|
||||
# Delete database record
|
||||
db.session.delete(content)
|
||||
deleted_count += 1
|
||||
except Exception as e:
|
||||
errors.append(f"Error deleting {content.file_path}: {str(e)}")
|
||||
|
||||
db.session.commit()
|
||||
|
||||
if errors:
|
||||
flash(f'Deleted {deleted_count} videos with {len(errors)} errors', 'warning')
|
||||
else:
|
||||
flash(f'Successfully deleted {deleted_count} leftover videos', 'success')
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
flash(f'Error deleting leftover videos: {str(e)}', 'danger')
|
||||
|
||||
return redirect(url_for('admin.leftover_media'))
|
||||
|
||||
Reference in New Issue
Block a user