39 lines
1.6 KiB
Python
39 lines
1.6 KiB
Python
import os
|
|
from app import db
|
|
from app.models import Post, GPXFile
|
|
|
|
def clean_orphan_post_media(media_root='app/static/media/posts'):
|
|
"""
|
|
Remove folders in app/static/media/posts that do not have a corresponding Post in the database.
|
|
"""
|
|
# Get all valid media_folder names from the database
|
|
valid_folders = set(post.media_folder for post in Post.query.all() if post.media_folder)
|
|
|
|
# List all folders in the media root
|
|
for folder in os.listdir(media_root):
|
|
folder_path = os.path.join(media_root, folder)
|
|
if os.path.isdir(folder_path) and folder not in valid_folders:
|
|
print(f"Deleting orphaned media folder: {folder_path}")
|
|
# Recursively delete the folder and its contents
|
|
for root, dirs, files in os.walk(folder_path, topdown=False):
|
|
for name in files:
|
|
os.remove(os.path.join(root, name))
|
|
for name in dirs:
|
|
os.rmdir(os.path.join(root, name))
|
|
os.rmdir(folder_path)
|
|
|
|
# --- Remove orphaned GPXFile records ---
|
|
# Get all valid post IDs
|
|
valid_post_ids = set(post.id for post in Post.query.all())
|
|
# Find GPXFile records whose post_id is not in valid_post_ids
|
|
orphaned_gpx_files = GPXFile.query.filter(~GPXFile.post_id.in_(valid_post_ids)).all()
|
|
if orphaned_gpx_files:
|
|
print(f"Deleting {len(orphaned_gpx_files)} orphaned GPXFile records from the database.")
|
|
for gpx in orphaned_gpx_files:
|
|
db.session.delete(gpx)
|
|
db.session.commit()
|
|
else:
|
|
print("No orphaned GPXFile records found.")
|
|
|
|
print("Orphaned media and GPXFile cleanup complete.")
|