From c2d7342a47f61f8a67046f7be12ec1a29e3ac724 Mon Sep 17 00:00:00 2001 From: Peter van Arkel Date: Tue, 19 May 2026 23:41:55 +0200 Subject: [PATCH] (refactor) Remove unused schedule user field Drop the legacy schedule user setting from the Django model, form, defaults, and configure command. Schedules are executed by the pobsync scheduler service under the configured systemd service user, while remote SSH login users are configured separately on global or host backup config. Add a migration to remove the unused database column and update schedule view tests around the simplified form. --- src/pobsync_backend/forms.py | 1 - .../commands/configure_pobsync_schedule.py | 2 -- .../migrations/0009_remove_scheduleconfig_user.py | 14 ++++++++++++++ src/pobsync_backend/models.py | 1 - src/pobsync_backend/tests/test_views.py | 7 +------ src/pobsync_backend/views.py | 1 - 6 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 src/pobsync_backend/migrations/0009_remove_scheduleconfig_user.py diff --git a/src/pobsync_backend/forms.py b/src/pobsync_backend/forms.py index e90957b..8be9435 100644 --- a/src/pobsync_backend/forms.py +++ b/src/pobsync_backend/forms.py @@ -277,7 +277,6 @@ class ScheduleConfigForm(forms.ModelForm): model = ScheduleConfig fields = ( "cron_expr", - "user", "enabled", "prune", "prune_max_delete", diff --git a/src/pobsync_backend/management/commands/configure_pobsync_schedule.py b/src/pobsync_backend/management/commands/configure_pobsync_schedule.py index 3d5fb20..b646389 100644 --- a/src/pobsync_backend/management/commands/configure_pobsync_schedule.py +++ b/src/pobsync_backend/management/commands/configure_pobsync_schedule.py @@ -14,7 +14,6 @@ class Command(BaseCommand): def add_arguments(self, parser) -> None: parser.add_argument("host") parser.add_argument("--cron", help='Cron expression, e.g. "15 2 * * *"') - parser.add_argument("--user", default="root") parser.add_argument("--prune", action="store_true") parser.add_argument("--prune-max-delete", type=int, default=10) parser.add_argument("--prune-protect-bases", action="store_true") @@ -43,7 +42,6 @@ class Command(BaseCommand): host=host, defaults={ "cron_expr": options["cron"], - "user": options["user"], "enabled": not options["disabled"], "prune": bool(options["prune"]), "prune_max_delete": int(options["prune_max_delete"]), diff --git a/src/pobsync_backend/migrations/0009_remove_scheduleconfig_user.py b/src/pobsync_backend/migrations/0009_remove_scheduleconfig_user.py new file mode 100644 index 0000000..515c5b9 --- /dev/null +++ b/src/pobsync_backend/migrations/0009_remove_scheduleconfig_user.py @@ -0,0 +1,14 @@ +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("pobsync_backend", "0008_alter_backuprun_status"), + ] + + operations = [ + migrations.RemoveField( + model_name="scheduleconfig", + name="user", + ), + ] diff --git a/src/pobsync_backend/models.py b/src/pobsync_backend/models.py index 2cf8660..830458c 100644 --- a/src/pobsync_backend/models.py +++ b/src/pobsync_backend/models.py @@ -174,7 +174,6 @@ class SnapshotRecord(models.Model): class ScheduleConfig(TimestampedModel): host = models.OneToOneField(HostConfig, on_delete=models.CASCADE, related_name="schedule") cron_expr = models.CharField(max_length=128) - user = models.CharField(max_length=64, default="root") enabled = models.BooleanField(default=True) prune = models.BooleanField(default=False) prune_max_delete = models.PositiveIntegerField(default=10) diff --git a/src/pobsync_backend/tests/test_views.py b/src/pobsync_backend/tests/test_views.py index 286b2fd..20b0276 100644 --- a/src/pobsync_backend/tests/test_views.py +++ b/src/pobsync_backend/tests/test_views.py @@ -1162,7 +1162,6 @@ class ViewTests(TestCase): reverse("edit_host_schedule", args=[host.host]), { "cron_expr": "30 3 * * *", - "user": "root", "enabled": "on", "prune": "on", "prune_max_delete": "4", @@ -1189,7 +1188,6 @@ class ViewTests(TestCase): reverse("edit_host_schedule", args=[host.host]), { "cron_expr": "45 4 * * 1", - "user": "backup", "prune_max_delete": "8", }, follow=True, @@ -1198,7 +1196,6 @@ class ViewTests(TestCase): self.assertRedirects(response, reverse("host_detail", args=[host.host])) schedule.refresh_from_db() self.assertEqual(schedule.cron_expr, "45 4 * * 1") - self.assertEqual(schedule.user, "backup") self.assertFalse(schedule.enabled) self.assertFalse(schedule.prune) self.assertEqual(schedule.prune_max_delete, 8) @@ -1209,7 +1206,6 @@ class ViewTests(TestCase): ScheduleConfig.objects.create( host=host, cron_expr="45 4 * * 1", - user="backup", enabled=True, prune_max_delete=8, ) @@ -1219,9 +1215,9 @@ class ViewTests(TestCase): self.assertEqual(response.status_code, 200) self.assertContains(response, "Edit Schedule") self.assertContains(response, 'value="45 4 * * 1"', html=False) - self.assertContains(response, 'value="backup"', html=False) self.assertContains(response, 'value="8"', html=False) self.assertNotContains(response, 'value="15 2 * * *"', html=False) + self.assertNotContains(response, ">User<", html=False) def test_schedule_form_rejects_invalid_cron(self) -> None: self.client.force_login(self.staff_user) @@ -1231,7 +1227,6 @@ class ViewTests(TestCase): reverse("edit_host_schedule", args=[host.host]), { "cron_expr": "bad cron", - "user": "root", "enabled": "on", "prune_max_delete": "10", }, diff --git a/src/pobsync_backend/views.py b/src/pobsync_backend/views.py index 9c97a62..239d7b7 100644 --- a/src/pobsync_backend/views.py +++ b/src/pobsync_backend/views.py @@ -575,7 +575,6 @@ def _next_run_for_schedule(schedule: ScheduleConfig | None, host_config: HostCon def _default_schedule_initial() -> dict[str, object]: return { "cron_expr": "15 2 * * *", - "user": "root", "enabled": True, "prune_max_delete": 10, }