mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Add brief_mode to DynamicModelChoiceMixin
This commit is contained in:
@ -8,9 +8,9 @@ from extras.models import Tag
|
|||||||
from tenancy.forms import TenancyFilterForm, TenancyForm
|
from tenancy.forms import TenancyFilterForm, TenancyForm
|
||||||
from tenancy.models import Tenant
|
from tenancy.models import Tenant
|
||||||
from utilities.forms import (
|
from utilities.forms import (
|
||||||
APISelectMultiple, add_blank_choice, BootstrapMixin, CommentField, CSVChoiceField, CSVModelChoiceField,
|
add_blank_choice, BootstrapMixin, CommentField, CSVChoiceField, CSVModelChoiceField, CSVModelForm, DatePicker,
|
||||||
CSVModelForm, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SmallTextarea, SlugField,
|
DynamicModelChoiceField, DynamicModelMultipleChoiceField, SmallTextarea, SlugField, StaticSelect2,
|
||||||
StaticSelect2, StaticSelect2Multiple, TagFilterField,
|
StaticSelect2Multiple, TagFilterField,
|
||||||
)
|
)
|
||||||
from .choices import CircuitStatusChoices
|
from .choices import CircuitStatusChoices
|
||||||
from .models import Circuit, CircuitTermination, CircuitType, Provider
|
from .models import Circuit, CircuitTermination, CircuitType, Provider
|
||||||
|
@ -21,7 +21,7 @@ from ipam.models import IPAddress, VLAN
|
|||||||
from tenancy.forms import TenancyFilterForm, TenancyForm
|
from tenancy.forms import TenancyFilterForm, TenancyForm
|
||||||
from tenancy.models import Tenant, TenantGroup
|
from tenancy.models import Tenant, TenantGroup
|
||||||
from utilities.forms import (
|
from utilities.forms import (
|
||||||
APISelect, APISelectMultiple, add_blank_choice, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect,
|
APISelect, add_blank_choice, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect,
|
||||||
ColorSelect, CommentField, CSVChoiceField, CSVModelChoiceField, CSVModelForm, DynamicModelChoiceField,
|
ColorSelect, CommentField, CSVChoiceField, CSVModelChoiceField, CSVModelForm, DynamicModelChoiceField,
|
||||||
DynamicModelMultipleChoiceField, ExpandableNameField, form_from_model, JSONField, NumericArrayField, SelectWithPK,
|
DynamicModelMultipleChoiceField, ExpandableNameField, form_from_model, JSONField, NumericArrayField, SelectWithPK,
|
||||||
SmallTextarea, SlugField, StaticSelect2, StaticSelect2Multiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES,
|
SmallTextarea, SlugField, StaticSelect2, StaticSelect2Multiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES,
|
||||||
@ -2619,20 +2619,20 @@ class InterfaceForm(InterfaceCommonForm, BootstrapMixin, forms.ModelForm):
|
|||||||
required=False,
|
required=False,
|
||||||
label='Untagged VLAN',
|
label='Untagged VLAN',
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelect(full=True)
|
|
||||||
)
|
)
|
||||||
tagged_vlans = DynamicModelMultipleChoiceField(
|
tagged_vlans = DynamicModelMultipleChoiceField(
|
||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
label='Tagged VLANs',
|
label='Tagged VLANs',
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelectMultiple(full=True)
|
|
||||||
)
|
)
|
||||||
tags = DynamicModelMultipleChoiceField(
|
tags = DynamicModelMultipleChoiceField(
|
||||||
queryset=Tag.objects.all(),
|
queryset=Tag.objects.all(),
|
||||||
@ -2716,19 +2716,19 @@ class InterfaceCreateForm(ComponentCreateForm, InterfaceCommonForm):
|
|||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelect(full=True)
|
|
||||||
)
|
)
|
||||||
tagged_vlans = DynamicModelMultipleChoiceField(
|
tagged_vlans = DynamicModelMultipleChoiceField(
|
||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelectMultiple(full=True)
|
|
||||||
)
|
)
|
||||||
field_order = (
|
field_order = (
|
||||||
'device', 'name_pattern', 'label_pattern', 'type', 'enabled', 'lag', 'mtu', 'mac_address', 'description',
|
'device', 'name_pattern', 'label_pattern', 'type', 'enabled', 'lag', 'mtu', 'mac_address', 'description',
|
||||||
@ -2781,19 +2781,19 @@ class InterfaceBulkEditForm(
|
|||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelect(full=True)
|
|
||||||
)
|
)
|
||||||
tagged_vlans = DynamicModelMultipleChoiceField(
|
tagged_vlans = DynamicModelMultipleChoiceField(
|
||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelectMultiple(full=True)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -8,8 +8,8 @@ from extras.forms import (
|
|||||||
)
|
)
|
||||||
from extras.models import Tag
|
from extras.models import Tag
|
||||||
from utilities.forms import (
|
from utilities.forms import (
|
||||||
APISelectMultiple, BootstrapMixin, CSVModelChoiceField, CSVModelForm, DynamicModelChoiceField,
|
BootstrapMixin, CSVModelChoiceField, CSVModelForm, DynamicModelChoiceField, DynamicModelMultipleChoiceField,
|
||||||
DynamicModelMultipleChoiceField, SlugField, StaticSelect2Multiple, TagFilterField,
|
SlugField, TagFilterField,
|
||||||
)
|
)
|
||||||
from .constants import *
|
from .constants import *
|
||||||
from .models import Secret, SecretRole, UserKey
|
from .models import Secret, SecretRole, UserKey
|
||||||
|
@ -251,16 +251,18 @@ class DynamicModelChoiceMixin:
|
|||||||
:param null_option: The string used to represent a null selection (if any)
|
:param null_option: The string used to represent a null selection (if any)
|
||||||
:param disabled_indicator: The name of the field which, if populated, will disable selection of the
|
:param disabled_indicator: The name of the field which, if populated, will disable selection of the
|
||||||
choice (optional)
|
choice (optional)
|
||||||
|
:param brief_mode: Use the "brief" format (?brief=true) when making API requests (default)
|
||||||
"""
|
"""
|
||||||
filter = django_filters.ModelChoiceFilter
|
filter = django_filters.ModelChoiceFilter
|
||||||
widget = widgets.APISelect
|
widget = widgets.APISelect
|
||||||
|
|
||||||
def __init__(self, *args, display_field='name', query_params=None, null_option=None, disabled_indicator=None,
|
def __init__(self, display_field='name', query_params=None, null_option=None, disabled_indicator=None,
|
||||||
**kwargs):
|
brief_mode=True, *args, **kwargs):
|
||||||
self.display_field = display_field
|
self.display_field = display_field
|
||||||
self.query_params = query_params or {}
|
self.query_params = query_params or {}
|
||||||
self.null_option = null_option
|
self.null_option = null_option
|
||||||
self.disabled_indicator = disabled_indicator
|
self.disabled_indicator = disabled_indicator
|
||||||
|
self.brief_mode = brief_mode
|
||||||
|
|
||||||
# to_field_name is set by ModelChoiceField.__init__(), but we need to set it early for reference
|
# to_field_name is set by ModelChoiceField.__init__(), but we need to set it early for reference
|
||||||
# by widget_attrs()
|
# by widget_attrs()
|
||||||
@ -285,6 +287,10 @@ class DynamicModelChoiceMixin:
|
|||||||
if self.disabled_indicator is not None:
|
if self.disabled_indicator is not None:
|
||||||
attrs['disabled-indicator'] = self.disabled_indicator
|
attrs['disabled-indicator'] = self.disabled_indicator
|
||||||
|
|
||||||
|
# Toggle brief mode
|
||||||
|
if not self.brief_mode:
|
||||||
|
attrs['data-full'] = 'true'
|
||||||
|
|
||||||
# Attach any static query parameters
|
# Attach any static query parameters
|
||||||
for key, value in self.query_params.items():
|
for key, value in self.query_params.items():
|
||||||
widget.add_query_param(key, value)
|
widget.add_query_param(key, value)
|
||||||
|
@ -123,7 +123,6 @@ class APISelect(SelectWithDisabled):
|
|||||||
A select widget populated via an API call
|
A select widget populated via an API call
|
||||||
|
|
||||||
:param api_url: API endpoint URL. Required if not set automatically by the parent field.
|
:param api_url: API endpoint URL. Required if not set automatically by the parent field.
|
||||||
:param full: Omit brief=true when fetching REST API results
|
|
||||||
"""
|
"""
|
||||||
def __init__(self, api_url=None, full=False, *args, **kwargs):
|
def __init__(self, api_url=None, full=False, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@ -131,8 +130,6 @@ class APISelect(SelectWithDisabled):
|
|||||||
self.attrs['class'] = 'netbox-select2-api'
|
self.attrs['class'] = 'netbox-select2-api'
|
||||||
if api_url:
|
if api_url:
|
||||||
self.attrs['data-url'] = '/{}{}'.format(settings.BASE_PATH, api_url.lstrip('/')) # Inject BASE_PATH
|
self.attrs['data-url'] = '/{}{}'.format(settings.BASE_PATH, api_url.lstrip('/')) # Inject BASE_PATH
|
||||||
if full:
|
|
||||||
self.attrs['data-full'] = full
|
|
||||||
|
|
||||||
def add_query_param(self, name, value):
|
def add_query_param(self, name, value):
|
||||||
"""
|
"""
|
||||||
|
@ -13,10 +13,10 @@ from ipam.models import IPAddress, VLAN
|
|||||||
from tenancy.forms import TenancyFilterForm, TenancyForm
|
from tenancy.forms import TenancyFilterForm, TenancyForm
|
||||||
from tenancy.models import Tenant
|
from tenancy.models import Tenant
|
||||||
from utilities.forms import (
|
from utilities.forms import (
|
||||||
add_blank_choice, APISelect, APISelectMultiple, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect,
|
add_blank_choice, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, BulkRenameForm, CommentField,
|
||||||
BulkRenameForm, CommentField, ConfirmationForm, CSVChoiceField, CSVModelChoiceField, CSVModelForm,
|
ConfirmationForm, CSVChoiceField, CSVModelChoiceField, CSVModelForm, DynamicModelChoiceField,
|
||||||
DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, form_from_model, JSONField,
|
DynamicModelMultipleChoiceField, ExpandableNameField, form_from_model, JSONField, SlugField, SmallTextarea,
|
||||||
SlugField, SmallTextarea, StaticSelect2, StaticSelect2Multiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES,
|
StaticSelect2, StaticSelect2Multiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES,
|
||||||
)
|
)
|
||||||
from .choices import *
|
from .choices import *
|
||||||
from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
|
from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
|
||||||
@ -526,19 +526,19 @@ class VMInterfaceForm(BootstrapMixin, forms.ModelForm):
|
|||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelect(full=True)
|
|
||||||
)
|
)
|
||||||
tagged_vlans = DynamicModelMultipleChoiceField(
|
tagged_vlans = DynamicModelMultipleChoiceField(
|
||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelectMultiple(full=True)
|
|
||||||
)
|
)
|
||||||
tags = DynamicModelMultipleChoiceField(
|
tags = DynamicModelMultipleChoiceField(
|
||||||
queryset=Tag.objects.all(),
|
queryset=Tag.objects.all(),
|
||||||
@ -626,19 +626,19 @@ class VMInterfaceCreateForm(BootstrapMixin, forms.Form):
|
|||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelect(full=True)
|
|
||||||
)
|
)
|
||||||
tagged_vlans = DynamicModelMultipleChoiceField(
|
tagged_vlans = DynamicModelMultipleChoiceField(
|
||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelectMultiple(full=True)
|
|
||||||
)
|
)
|
||||||
tags = DynamicModelMultipleChoiceField(
|
tags = DynamicModelMultipleChoiceField(
|
||||||
queryset=Tag.objects.all(),
|
queryset=Tag.objects.all(),
|
||||||
@ -716,19 +716,19 @@ class VMInterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
|
|||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelect(full=True)
|
|
||||||
)
|
)
|
||||||
tagged_vlans = DynamicModelMultipleChoiceField(
|
tagged_vlans = DynamicModelMultipleChoiceField(
|
||||||
queryset=VLAN.objects.all(),
|
queryset=VLAN.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
|
brief_mode=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': 'null',
|
'site_id': 'null',
|
||||||
},
|
}
|
||||||
widget=APISelectMultiple(full=True)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
Reference in New Issue
Block a user