From 24712956a39719834db561a695b05b5348e6c022 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Wed, 4 Feb 2026 16:02:56 -0300 Subject: [PATCH] Add active field to ScheduleProfile and implement signals for status updates --- scheduler/apps.py | 3 ++ .../migrations/0004_scheduleprofile_active.py | 18 ++++++++++++ scheduler/models.py | 1 + scheduler/signals.py | 29 +++++++++++++++++++ templates/scheduler/scheduleprofile_form.html | 10 +++++-- wireguard_webadmin/settings.py | 2 +- 6 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 scheduler/migrations/0004_scheduleprofile_active.py create mode 100644 scheduler/signals.py diff --git a/scheduler/apps.py b/scheduler/apps.py index 3a3846a..2e25c0e 100644 --- a/scheduler/apps.py +++ b/scheduler/apps.py @@ -4,3 +4,6 @@ from django.apps import AppConfig class SchedulerConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'scheduler' + + def ready(self): + pass \ No newline at end of file diff --git a/scheduler/migrations/0004_scheduleprofile_active.py b/scheduler/migrations/0004_scheduleprofile_active.py new file mode 100644 index 0000000..d4b559a --- /dev/null +++ b/scheduler/migrations/0004_scheduleprofile_active.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.11 on 2026-02-04 18:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('scheduler', '0003_remove_peerscheduling_schedule_last_calculated_at'), + ] + + operations = [ + migrations.AddField( + model_name='scheduleprofile', + name='active', + field=models.BooleanField(default=False), + ), + ] diff --git a/scheduler/models.py b/scheduler/models.py index 8dfaef8..83b9d87 100644 --- a/scheduler/models.py +++ b/scheduler/models.py @@ -19,6 +19,7 @@ WEEK_DAYS = [ class ScheduleProfile(models.Model): name = models.CharField(max_length=100) + active = models.BooleanField(default=False) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) diff --git a/scheduler/signals.py b/scheduler/signals.py new file mode 100644 index 0000000..19c0d3a --- /dev/null +++ b/scheduler/signals.py @@ -0,0 +1,29 @@ +from django.db import transaction +from django.db.models.signals import post_save, post_delete +from django.dispatch import receiver + +from .models import ScheduleSlot, ScheduleProfile, PeerScheduling + + +def _recalc_profile_and_reset_peers(profile_id: int | None) -> None: + if not profile_id: + return + + has_slots = ScheduleSlot.objects.filter(profile_id=profile_id).exists() + + ScheduleProfile.objects.filter(pk=profile_id).update(active=has_slots) + + PeerScheduling.objects.filter(profile_id=profile_id).update( + next_scheduled_enable_at=None, + next_scheduled_disable_at=None, + ) + + +@receiver(post_save, sender=ScheduleSlot) +def scheduleslot_post_save(sender, instance: ScheduleSlot, created: bool, **kwargs): + transaction.on_commit(lambda: _recalc_profile_and_reset_peers(instance.profile_id)) + + +@receiver(post_delete, sender=ScheduleSlot) +def scheduleslot_post_delete(sender, instance: ScheduleSlot, **kwargs): + transaction.on_commit(lambda: _recalc_profile_and_reset_peers(instance.profile_id)) diff --git a/templates/scheduler/scheduleprofile_form.html b/templates/scheduler/scheduleprofile_form.html index 698d64e..5f4d1e5 100644 --- a/templates/scheduler/scheduleprofile_form.html +++ b/templates/scheduler/scheduleprofile_form.html @@ -74,9 +74,13 @@
    -
  • {% trans 'Current time' %}: {{ now }}
  • -
  • {% trans 'Becomes active at' %}: {{ profile.next_dates.enable|default_if_none:'' }}
  • -
  • {% trans 'Becomes inactive at' %}: {{ profile.next_dates.disable|default_if_none:'' }}
  • + {% if profile.active %} +
  • {% trans 'Current time' %}: {{ now }}
  • +
  • {% trans 'Becomes active at' %}: {{ profile.next_dates.enable|default_if_none:'' }}
  • +
  • {% trans 'Becomes inactive at' %}: {{ profile.next_dates.disable|default_if_none:'' }}
  • + {% else %} +
  • {% trans 'Status' %}: {% trans 'Inactive' %}
  • + {% endif %}
diff --git a/wireguard_webadmin/settings.py b/wireguard_webadmin/settings.py index 07c8f29..96de1e7 100644 --- a/wireguard_webadmin/settings.py +++ b/wireguard_webadmin/settings.py @@ -49,7 +49,7 @@ INSTALLED_APPS = [ 'cluster', 'api', 'routing_templates', - 'scheduler' + 'scheduler.apps.SchedulerConfig' ] MIDDLEWARE = [