diff --git a/scheduler/models.py b/scheduler/models.py index 7e8db72..8dfaef8 100644 --- a/scheduler/models.py +++ b/scheduler/models.py @@ -1,6 +1,8 @@ import uuid +from datetime import datetime, timedelta from django.db import models +from django.utils import timezone from django.utils.translation import gettext_lazy as _ from wireguard.models import Peer @@ -25,6 +27,51 @@ class ScheduleProfile(models.Model): def __str__(self): return self.name + @staticmethod + def _next_weekday_time(now, weekday, t): + + tz = timezone.get_current_timezone() + + today = timezone.localdate(now) + candidate_date = today + timedelta(days=(weekday - today.weekday()) % 7) + + candidate = timezone.make_aware( + datetime.combine(candidate_date, t), + tz + ) + + if candidate <= now: + candidate_date += timedelta(days=7) + candidate = timezone.make_aware( + datetime.combine(candidate_date, t), + tz + ) + + return candidate + + @property + def next_dates(self): + slots = list(self.time_interval.all()) + if not slots: + return {'enable': None, 'disable': None} + + now = timezone.now() + + start_candidates = [] + end_candidates = [] + + for slot in slots: + start_dt = ScheduleProfile._next_weekday_time(now, slot.start_weekday, slot.start_time) + end_dt = ScheduleProfile._next_weekday_time(now, slot.end_weekday, slot.end_time) + + start_candidates.append(start_dt) + end_candidates.append(end_dt) + + return { + 'enable': min(start_candidates) if start_candidates else None, + 'disable': min(end_candidates) if end_candidates else None, + } + class ScheduleSlot(models.Model): profile = models.ForeignKey(ScheduleProfile, on_delete=models.CASCADE, related_name="time_interval") diff --git a/scheduler/views.py b/scheduler/views.py index 175e314..bfdb6d3 100644 --- a/scheduler/views.py +++ b/scheduler/views.py @@ -2,6 +2,7 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required from django.shortcuts import render, get_object_or_404, redirect from django.urls import reverse +from django.utils import timezone from django.utils.translation import gettext as _ from scheduler.forms import ScheduleProfileForm @@ -44,6 +45,7 @@ def view_manage_scheduler_profile(request): 'title': title, 'profile': profile, 'slots': slots, + 'now': timezone.now(), } return render(request, 'scheduler/scheduleprofile_form.html', context) diff --git a/templates/scheduler/scheduleprofile_form.html b/templates/scheduler/scheduleprofile_form.html index 63e12cd..5bb6447 100644 --- a/templates/scheduler/scheduleprofile_form.html +++ b/templates/scheduler/scheduleprofile_form.html @@ -70,6 +70,17 @@ {% trans "Active" %} {% trans "Inactive" %} + +