improve time interval forms

This commit is contained in:
Eduardo Silva
2026-02-04 15:07:28 -03:00
parent f4182aa2aa
commit 1db04a222f
3 changed files with 32 additions and 7 deletions

View File

@@ -51,6 +51,17 @@ def _intervals_overlap(a_start, a_end, b_start, b_end) -> bool:
return a_start < b_end and b_start < a_end
def _circular_gap(a_start, a_end, b_start, b_end, week_minutes):
if a_start < b_end and b_start < a_end:
return 0
gaps = [
(b_start - a_end) % week_minutes,
(a_start - b_end) % week_minutes,
]
return min(gaps)
class ScheduleSlotForm(forms.ModelForm):
class Meta:
model = ScheduleSlot
@@ -98,7 +109,7 @@ class ScheduleSlotForm(forms.ModelForm):
def clean(self):
cleaned = super().clean()
week_minutes = 7 * 24 * 60
start_weekday = cleaned.get("start_weekday")
start_time = cleaned.get("start_time")
end_weekday = cleaned.get("end_weekday")
@@ -112,6 +123,14 @@ class ScheduleSlotForm(forms.ModelForm):
new_intervals = _slot_to_week_intervals(start_weekday, start_time, end_weekday, end_time)
total_minutes = sum((end - start) for start, end in new_intervals)
if total_minutes < 10:
raise ValidationError(_("The minimum duration between start and end must be at least 10 minutes."))
if total_minutes > (week_minutes - 10):
raise ValidationError(_("The minimum duration between start and end must be at least 10 minutes."))
qs = ScheduleSlot.objects.filter(profile=self.profile)
if self.instance and self.instance.pk:
qs = qs.exclude(pk=self.instance.pk)
@@ -135,4 +154,10 @@ class ScheduleSlotForm(forms.ModelForm):
},
)
gap = _circular_gap(ns, ne, es, ee, week_minutes)
if gap < 10:
raise ValidationError(
_("There must be at least 10 minutes between time slots.")
)
return cleaned

View File

@@ -86,7 +86,7 @@ def view_manage_scheduler_slot(request):
cancel_url = f"{reverse('manage_scheduler_profile')}?uuid={profile.uuid}"
if request.method == 'POST':
form = ScheduleSlotForm(request.POST, instance=slot, cancel_url=cancel_url)
form = ScheduleSlotForm(request.POST, instance=slot, cancel_url=cancel_url, profile=profile)
if form.is_valid():
new_slot = form.save(commit=False)
new_slot.profile = profile
@@ -94,7 +94,7 @@ def view_manage_scheduler_slot(request):
messages.success(request, _('Time Interval saved successfully.'))
return redirect(cancel_url)
else:
form = ScheduleSlotForm(instance=slot, cancel_url=cancel_url)
form = ScheduleSlotForm(instance=slot, cancel_url=cancel_url, profile=profile)
context = {
'form': form,
@@ -123,4 +123,4 @@ def view_delete_scheduler_slot(request):
'cancel_url': cancel_url,
'text': _('Are you sure you want to delete this time interval?')
}
return render(request, 'scheduler/generic_delete_confirm.html', context)
return render(request, 'generic_delete_confirmation.html', context)