jeremystretch 3 лет назад
Родитель
Сommit
758030733c

+ 9 - 1
netbox/extras/forms/reports.py

@@ -2,7 +2,7 @@ from django import forms
 from django.utils import timezone
 from django.utils.translation import gettext as _
 
-from utilities.forms import BootstrapMixin, DateTimePicker
+from utilities.forms import BootstrapMixin, DateTimePicker, SelectDurationWidget
 
 __all__ = (
     'ReportForm',
@@ -20,6 +20,7 @@ class ReportForm(BootstrapMixin, forms.Form):
         required=False,
         min_value=1,
         label=_("Recurs every"),
+        widget=SelectDurationWidget(),
         help_text=_("Interval at which this report is re-run (in minutes)")
     )
 
@@ -29,3 +30,10 @@ class ReportForm(BootstrapMixin, forms.Form):
             raise forms.ValidationError(_('Scheduled time must be in the future.'))
 
         return scheduled_time
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+        # Annotate the current system time for reference
+        now = timezone.now().strftime('%Y-%m-%d %H:%M:%S')
+        self.fields['schedule_at'].help_text += f' (current time: <strong>{now}</strong>)'

+ 6 - 1
netbox/extras/forms/scripts.py

@@ -2,7 +2,7 @@ from django import forms
 from django.utils import timezone
 from django.utils.translation import gettext as _
 
-from utilities.forms import BootstrapMixin, DateTimePicker
+from utilities.forms import BootstrapMixin, DateTimePicker, SelectDurationWidget
 
 __all__ = (
     'ScriptForm',
@@ -26,12 +26,17 @@ class ScriptForm(BootstrapMixin, forms.Form):
         required=False,
         min_value=1,
         label=_("Recurs every"),
+        widget=SelectDurationWidget(),
         help_text=_("Interval at which this script is re-run (in minutes)")
     )
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
+        # Annotate the current system time for reference
+        now = timezone.now().strftime('%Y-%m-%d %H:%M:%S')
+        self.fields['_schedule_at'].help_text += f' (current time: <strong>{now}</strong>)'
+
         # Move _commit and _schedule_at to the end of the form
         schedule_at = self.fields.pop('_schedule_at')
         interval = self.fields.pop('_interval')

+ 20 - 21
netbox/templates/extras/report.html

@@ -34,33 +34,32 @@
 {% block content %}
   <div role="tabpanel" class="tab-pane active" id="report">
     {% if perms.extras.run_report %}
-    <div class="row">
-      <div class="col">
+      <div class="row">
+        <div class="col">
           <form action="{% url 'extras:report' module=report.module name=report.class_name %}" method="post" class="form-object-edit">
-              {% csrf_token %}
-              {% render_form form %}
-              <div class="float-end">
-                <button type="submit" name="_run" class="btn btn-primary">
-                    {% if report.result %}
-                        <i class="mdi mdi-replay"></i> Run Again
-                    {% else %}
-                        <i class="mdi mdi-play"></i> Run Report
-                    {% endif %}
-                </button>
-              </div>
+            {% csrf_token %}
+            {% render_form form %}
+            <div class="float-end">
+              <button type="submit" name="_run" class="btn btn-primary">
+                {% if report.result %}
+                  <i class="mdi mdi-replay"></i> Run Again
+                {% else %}
+                  <i class="mdi mdi-play"></i> Run Report
+                {% endif %}
+              </button>
+            </div>
           </form>
         </div>
       </div>
-
     {% endif %}
     <div class="row">
-        <div class="col col-md-12">
-            {% if report.result %}
-                Last run: <a href="{% url 'extras:report_result' job_result_pk=report.result.pk %}">
-                    <strong>{{ report.result.created|annotated_date }}</strong>
-                </a>
-            {% endif %}
-        </div>
+      <div class="col col-md-12">
+        {% if report.result %}
+          Last run: <a href="{% url 'extras:report_result' job_result_pk=report.result.pk %}">
+            <strong>{{ report.result.created|annotated_date }}</strong>
+          </a>
+        {% endif %}
+      </div>
     </div>
   </div>
 {% endblock content %}

+ 8 - 0
netbox/utilities/forms/widgets.py

@@ -17,6 +17,7 @@ __all__ = (
     'DatePicker',
     'DateTimePicker',
     'NumericArrayField',
+    'SelectDurationWidget',
     'SelectSpeedWidget',
     'SelectWithPK',
     'SlugWidget',
@@ -108,6 +109,13 @@ class SelectSpeedWidget(forms.NumberInput):
     template_name = 'widgets/select_speed.html'
 
 
+class SelectDurationWidget(forms.NumberInput):
+    """
+    Dropdown to select one of several common options for a time duration (in minutes).
+    """
+    template_name = 'widgets/select_duration.html'
+
+
 class NumericArrayField(SimpleArrayField):
 
     def clean(self, value):

+ 11 - 0
netbox/utilities/templates/widgets/select_duration.html

@@ -0,0 +1,11 @@
+<div class="input-group">
+  {% include 'django/forms/widgets/number.html' %}
+  <button type="button" class="btn btn-outline-dark border-input dropdown-toggle" data-bs-toggle="dropdown"></button>
+  <ul class="dropdown-menu dropdown-menu-end">
+    <li><a href="#" target="id_{{ widget.name }}" data="60" class="set_speed dropdown-item">Hourly</a></li>
+    <li><a href="#" target="id_{{ widget.name }}" data="720" class="set_speed dropdown-item">12 hours</a></li>
+    <li><a href="#" target="id_{{ widget.name }}" data="1440" class="set_speed dropdown-item">Daily</a></li>
+    <li><a href="#" target="id_{{ widget.name }}" data="10080" class="set_speed dropdown-item">Weekly</a></li>
+    <li><a href="#" target="id_{{ widget.name }}" data="43200" class="set_speed dropdown-item">30 days</a></li>
+  </ul>
+</div>