Jelajahi Sumber

Closes #12292: Replace SelectSpeedWidget and SelectDurationWidget with NumberWithOptions

jeremystretch 2 tahun lalu
induk
melakukan
c08c7dda50

+ 32 - 0
netbox/circuits/choices.py

@@ -25,6 +25,22 @@ class CircuitStatusChoices(ChoiceSet):
     ]
     ]
 
 
 
 
+class CircuitCommitRateChoices(ChoiceSet):
+    key = 'Circuit.commit_rate'
+
+    CHOICES = [
+        (10000, '10 Mbps'),
+        (100000, '100 Mbps'),
+        (1000000, '1 Gbps'),
+        (10000000, '10 Gbps'),
+        (25000000, '25 Gbps'),
+        (40000000, '40 Gbps'),
+        (100000000, '100 Gbps'),
+        (1544, 'T1 (1.544 Mbps)'),
+        (2048, 'E1 (2.048 Mbps)'),
+    ]
+
+
 #
 #
 # CircuitTerminations
 # CircuitTerminations
 #
 #
@@ -38,3 +54,19 @@ class CircuitTerminationSideChoices(ChoiceSet):
         (SIDE_A, 'A'),
         (SIDE_A, 'A'),
         (SIDE_Z, 'Z')
         (SIDE_Z, 'Z')
     )
     )
+
+
+class CircuitTerminationPortSpeedChoices(ChoiceSet):
+    key = 'CircuitTermination.port_speed'
+
+    CHOICES = [
+        (10000, '10 Mbps'),
+        (100000, '100 Mbps'),
+        (1000000, '1 Gbps'),
+        (10000000, '10 Gbps'),
+        (25000000, '25 Gbps'),
+        (40000000, '40 Gbps'),
+        (100000000, '100 Gbps'),
+        (1544, 'T1 (1.544 Mbps)'),
+        (2048, 'E1 (2.048 Mbps)'),
+    ]

+ 6 - 3
netbox/circuits/forms/bulk_edit.py

@@ -1,14 +1,14 @@
 from django import forms
 from django import forms
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
-from circuits.choices import CircuitStatusChoices
+from circuits.choices import CircuitCommitRateChoices, CircuitStatusChoices
 from circuits.models import *
 from circuits.models import *
 from ipam.models import ASN
 from ipam.models import ASN
 from netbox.forms import NetBoxModelBulkEditForm
 from netbox.forms import NetBoxModelBulkEditForm
 from tenancy.models import Tenant
 from tenancy.models import Tenant
 from utilities.forms import add_blank_choice
 from utilities.forms import add_blank_choice
 from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField
 from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField
