From 951c4135c219012bd05e4d04ff854dd8559f582f Mon Sep 17 00:00:00 2001 From: Hamish W Date: Tue, 25 Jul 2023 09:26:10 +0000 Subject: [PATCH] Adding Absolute Timers to base timerboard --- .../static/allianceauth/js/timerboard.js | 30 ++++++++++++++++ .../templates/bundles/timerboard-js.html | 3 ++ allianceauth/timerboard/form.py | 35 +++++++++++++------ .../timerboard/templates/timerboard/form.html | 18 ++++++++++ .../timerboard/timer_create_form.html | 16 +++++++++ .../timerboard/timer_update_form.html | 20 +++++++++++ 6 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 allianceauth/static/allianceauth/js/timerboard.js create mode 100644 allianceauth/templates/bundles/timerboard-js.html diff --git a/allianceauth/static/allianceauth/js/timerboard.js b/allianceauth/static/allianceauth/js/timerboard.js new file mode 100644 index 00000000..26ceb226 --- /dev/null +++ b/allianceauth/static/allianceauth/js/timerboard.js @@ -0,0 +1,30 @@ +$(document).ready(() => { + 'use strict'; + const inputAbsoluteTime = $('input#id_absolute_time'); + const inputCountdown = $('#id_days_left, #id_hours_left, #id_minutes_left'); + + //inputAbsoluteTime.prop('disabled', true); + inputAbsoluteTime.parent().hide() + inputAbsoluteTime.parent().prev('label').hide() + inputCountdown.prop('required', true); + + $('input#id_absolute_checkbox').change(function () { + if ($(this).prop("checked")) { + // check box enabled + inputAbsoluteTime.parent().show() + inputAbsoluteTime.parent().prev('label').show() + inputCountdown.parent().hide() + inputCountdown.parent().prev('label').hide() + inputAbsoluteTime.prop('required', true); + inputCountdown.prop('required', false); + } else { + // Checkbox is not checked + inputAbsoluteTime.parent().hide() + inputAbsoluteTime.parent().prev('label').hide() + inputCountdown.parent().show() + inputCountdown.parent().prev('label').show() + inputAbsoluteTime.prop('required', false); + inputCountdown.prop('required', true); + } + }); +}); diff --git a/allianceauth/templates/bundles/timerboard-js.html b/allianceauth/templates/bundles/timerboard-js.html new file mode 100644 index 00000000..8cf6f353 --- /dev/null +++ b/allianceauth/templates/bundles/timerboard-js.html @@ -0,0 +1,3 @@ +{% load static %} + + diff --git a/allianceauth/timerboard/form.py b/allianceauth/timerboard/form.py index 121d4ff3..e42cc10c 100755 --- a/allianceauth/timerboard/form.py +++ b/allianceauth/timerboard/form.py @@ -61,14 +61,17 @@ class TimerForm(forms.ModelForm): structure = forms.ChoiceField(choices=structure_choices, required=True, label=_("Structure Type")) timer_type = forms.ChoiceField(choices=TimerType.choices, label=_("Timer Type")) objective = forms.ChoiceField(choices=objective_choices, required=True, label=_("Objective")) - days_left = forms.IntegerField(required=True, label=_("Days Remaining"), validators=[MinValueValidator(0)]) - hours_left = forms.IntegerField(required=True, label=_("Hours Remaining"), + absolute_checkbox = forms.BooleanField(label=_("Absolute Timer"), required=False, initial=False) + absolute_time = forms.CharField(required=False,label=_("Date and Time")) + days_left = forms.IntegerField(required=False, label=_("Days Remaining"), validators=[MinValueValidator(0)]) + hours_left = forms.IntegerField(required=False, label=_("Hours Remaining"), validators=[MinValueValidator(0), MaxValueValidator(23)]) - minutes_left = forms.IntegerField(required=True, label=_("Minutes Remaining"), + minutes_left = forms.IntegerField(required=False, label=_("Minutes Remaining"), validators=[MinValueValidator(0), MaxValueValidator(59)]) important = forms.BooleanField(label=_("Important"), required=False) corp_timer = forms.BooleanField(label=_("Corp-Restricted"), required=False) + def save(self, commit=True): timer = super().save(commit=False) @@ -77,18 +80,30 @@ class TimerForm(forms.ModelForm): corporation = character.corporation logger.debug("Determined timer save request on behalf " "of character {} corporation {}".format(character, corporation)) - # calculate future time - future_time = datetime.timedelta(days=self.cleaned_data['days_left'], hours=self.cleaned_data['hours_left'], - minutes=self.cleaned_data['minutes_left']) - current_time = timezone.now() - eve_time = current_time + future_time - logger.debug( - f"Determined timer eve time is {eve_time} - current time {current_time}, adding {future_time}") + + days_left = self.cleaned_data['days_left'] + hours_left = self.cleaned_data['hours_left'] + minutes_left = self.cleaned_data['minutes_left'] + absolute_time = self.cleaned_data['absolute_time'] + + if days_left or hours_left or minutes_left: + # Calculate future time + future_time = datetime.timedelta(days=days_left, hours=hours_left, minutes=minutes_left) + current_time = timezone.now() + eve_time = current_time + future_time + logger.debug(f"Determined timer eve time is {eve_time} - current time {current_time}, adding {future_time}") + elif absolute_time: + # Use absolute time + eve_time = absolute_time + else: + raise ValueError("Either future time or absolute time must be provided.") timer.eve_time = eve_time timer.eve_character = character timer.eve_corp = corporation timer.user = self.user + if commit: timer.save() + return timer diff --git a/allianceauth/timerboard/templates/timerboard/form.html b/allianceauth/timerboard/templates/timerboard/form.html index e52727c3..35faab0b 100644 --- a/allianceauth/timerboard/templates/timerboard/form.html +++ b/allianceauth/timerboard/templates/timerboard/form.html @@ -30,3 +30,21 @@ {% endblock content %} + +{% block extra_javascript %} +{% include 'bundles/jquery-datetimepicker-js.html' %} +{% endblock %} + +{% block extra_script %} +$('#id_start').datetimepicker({ +setlocale: '{{ LANGUAGE_CODE }}', +{% if NIGHT_MODE %} +theme: 'dark', +{% else %} +theme: 'default', +{% endif %} +mask: true, +format: 'Y-m-d H:i', +minDate: 0 +}); +{% endblock extra_script %} diff --git a/allianceauth/timerboard/templates/timerboard/timer_create_form.html b/allianceauth/timerboard/templates/timerboard/timer_create_form.html index 9ff5dc75..c8d2d0d1 100644 --- a/allianceauth/timerboard/templates/timerboard/timer_create_form.html +++ b/allianceauth/timerboard/templates/timerboard/timer_create_form.html @@ -12,3 +12,19 @@ {% block submit_button_text %} {% translate "Create Timer" %} {% endblock %} + +{% block extra_javascript %} +{% include 'bundles/timerboard-js.html' %} +{% include 'bundles/jquery-datetimepicker-js.html' %} +{% include 'bundles/jquery-datetimepicker-css.html' %} +{% endblock %} + +{% block extra_script %} +$('input#id_absolute_time').datetimepicker({ + setlocale: '{{ LANGUAGE_CODE }}', + theme: {% if NIGHT_MODE %}'dark'{% else %}'default'{% endif %}, + format: 'Y-m-d H:i', + minDate: 0, + defaultDate: null +}); +{% endblock extra_script %} diff --git a/allianceauth/timerboard/templates/timerboard/timer_update_form.html b/allianceauth/timerboard/templates/timerboard/timer_update_form.html index 7b2b0f48..b668ae3e 100644 --- a/allianceauth/timerboard/templates/timerboard/timer_update_form.html +++ b/allianceauth/timerboard/templates/timerboard/timer_update_form.html @@ -12,3 +12,23 @@ {% block submit_button_text %} {% translate "Update Structure Timer" %} {% endblock %} + +{% block extra_javascript %} +{% include 'bundles/timerboard-js.html' %} +{% include 'bundles/jquery-datetimepicker-js.html' %} +{% include 'bundles/jquery-datetimepicker-css.html' %} +{% endblock %} + +{% block extra_script %} +$('input#id_absolute_time').datetimepicker({ + setlocale: '{{ LANGUAGE_CODE }}', + {% if NIGHT_MODE %} + theme: 'dark', + {% else %} + theme: 'default', + {% endif %} + mask: true, + format: 'Y-m-d H:i', + defaultDate: null +}); +{% endblock extra_script %}