Initial commit - LEGO Instructions Manager v1.5.0
This commit is contained in:
178
fix_paths.py
Normal file
178
fix_paths.py
Normal file
@@ -0,0 +1,178 @@
|
||||
"""
|
||||
Path Fix & Diagnostic Script
|
||||
Fixes backslash paths in database and checks file existence
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.insert(0, script_dir)
|
||||
|
||||
def find_database():
|
||||
"""Find the database file in common locations."""
|
||||
possible_paths = [
|
||||
os.path.join(script_dir, 'instance', 'lego_instructions.db'),
|
||||
os.path.join(script_dir, 'lego_instructions.db'),
|
||||
os.path.join(script_dir, 'app', 'lego_instructions.db'),
|
||||
]
|
||||
|
||||
for path in possible_paths:
|
||||
if os.path.exists(path):
|
||||
return path
|
||||
|
||||
return None
|
||||
|
||||
def main():
|
||||
# Find database
|
||||
db_path = find_database()
|
||||
|
||||
if not db_path:
|
||||
print("=" * 70)
|
||||
print("❌ Database not found!")
|
||||
print("=" * 70)
|
||||
print()
|
||||
print("Searched in:")
|
||||
print(" - E:\\LIM\\instance\\lego_instructions.db")
|
||||
print(" - E:\\LIM\\lego_instructions.db")
|
||||
print(" - E:\\LIM\\app\\lego_instructions.db")
|
||||
print()
|
||||
return
|
||||
|
||||
print(f"Found database: {db_path}")
|
||||
print()
|
||||
|
||||
# Set database URL
|
||||
db_uri = 'sqlite:///' + db_path.replace('\\', '/')
|
||||
os.environ['DATABASE_URL'] = db_uri
|
||||
|
||||
from app import create_app, db
|
||||
from app.models.instruction import Instruction
|
||||
from app.models.set import Set
|
||||
from flask import current_app
|
||||
|
||||
app = create_app()
|
||||
|
||||
with app.app_context():
|
||||
print("=" * 70)
|
||||
print("LEGO Instructions Manager - Path Fix & Diagnostics")
|
||||
print("=" * 70)
|
||||
print()
|
||||
|
||||
upload_folder = current_app.config['UPLOAD_FOLDER']
|
||||
print(f"Upload folder: {upload_folder}")
|
||||
print()
|
||||
|
||||
# Check instructions
|
||||
instructions = Instruction.query.all()
|
||||
print(f"Found {len(instructions)} instruction files")
|
||||
print()
|
||||
|
||||
fixed_paths = 0
|
||||
fixed_thumbnails = 0
|
||||
missing_files = []
|
||||
|
||||
for instruction in instructions:
|
||||
# Fix file_path backslashes
|
||||
if '\\' in instruction.file_path:
|
||||
old_path = instruction.file_path
|
||||
instruction.file_path = instruction.file_path.replace('\\', '/')
|
||||
fixed_paths += 1
|
||||
print(f"Fixed path: {old_path} → {instruction.file_path}")
|
||||
|
||||
# Fix thumbnail_path backslashes
|
||||
if instruction.thumbnail_path and '\\' in instruction.thumbnail_path:
|
||||
old_thumb = instruction.thumbnail_path
|
||||
instruction.thumbnail_path = instruction.thumbnail_path.replace('\\', '/')
|
||||
fixed_thumbnails += 1
|
||||
print(f"Fixed thumbnail: {old_thumb} → {instruction.thumbnail_path}")
|
||||
|
||||
# Check if file exists
|
||||
full_path = os.path.join(upload_folder, instruction.file_path)
|
||||
if not os.path.exists(full_path):
|
||||
missing_files.append({
|
||||
'id': instruction.id,
|
||||
'file_name': instruction.file_name,
|
||||
'path': instruction.file_path,
|
||||
'full_path': full_path,
|
||||
'set_id': instruction.set_id
|
||||
})
|
||||
|
||||
# Fix cover images
|
||||
sets = Set.query.all()
|
||||
fixed_covers = 0
|
||||
|
||||
for lego_set in sets:
|
||||
if lego_set.cover_image and '\\' in lego_set.cover_image:
|
||||
old_cover = lego_set.cover_image
|
||||
lego_set.cover_image = lego_set.cover_image.replace('\\', '/')
|
||||
fixed_covers += 1
|
||||
print(f"Fixed cover: {old_cover} → {lego_set.cover_image}")
|
||||
|
||||
# Commit changes
|
||||
if fixed_paths or fixed_thumbnails or fixed_covers:
|
||||
db.session.commit()
|
||||
print()
|
||||
print("=" * 70)
|
||||
print("✅ Database Updates:")
|
||||
print("=" * 70)
|
||||
print(f" • Fixed {fixed_paths} instruction file paths")
|
||||
print(f" • Fixed {fixed_thumbnails} thumbnail paths")
|
||||
print(f" • Fixed {fixed_covers} cover image paths")
|
||||
print()
|
||||
else:
|
||||
print()
|
||||
print("✅ No path fixes needed - all paths are correct!")
|
||||
print()
|
||||
|
||||
# Report missing files
|
||||
if missing_files:
|
||||
print("=" * 70)
|
||||
print("⚠️ WARNING: Missing Files Detected")
|
||||
print("=" * 70)
|
||||
print()
|
||||
for item in missing_files:
|
||||
lego_set = Set.query.get(item['set_id'])
|
||||
print(f"Missing: {item['file_name']}")
|
||||
print(f" Set: {lego_set.set_number if lego_set else 'Unknown'}")
|
||||
print(f" DB Path: {item['path']}")
|
||||
print(f" Full Path: {item['full_path']}")
|
||||
print(f" Instruction ID: {item['id']}")
|
||||
print()
|
||||
|
||||
print(f"Total missing: {len(missing_files)} files")
|
||||
print()
|
||||
print("These files may have been:")
|
||||
print(" • Deleted manually from disk")
|
||||
print(" • Never uploaded properly")
|
||||
print(" • Moved to wrong location")
|
||||
print()
|
||||
print("To fix:")
|
||||
print(" 1. Re-upload the files, or")
|
||||
print(" 2. Delete the database records:")
|
||||
print(f" DELETE FROM instructions WHERE id IN ({','.join(str(x['id']) for x in missing_files)});")
|
||||
print()
|
||||
else:
|
||||
print("=" * 70)
|
||||
print("✅ All Files Verified")
|
||||
print("=" * 70)
|
||||
print(" All instruction files exist on disk!")
|
||||
print()
|
||||
|
||||
# Summary
|
||||
print("=" * 70)
|
||||
print("Summary")
|
||||
print("=" * 70)
|
||||
print(f" Total instructions: {len(instructions)}")
|
||||
print(f" Paths fixed: {fixed_paths + fixed_thumbnails + fixed_covers}")
|
||||
print(f" Files verified: {len(instructions) - len(missing_files)}")
|
||||
print(f" Missing files: {len(missing_files)}")
|
||||
print()
|
||||
|
||||
if fixed_paths or fixed_thumbnails or fixed_covers:
|
||||
print("✅ Restart Flask to see changes!")
|
||||
|
||||
print()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user