-from utilities.forms.widgets import DatePicker
+from utilities.forms.widgets import DatePicker, NumberWithOptions
 
 
 __all__ = (
 __all__ = (
     'CircuitBulkEditForm',
     'CircuitBulkEditForm',
@@ -139,7 +139,10 @@ class CircuitBulkEditForm(NetBoxModelBulkEditForm):
     )
     )
     commit_rate = forms.IntegerField(
     commit_rate = forms.IntegerField(
         required=False,
         required=False,
-        label=_('Commit rate (Kbps)')
+        label=_('Commit rate (Kbps)'),
+        widget=NumberWithOptions(
+            options=CircuitCommitRateChoices
+        )
     )
     )
     description = forms.CharField(
     description = forms.CharField(
         max_length=100,
         max_length=100,

+ 6 - 3
netbox/circuits/forms/filtersets.py

@@ -1,14 +1,14 @@
 from django import forms
 from django import forms
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
-from circuits.choices import CircuitStatusChoices
+from circuits.choices import CircuitCommitRateChoices, CircuitStatusChoices
 from circuits.models import *
 from circuits.models import *
 from dcim.models import Region, Site, SiteGroup
 from dcim.models import Region, Site, SiteGroup
 from ipam.models import ASN
 from ipam.models import ASN
 from netbox.forms import NetBoxModelFilterSetForm
 from netbox.forms import NetBoxModelFilterSetForm
 from tenancy.forms import TenancyFilterForm, ContactModelFilterForm
 from tenancy.forms import TenancyFilterForm, ContactModelFilterForm
 from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField
 from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField
-from utilities.forms.widgets import DatePicker
+from utilities.forms.widgets import DatePicker, NumberWithOptions
 
 
 __all__ = (
 __all__ = (
     'CircuitFilterForm',
     'CircuitFilterForm',
@@ -168,6 +168,9 @@ class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi
     commit_rate = forms.IntegerField(
     commit_rate = forms.IntegerField(
         required=False,
         required=False,
         min_value=0,
         min_value=0,
-        label=_('Commit rate (Kbps)')
+        label=_('Commit rate (Kbps)'),
+        widget=NumberWithOptions(
+            options=CircuitCommitRateChoices
+        )
     )
     )
     tag = TagFilterField(model)
     tag = TagFilterField(model)

+ 11 - 4
netbox/circuits/forms/model_forms.py

@@ -1,12 +1,13 @@
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
+from circuits.choices import CircuitCommitRateChoices, CircuitTerminationPortSpeedChoices
 from circuits.models import *
 from circuits.models import *
 from dcim.models import Site
 from dcim.models import Site
 from ipam.models import ASN
 from ipam.models import ASN
 from netbox.forms import NetBoxModelForm
 from netbox.forms import NetBoxModelForm
 from tenancy.forms import TenancyForm
 from tenancy.forms import TenancyForm
 from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField
 from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField
-from utilities.forms.widgets import DatePicker, SelectSpeedWidget
+from utilities.forms.widgets import DatePicker, NumberWithOptions
 
 
 __all__ = (
 __all__ = (
     'CircuitForm',
     'CircuitForm',
@@ -116,7 +117,9 @@ class CircuitForm(TenancyForm, NetBoxModelForm):
         widgets = {
         widgets = {
             'install_date': DatePicker(),
             'install_date': DatePicker(),
             'termination_date': DatePicker(),
             'termination_date': DatePicker(),
-            'commit_rate': SelectSpeedWidget(),
+            'commit_rate': NumberWithOptions(
+                options=CircuitCommitRateChoices
+            ),
         }
         }
 
 
 
 
@@ -143,6 +146,10 @@ class CircuitTerminationForm(NetBoxModelForm):
             'xconnect_id', 'pp_info', 'description', 'tags',
             'xconnect_id', 'pp_info', 'description', 'tags',
         ]
         ]
         widgets = {
         widgets = {
-            'port_speed': SelectSpeedWidget(),
-            'upstream_speed': SelectSpeedWidget(),
+            'port_speed': NumberWithOptions(
+                options=CircuitTerminationPortSpeedChoices
+            ),
+            'upstream_speed': NumberWithOptions(
+                options=CircuitTerminationPortSpeedChoices
+            ),
         }
         }

+ 14 - 0
netbox/dcim/choices.py

@@ -1096,6 +1096,20 @@ class InterfaceTypeChoices(ChoiceSet):
     )
     )
 
 
 
 
+class InterfaceSpeedChoices(ChoiceSet):
+    key = 'Interface.speed'
+
+    CHOICES = [
+        (10000, '10 Mbps'),
+        (100000, '100 Mbps'),
+        (1000000, '1 Gbps'),
+        (10000000, '10 Gbps'),
+        (25000000, '25 Gbps'),
+        (40000000, '40 Gbps'),
+        (100000000, '100 Gbps'),
+    ]
+
+
 class InterfaceDuplexChoices(ChoiceSet):
 class InterfaceDuplexChoices(ChoiceSet):
 
 
     DUPLEX_HALF = 'half'
     DUPLEX_HALF = 'half'

+ 4 - 3
netbox/dcim/forms/bulk_edit.py

@@ -12,7 +12,7 @@ from netbox.forms import NetBoxModelBulkEditForm
 from tenancy.models import Tenant
 from tenancy.models import Tenant
 from utilities.forms import BulkEditForm, add_blank_choice, form_from_model
 from utilities.forms import BulkEditForm, add_blank_choice, form_from_model
 from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField
 from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField
-from utilities.forms.widgets import BulkEditNullBooleanSelect, SelectSpeedWidget
+from utilities.forms.widgets import BulkEditNullBooleanSelect, NumberWithOptions
 
 
 __all__ = (
 __all__ = (
     'CableBulkEditForm',
     'CableBulkEditForm',
@@ -1169,8 +1169,9 @@ class InterfaceBulkEditForm(
     )
     )
     speed = forms.IntegerField(
     speed = forms.IntegerField(
         required=False,
         required=False,
-        widget=SelectSpeedWidget(),
-        label=_('Speed')
+        widget=NumberWithOptions(
+            options=InterfaceSpeedChoices
+        )
     )
     )
     mgmt_only = forms.NullBooleanField(
     mgmt_only = forms.NullBooleanField(
         required=False,
         required=False,

+ 4 - 3
netbox/dcim/forms/filtersets.py

@@ -12,7 +12,7 @@ from netbox.forms import NetBoxModelFilterSetForm
 from tenancy.forms import ContactModelFilterForm, TenancyFilterForm
 from tenancy.forms import ContactModelFilterForm, TenancyFilterForm
 from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
 from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
 from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField
 from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField
-from utilities.forms.widgets import APISelectMultiple, SelectSpeedWidget
+from utilities.forms.widgets import APISelectMultiple, NumberWithOptions
 from wireless.choices import *
 from wireless.choices import *
 
 
 __all__ = (
 __all__ = (
@@ -1154,8 +1154,9 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm):
     )
     )
     speed = forms.IntegerField(
     speed = forms.IntegerField(
         required=False,
         required=False,
-        label='Speed',
-        widget=SelectSpeedWidget()
+        widget=NumberWithOptions(
+            options=InterfaceSpeedChoices
+        )
     )
     )
     duplex = forms.MultipleChoiceField(
     duplex = forms.MultipleChoiceField(
         choices=InterfaceDuplexChoices,
         choices=InterfaceDuplexChoices,

+ 4 - 2
netbox/dcim/forms/model_forms.py

@@ -16,7 +16,7 @@ from utilities.forms.fields import (
     CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField,
     CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField,
     NumericArrayField, SlugField,
     NumericArrayField, SlugField,
 )
 )
-from utilities.forms.widgets import APISelect, ClearableFileInput, HTMXSelect, SelectSpeedWidget, SelectWithPK
+from utilities.forms.widgets import APISelect, ClearableFileInput, HTMXSelect, NumberWithOptions, SelectWithPK
 from virtualization.models import Cluster
 from virtualization.models import Cluster
 from wireless.models import WirelessLAN, WirelessLANGroup
 from wireless.models import WirelessLAN, WirelessLANGroup
 from .common import InterfaceCommonForm, ModuleCommonForm
 from .common import InterfaceCommonForm, ModuleCommonForm
@@ -1136,7 +1136,9 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
             'untagged_vlan', 'tagged_vlans', 'vrf', 'tags',
             'untagged_vlan', 'tagged_vlans', 'vrf', 'tags',
         ]
         ]
         widgets = {
         widgets = {
-            'speed': SelectSpeedWidget(),
+            'speed': NumberWithOptions(
+                options=InterfaceSpeedChoices
+            ),
             'mode': HTMXSelect(),
             'mode': HTMXSelect(),
         }
         }
         labels = {
         labels = {

+ 12 - 1
netbox/extras/choices.py

@@ -116,7 +116,7 @@ class JournalEntryKindChoices(ChoiceSet):
 
 
 
 
 #
 #
-# Log Levels for Reports and Scripts
+# Reports and Scripts
 #
 #
 
 
 class LogLevelChoices(ChoiceSet):
 class LogLevelChoices(ChoiceSet):
@@ -136,6 +136,17 @@ class LogLevelChoices(ChoiceSet):
     )
     )
 
 
 
 
+class DurationChoices(ChoiceSet):
+
+    CHOICES = (
+        (60, 'Hourly'),
+        (720, '12 hours'),
+        (1440, 'Daily'),
+        (10080, 'Weekly'),
+        (43200, '30 days'),
+    )
+
+
 #
 #
 # Job results
 # Job results
 #
 #

+ 5 - 2
netbox/extras/forms/reports.py

@@ -1,8 +1,9 @@
 from django import forms
 from django import forms
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
+from extras.choices import DurationChoices
 from utilities.forms import BootstrapMixin
 from utilities.forms import BootstrapMixin
-from utilities.forms.widgets import DateTimePicker, SelectDurationWidget
+from utilities.forms.widgets import DateTimePicker, NumberWithOptions
 from utilities.utils import local_now
 from utilities.utils import local_now
 
 
 __all__ = (
 __all__ = (
@@ -21,7 +22,9 @@ class ReportForm(BootstrapMixin, forms.Form):
         required=False,
         required=False,
         min_value=1,
         min_value=1,
         label=_("Recurs every"),
         label=_("Recurs every"),
-        widget=SelectDurationWidget(),
+        widget=NumberWithOptions(
+            options=DurationChoices
+        ),
         help_text=_("Interval at which this report is re-run (in minutes)")
         help_text=_("Interval at which this report is re-run (in minutes)")
     )
     )
 
 

+ 5 - 2
netbox/extras/forms/scripts.py

@@ -1,8 +1,9 @@
 from django import forms
 from django import forms
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
+from extras.choices import DurationChoices
 from utilities.forms import BootstrapMixin
 from utilities.forms import BootstrapMixin
-from utilities.forms.widgets import DateTimePicker, SelectDurationWidget
+from utilities.forms.widgets import DateTimePicker, NumberWithOptions
 from utilities.utils import local_now
 from utilities.utils import local_now
 
 
 __all__ = (
 __all__ = (
@@ -27,7 +28,9 @@ class ScriptForm(BootstrapMixin, forms.Form):
         required=False,
         required=False,
         min_value=1,
         min_value=1,
         label=_("Recurs every"),
         label=_("Recurs every"),
-        widget=SelectDurationWidget(),
+        widget=NumberWithOptions(
+            options=DurationChoices
+        ),
         help_text=_("Interval at which this script is re-run (in minutes)")
         help_text=_("Interval at which this script is re-run (in minutes)")
     )
     )
 
 

File diff ditekan karena terlalu besar
+ 0 - 0
netbox/project-static/dist/netbox.js


File diff ditekan karena terlalu besar
+ 0 - 0
netbox/project-static/dist/netbox.js.map


+ 1 - 1
netbox/project-static/src/forms/speedSelector.ts

@@ -4,7 +4,7 @@ import { getElements } from '../util';
  * Set the value of the number input field based on the selection of the dropdown.
  * Set the value of the number input field based on the selection of the dropdown.
  */
  */
 export function initSpeedSelector(): void {
 export function initSpeedSelector(): void {
-  for (const element of getElements<HTMLAnchorElement>('a.set_speed')) {
+  for (const element of getElements<HTMLAnchorElement>('a.set_field_value')) {
     if (element !== null) {
     if (element !== null) {
       function handleClick(event: Event) {
       function handleClick(event: Event) {
         // Don't reload the page (due to href="#").
         // Don't reload the page (due to href="#").

+ 17 - 0
netbox/utilities/forms/widgets/misc.py

@@ -3,6 +3,7 @@ from django import forms
 __all__ = (
 __all__ = (
     'ClearableFileInput',
     'ClearableFileInput',
     'MarkdownWidget',
     'MarkdownWidget',
+    'NumberWithOptions',
     'SlugWidget',
     'SlugWidget',
 )
 )
 
 
@@ -21,6 +22,22 @@ class MarkdownWidget(forms.Textarea):
     template_name = 'widgets/markdown_input.html'
     template_name = 'widgets/markdown_input.html'
 
 
 
 
+class NumberWithOptions(forms.NumberInput):
+    """
+    Number field with a dropdown pre-populated with common values for convenience.
+    """
+    template_name = 'widgets/number_with_options.html'
+
+    def __init__(self, options, attrs=None):
+        self.options = options
+        super().__init__(attrs)
+
+    def get_context(self, name, value, attrs):
+        context = super().get_context(name, value, attrs)
+        context['widget']['options'] = self.options
+        return context
+
+
 class SlugWidget(forms.TextInput):
 class SlugWidget(forms.TextInput):
     """
     """
     Subclass TextInput and add a slug regeneration button next to the form field.
     Subclass TextInput and add a slug regeneration button next to the form field.

+ 0 - 16
netbox/utilities/forms/widgets/select.py

@@ -7,8 +7,6 @@ __all__ = (
     'BulkEditNullBooleanSelect',
     'BulkEditNullBooleanSelect',
     'ColorSelect',
     'ColorSelect',
     'HTMXSelect',
     'HTMXSelect',
-    'SelectDurationWidget',
-    'SelectSpeedWidget',
     'SelectWithPK',
     'SelectWithPK',
 )
 )
 
 
@@ -63,17 +61,3 @@ class SelectWithPK(forms.Select):
     Include the primary key of each option in the option label (e.g. "Router7 (4721)").
     Include the primary key of each option in the option label (e.g. "Router7 (4721)").
     """
     """
     option_template_name = 'widgets/select_option_with_pk.html'
     option_template_name = 'widgets/select_option_with_pk.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 SelectSpeedWidget(forms.NumberInput):
-    """
-    Speed field with dropdown selections for convenience.
-    """
-    template_name = 'widgets/select_speed.html'

+ 11 - 0
netbox/utilities/templates/widgets/number_with_options.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">
+    {% for value, label in widget.options %}
+      <li>
+        <a href="#" target="id_{{ widget.name }}" data="{{ value }}" class="set_field_value dropdown-item">{{ label }}</a>
+      </li>
+    {% endfor %}
+  </ul>
+</div>

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

@@ -1,11 +0,0 @@
-<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>

+ 0 - 16
netbox/utilities/templates/widgets/select_speed.html

@@ -1,16 +0,0 @@
-<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="10000" class="set_speed dropdown-item">10 Mbps</a></li>
-    <li><a href="#" target="id_{{ widget.name }}" data="100000" class="set_speed dropdown-item">100 Mbps</a></li>
-    <li><a href="#" target="id_{{ widget.name }}" data="1000000" class="set_speed dropdown-item">1 Gbps</a></li>
-    <li><a href="#" target="id_{{ widget.name }}" data="10000000" class="set_speed dropdown-item">10 Gbps</a></li>
-    <li><a href="#" target="id_{{ widget.name }}" data="25000000" class="set_speed dropdown-item">25 Gbps</a></li>
-    <li><a href="#" target="id_{{ widget.name }}" data="40000000" class="set_speed dropdown-item">40 Gbps</a></li>
-    <li><a href="#" target="id_{{ widget.name }}" data="100000000" class="set_speed dropdown-item">100 Gbps</a></li>
-    <li><hr class="dropdown-divider"/></li>
-    <li><a href="#" target="id_{{ widget.name }}" data="1544" class="set_speed dropdown-item">T1 (1.544 Mbps)</a></li>
-    <li><a href="#" target="id_{{ widget.name }}" data="2048" class="set_speed dropdown-item">E1 (2.048 Mbps)</a></li>
-  </ul>
-</div>

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini