(feature) Add schedule editing view for hosts
Add a staff-only Django form for creating and updating host schedules using the SQL-backed ScheduleConfig model. Link the form from host detail pages, validate cron expressions with the existing scheduler parser, and preserve scheduler/CLI behavior by writing to the same source of truth. Cover default rendering, schedule creation, updates, and invalid cron handling with view tests.
This commit is contained in:
@@ -8,6 +8,7 @@ from django.views.decorators.http import require_POST
|
||||
|
||||
from pobsync.errors import ConfigError
|
||||
|
||||
from .forms import ScheduleConfigForm
|
||||
from .models import BackupRun, HostConfig, ScheduleConfig, SnapshotRecord
|
||||
from .retention import run_sql_retention_plan
|
||||
from .snapshot_discovery import discover_snapshots
|
||||
@@ -95,8 +96,43 @@ def host_retention_plan(request, host: str):
|
||||
return render(request, "pobsync_backend/retention_plan.html", context)
|
||||
|
||||
|
||||
@staff_member_required
|
||||
def edit_host_schedule(request, host: str):
|
||||
host_config = get_object_or_404(HostConfig, host=host)
|
||||
schedule = _schedule_for_host(host_config)
|
||||
if request.method == "POST":
|
||||
form = ScheduleConfigForm(request.POST, instance=schedule)
|
||||
if form.is_valid():
|
||||
saved_schedule = form.save(commit=False)
|
||||
saved_schedule.host = host_config
|
||||
saved_schedule.save()
|
||||
messages.success(request, f"Schedule saved for {host_config.host}.")
|
||||
return redirect("host_detail", host=host_config.host)
|
||||
else:
|
||||
form = ScheduleConfigForm(instance=schedule, initial=_default_schedule_initial())
|
||||
|
||||
return render(
|
||||
request,
|
||||
"pobsync_backend/schedule_form.html",
|
||||
{
|
||||
"host": host_config,
|
||||
"schedule": schedule,
|
||||
"form": form,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def _schedule_for_host(host_config: HostConfig) -> ScheduleConfig | None:
|
||||
try:
|
||||
return host_config.schedule
|
||||
except ScheduleConfig.DoesNotExist:
|
||||
return None
|
||||
|
||||
|
||||
def _default_schedule_initial() -> dict[str, object]:
|
||||
return {
|
||||
"cron_expr": "15 2 * * *",
|
||||
"user": "root",
|
||||
"enabled": True,
|
||||
"prune_max_delete": 10,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user