diff --git a/__pycache__/pdf_renamer.cpython-313.pyc b/__pycache__/pdf_renamer.cpython-313.pyc index 6778704..74a68fe 100644 Binary files a/__pycache__/pdf_renamer.cpython-313.pyc and b/__pycache__/pdf_renamer.cpython-313.pyc differ diff --git a/pdf_renamer.py b/pdf_renamer.py index cf5a307..013812f 100644 --- a/pdf_renamer.py +++ b/pdf_renamer.py @@ -3,6 +3,7 @@ import tempfile import zipfile import threading import uuid +import json from datetime import datetime from functools import wraps from flask import Flask, request, render_template_string, redirect, url_for, session, send_from_directory, flash, get_flashed_messages, jsonify @@ -54,6 +55,56 @@ except Exception as e: print(f"ERROR: Failed to register Microsoft OAuth provider: {e}") microsoft = None +# Job persistence +JOBS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'jobs.json') +job_queue = {} +job_lock = threading.Lock() + +def save_jobs(): + """Save jobs to persistent storage""" + try: + with job_lock: + # Convert datetime objects to strings for JSON serialization + jobs_to_save = {} + for job_id, job in job_queue.items(): + jobs_to_save[job_id] = job.copy() + # Convert any datetime objects if needed + if 'created_at' in jobs_to_save[job_id]: + jobs_to_save[job_id]['created_at'] = str(jobs_to_save[job_id]['created_at']) + + with open(JOBS_FILE, 'w') as f: + json.dump(jobs_to_save, f, indent=2) + except Exception as e: + print(f"ERROR: Failed to save jobs: {e}") + +def load_jobs(): + """Load jobs from persistent storage""" + global job_queue + try: + if os.path.exists(JOBS_FILE): + with open(JOBS_FILE, 'r') as f: + loaded_jobs = json.load(f) + job_queue = loaded_jobs + print(f"DEBUG: Loaded {len(job_queue)} jobs from persistent storage") + else: + print("DEBUG: No existing jobs file found, starting fresh") + except Exception as e: + print(f"ERROR: Failed to load jobs: {e}") + job_queue = {} + +# Load jobs on startup +load_jobs() + +def update_job_status(job_id, status, **kwargs): + """Update job status and persist changes""" + with job_lock: + if job_id in job_queue: + job_queue[job_id]['status'] = status + job_queue[job_id].update(kwargs) + job_queue[job_id]['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + save_jobs() + print(f"DEBUG: Job {job_id} status updated to {status}") + def analyze_failed_extractions(log_path): """ Analyze failed extraction log to identify new patterns. @@ -459,6 +510,7 @@ def process_job(job_id, files): print("=== DEBUG: process_job STARTED ===") job_queue[job_id]['status'] = 'processing' job_queue[job_id]['progress'] = 'Starting job processing...' + save_jobs() # Persist status change processed_files = [] temp_extract_dirs = [] @@ -614,6 +666,7 @@ def process_job(job_id, files): except Exception as e: job_queue[job_id]['progress'] = f'Error creating ZIP: {str(e)}' job_queue[job_id]['status'] = 'error' + save_jobs() # Persist error status print(f"DEBUG: ZIP creation failed: {str(e)}") else: job_queue[job_id]['progress'] = 'No files to archive - all files were skipped' @@ -622,11 +675,13 @@ def process_job(job_id, files): job_queue[job_id]['status'] = 'completed' job_queue[job_id]['processed_files'] = processed_files job_queue[job_id]['skipped'] = [(p[1], p[2]) for p in processed_files if p[0] == 'skipped'] + save_jobs() # Persist completed job print(f"DEBUG: Job {job_id} completed successfully. Processed: {len(processed_files)}, Skipped: {len(job_queue[job_id]['skipped'])}") except Exception as e: job_queue[job_id]['status'] = 'error' job_queue[job_id]['progress'] = f'Job failed with error: {str(e)}' + save_jobs() # Persist error status print(f"Job {job_id} failed: {str(e)}") # Debug logging @app.route('/login') @@ -776,7 +831,8 @@ def upload_files(): flash('No files selected.', 'error') return redirect(url_for('upload_files')) - job_id = str(uuid.uuid4()) + # Create job ID using timestamp format: YYYY-MM-DD_HH-MM-SS + job_id = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') job_queue[job_id] = { 'status': 'queued', 'files': [], @@ -784,7 +840,8 @@ def upload_files(): 'zip_name': None, 'processed_files': [], 'skipped': [], - 'created_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S') + 'created_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), + 'job_id': job_id # Store the job ID for reference } file_list = [] @@ -804,6 +861,9 @@ def upload_files(): job_queue[job_id]['files'] = file_list print(f"Created job {job_id} with {len(file_list)} files") # Debug logging + # Save job to persistent storage + save_jobs() + # Start processing in background def process_with_context(): with app.app_context(): @@ -1109,6 +1169,7 @@ def delete_job(job_id): os.remove(zip_path) # Remove the job from the queue del job_queue[job_id] + save_jobs() # Persist job deletion flash('Job deleted successfully.', 'success') else: flash('Only completed jobs can be deleted.', 'error')