diff --git a/containers/backupchecks/src/backend/app/main/routes_settings.py b/containers/backupchecks/src/backend/app/main/routes_settings.py index bb19ea7..e2a4038 100644 --- a/containers/backupchecks/src/backend/app/main/routes_settings.py +++ b/containers/backupchecks/src/backend/app/main/routes_settings.py @@ -124,6 +124,41 @@ def settings_jobs_delete_all(): return redirect(url_for("main.settings")) +@main_bp.route("/settings/jobs/orphaned", methods=["GET"]) +@login_required +@roles_required("admin") +def settings_jobs_orphaned(): + """Show list of orphaned jobs for verification before deletion.""" + # Find jobs without valid customer + orphaned_jobs = Job.query.outerjoin(Customer, Job.customer_id == Customer.id).filter( + db.or_( + Job.customer_id.is_(None), + Customer.id.is_(None) + ) + ).order_by(Job.job_name.asc()).all() + + # Build list with details + jobs_list = [] + for job in orphaned_jobs: + run_count = JobRun.query.filter_by(job_id=job.id).count() + mail_count = JobRun.query.filter_by(job_id=job.id).filter(JobRun.mail_message_id.isnot(None)).count() + + jobs_list.append({ + "id": job.id, + "job_name": job.job_name or "Unnamed", + "backup_software": job.backup_software or "-", + "backup_type": job.backup_type or "-", + "customer_id": job.customer_id, + "run_count": run_count, + "mail_count": mail_count, + }) + + return render_template( + "main/settings_orphaned_jobs.html", + orphaned_jobs=jobs_list, + ) + + @main_bp.route("/settings/jobs/delete-orphaned", methods=["POST"]) @login_required @roles_required("admin") diff --git a/containers/backupchecks/src/templates/main/settings.html b/containers/backupchecks/src/templates/main/settings.html index d6bc75a..ab581fa 100644 --- a/containers/backupchecks/src/templates/main/settings.html +++ b/containers/backupchecks/src/templates/main/settings.html @@ -554,9 +554,12 @@
Delete jobs that are no longer linked to an existing customer. Related emails and runs will be permanently deleted from the database.
- +Jobs without a valid customer link
+| Job Name | +Backup Software | +Backup Type | +Customer ID | +Runs | +Emails | +
|---|---|---|---|---|---|
| {{ job.job_name }} | +{{ job.backup_software }} | +{{ job.backup_type }} | ++ {% if job.customer_id %} + {{ job.customer_id }} (deleted) + {% else %} + NULL + {% endif %} + | +{{ job.run_count }} | +{{ job.mail_count }} | +
| Total | +{{ orphaned_jobs|sum(attribute='run_count') }} | +{{ orphaned_jobs|sum(attribute='mail_count') }} | +|||
All jobs are properly linked to existing customers.
+