mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-23 04:22:01 -06:00
Merge pull request #7031 from netbox-community/object-filter-forms
Object filter forms
This commit is contained in:
commit
6a4ed099fc
@ -107,9 +107,9 @@ class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBu
|
|||||||
class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||||
model = Provider
|
model = Provider
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['region_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id'],
|
||||||
['asn', 'tag'],
|
['asn'],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -122,11 +122,18 @@ class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
|||||||
label=_('Region'),
|
label=_('Region'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
)
|
)
|
||||||
|
site_group_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=SiteGroup.objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('Site group'),
|
||||||
|
fetch_trigger='open'
|
||||||
|
)
|
||||||
site_id = DynamicModelMultipleChoiceField(
|
site_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Site.objects.all(),
|
queryset=Site.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
query_params={
|
query_params={
|
||||||
'region_id': '$region_id'
|
'region_id': '$region_id',
|
||||||
|
'site_group_id': '$site_group_id',
|
||||||
},
|
},
|
||||||
label=_('Site'),
|
label=_('Site'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
@ -202,7 +209,10 @@ class ProviderNetworkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomField
|
|||||||
|
|
||||||
class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||||
model = ProviderNetwork
|
model = ProviderNetwork
|
||||||
field_order = ['q', 'provider_id', 'tag']
|
field_groups = (
|
||||||
|
('q', 'tag'),
|
||||||
|
('provider_id',),
|
||||||
|
)
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
||||||
@ -368,17 +378,12 @@ class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBul
|
|||||||
|
|
||||||
class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
||||||
model = Circuit
|
model = Circuit
|
||||||
field_order = [
|
|
||||||
'q', 'type_id', 'provider_id', 'provider_network_id', 'status', 'region_id', 'site_id', 'tenant_group_id',
|
|
||||||
'tenant_id', 'commit_rate',
|
|
||||||
]
|
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['type_id', 'status', 'commit_rate'],
|
|
||||||
['provider_id', 'provider_network_id'],
|
['provider_id', 'provider_network_id'],
|
||||||
['region_id', 'site_id'],
|
['type_id', 'status', 'commit_rate'],
|
||||||
|
['region_id', 'site_group_id', 'site_id'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -417,11 +422,18 @@ class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilte
|
|||||||
label=_('Region'),
|
label=_('Region'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
)
|
)
|
||||||
|
site_group_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=SiteGroup.objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('Site group'),
|
||||||
|
fetch_trigger='open'
|
||||||
|
)
|
||||||
site_id = DynamicModelMultipleChoiceField(
|
site_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Site.objects.all(),
|
queryset=Site.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
query_params={
|
query_params={
|
||||||
'region_id': '$region_id'
|
'region_id': '$region_id',
|
||||||
|
'site_group_id': '$site_group_id',
|
||||||
},
|
},
|
||||||
label=_('Site'),
|
label=_('Site'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
|
@ -831,6 +831,17 @@ class DeviceComponentFilterSet(django_filters.FilterSet):
|
|||||||
to_field_name='slug',
|
to_field_name='slug',
|
||||||
label='Site name (slug)',
|
label='Site name (slug)',
|
||||||
)
|
)
|
||||||
|
location_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
field_name='device__location',
|
||||||
|
queryset=Location.objects.all(),
|
||||||
|
label='Location (ID)',
|
||||||
|
)
|
||||||
|
location = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
field_name='device__location__slug',
|
||||||
|
queryset=Location.objects.all(),
|
||||||
|
to_field_name='slug',
|
||||||
|
label='Location (slug)',
|
||||||
|
)
|
||||||
device_id = django_filters.ModelMultipleChoiceFilter(
|
device_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
queryset=Device.objects.all(),
|
queryset=Device.objects.all(),
|
||||||
label='Device (ID)',
|
label='Device (ID)',
|
||||||
@ -1053,39 +1064,6 @@ class InventoryItemFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet):
|
|||||||
method='search',
|
method='search',
|
||||||
label='Search',
|
label='Search',
|
||||||
)
|
)
|
||||||
region_id = TreeNodeMultipleChoiceFilter(
|
|
||||||
queryset=Region.objects.all(),
|
|
||||||
field_name='device__site__region',
|
|
||||||
lookup_expr='in',
|
|
||||||
label='Region (ID)',
|
|
||||||
)
|
|
||||||
region = TreeNodeMultipleChoiceFilter(
|
|
||||||
queryset=Region.objects.all(),
|
|
||||||
field_name='device__site__region',
|
|
||||||
lookup_expr='in',
|
|
||||||
to_field_name='slug',
|
|
||||||
label='Region (slug)',
|
|
||||||
)
|
|
||||||
site_id = django_filters.ModelMultipleChoiceFilter(
|
|
||||||
field_name='device__site',
|
|
||||||
queryset=Site.objects.all(),
|
|
||||||
label='Site (ID)',
|
|
||||||
)
|
|
||||||
site = django_filters.ModelMultipleChoiceFilter(
|
|
||||||
field_name='device__site__slug',
|
|
||||||
queryset=Site.objects.all(),
|
|
||||||
to_field_name='slug',
|
|
||||||
label='Site name (slug)',
|
|
||||||
)
|
|
||||||
device_id = django_filters.ModelChoiceFilter(
|
|
||||||
queryset=Device.objects.all(),
|
|
||||||
label='Device (ID)',
|
|
||||||
)
|
|
||||||
device = django_filters.ModelChoiceFilter(
|
|
||||||
queryset=Device.objects.all(),
|
|
||||||
to_field_name='name',
|
|
||||||
label='Device (name)',
|
|
||||||
)
|
|
||||||
parent_id = django_filters.ModelMultipleChoiceFilter(
|
parent_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
queryset=InventoryItem.objects.all(),
|
queryset=InventoryItem.objects.all(),
|
||||||
label='Parent inventory item (ID)',
|
label='Parent inventory item (ID)',
|
||||||
|
@ -58,11 +58,6 @@ class DeviceComponentFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
|||||||
field_order = [
|
field_order = [
|
||||||
'q', 'name', 'label', 'region_id', 'site_group_id', 'site_id',
|
'q', 'name', 'label', 'region_id', 'site_group_id', 'site_id',
|
||||||
]
|
]
|
||||||
field_groups = [
|
|
||||||
['q'],
|
|
||||||
['name', 'label'],
|
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
|
||||||
]
|
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
||||||
@ -90,16 +85,27 @@ class DeviceComponentFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
|||||||
queryset=Site.objects.all(),
|
queryset=Site.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
query_params={
|
query_params={
|
||||||
'region_id': '$region_id'
|
'region_id': '$region_id',
|
||||||
|
'group_id': '$site_group_id',
|
||||||
},
|
},
|
||||||
label=_('Site'),
|
label=_('Site'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
)
|
)
|
||||||
|
location_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=Location.objects.all(),
|
||||||
|
required=False,
|
||||||
|
query_params={
|
||||||
|
'site_id': '$site_id',
|
||||||
|
},
|
||||||
|
label=_('Location'),
|
||||||
|
fetch_trigger='open'
|
||||||
|
)
|
||||||
device_id = DynamicModelMultipleChoiceField(
|
device_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Device.objects.all(),
|
queryset=Device.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
query_params={
|
query_params={
|
||||||
'site_id': '$site_id'
|
'site_id': '$site_id',
|
||||||
|
'location_id': '$location_id',
|
||||||
},
|
},
|
||||||
label=_('Device'),
|
label=_('Device'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
@ -247,15 +253,22 @@ class RegionBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm):
|
|||||||
|
|
||||||
|
|
||||||
class RegionFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
class RegionFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||||
model = Site
|
model = Region
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q'],
|
||||||
|
['parent_id'],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
||||||
label=_('Search')
|
label=_('Search')
|
||||||
)
|
)
|
||||||
|
parent_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=Region.objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('Parent region'),
|
||||||
|
fetch_trigger='open'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -311,12 +324,19 @@ class SiteGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
|||||||
model = SiteGroup
|
model = SiteGroup
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q'],
|
||||||
|
['parent_id'],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
||||||
label=_('Search')
|
label=_('Search')
|
||||||
)
|
)
|
||||||
|
parent_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=SiteGroup.objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('Parent group'),
|
||||||
|
fetch_trigger='open'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -476,10 +496,9 @@ class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterFo
|
|||||||
model = Site
|
model = Site
|
||||||
field_order = ['q', 'status', 'region_id', 'tenant_group_id', 'tenant_id']
|
field_order = ['q', 'status', 'region_id', 'tenant_group_id', 'tenant_id']
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['status', 'region_id'],
|
['status', 'region_id', 'group_id'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -500,7 +519,7 @@ class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterFo
|
|||||||
group_id = DynamicModelMultipleChoiceField(
|
group_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=SiteGroup.objects.all(),
|
queryset=SiteGroup.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
label=_('Group'),
|
label=_('Site group'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
)
|
)
|
||||||
tag = TagFilterField(model)
|
tag = TagFilterField(model)
|
||||||
@ -607,11 +626,18 @@ class LocationFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
|||||||
label=_('Region'),
|
label=_('Region'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
)
|
)
|
||||||
|
site_group_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=SiteGroup.objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('Site group'),
|
||||||
|
fetch_trigger='open'
|
||||||
|
)
|
||||||
site_id = DynamicModelMultipleChoiceField(
|
site_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Site.objects.all(),
|
queryset=Site.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
query_params={
|
query_params={
|
||||||
'region_id': '$region_id'
|
'region_id': '$region_id',
|
||||||
|
'group_id': '$site_group_id',
|
||||||
},
|
},
|
||||||
label=_('Site'),
|
label=_('Site'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
@ -897,9 +923,10 @@ class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterFo
|
|||||||
model = Rack
|
model = Rack
|
||||||
field_order = ['q', 'region_id', 'site_id', 'location_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id']
|
field_order = ['q', 'region_id', 'site_id', 'location_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id']
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['status', 'role_id'],
|
|
||||||
['region_id', 'site_id', 'location_id'],
|
['region_id', 'site_id', 'location_id'],
|
||||||
|
['status', 'role_id'],
|
||||||
|
['type', 'width', 'asset_tag'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
@ -1134,9 +1161,10 @@ class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldMo
|
|||||||
model = RackReservation
|
model = RackReservation
|
||||||
field_order = ['q', 'region_id', 'site_id', 'location_id', 'user_id', 'tenant_group_id', 'tenant_id']
|
field_order = ['q', 'region_id', 'site_id', 'location_id', 'user_id', 'tenant_group_id', 'tenant_id']
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
|
['user_id'],
|
||||||
['region_id', 'site_id', 'location_id'],
|
['region_id', 'site_id', 'location_id'],
|
||||||
['user_id', 'tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -1155,7 +1183,7 @@ class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldMo
|
|||||||
query_params={
|
query_params={
|
||||||
'region_id': '$region_id'
|
'region_id': '$region_id'
|
||||||
},
|
},
|
||||||
label=_('Region'),
|
label=_('Site'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
)
|
)
|
||||||
location_id = DynamicModelMultipleChoiceField(
|
location_id = DynamicModelMultipleChoiceField(
|
||||||
@ -1292,12 +1320,9 @@ class DeviceTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModel
|
|||||||
class DeviceTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
class DeviceTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||||
model = DeviceType
|
model = DeviceType
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['manufacturer_id', 'subdevice_role'],
|
['manufacturer_id', 'subdevice_role'],
|
||||||
['console_ports', 'console_server_ports'],
|
['console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports'],
|
||||||
['power_ports', 'power_outlets'],
|
|
||||||
['interfaces', 'pass_through_ports'],
|
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -2526,12 +2551,15 @@ class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilt
|
|||||||
'tenant_id', 'manufacturer_id', 'device_type_id', 'asset_tag', 'mac_address', 'has_primary_ip',
|
'tenant_id', 'manufacturer_id', 'device_type_id', 'asset_tag', 'mac_address', 'has_primary_ip',
|
||||||
]
|
]
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['region_id', 'site_id', 'location_id', 'rack_id'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id'],
|
||||||
['status', 'role_id', 'asset_tag'],
|
['status', 'role_id', 'asset_tag', 'mac_address'],
|
||||||
|
['manufacturer_id', 'device_type_id', 'platform_id'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
['manufacturer_id', 'device_type_id'],
|
[
|
||||||
['mac_address', 'has_primary_ip'],
|
'has_primary_ip', 'virtual_chassis_member', 'console_ports', 'console_server_ports', 'power_ports',
|
||||||
|
'power_outlets', 'interfaces', 'pass_through_ports', 'local_context_data',
|
||||||
|
],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -2547,7 +2575,8 @@ class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilt
|
|||||||
site_group_id = DynamicModelMultipleChoiceField(
|
site_group_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=SiteGroup.objects.all(),
|
queryset=SiteGroup.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
label=_('Site group')
|
label=_('Site group'),
|
||||||
|
fetch_trigger='open'
|
||||||
)
|
)
|
||||||
site_id = DynamicModelMultipleChoiceField(
|
site_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Site.objects.all(),
|
queryset=Site.objects.all(),
|
||||||
@ -2723,11 +2752,9 @@ class DeviceBulkAddComponentForm(BootstrapMixin, CustomFieldsMixin, ComponentFor
|
|||||||
class ConsolePortFilterForm(DeviceComponentFilterForm):
|
class ConsolePortFilterForm(DeviceComponentFilterForm):
|
||||||
model = ConsolePort
|
model = ConsolePort
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['name', 'label'],
|
['name', 'label', 'type', 'speed'],
|
||||||
['type', 'speed'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
type = forms.MultipleChoiceField(
|
type = forms.MultipleChoiceField(
|
||||||
choices=ConsolePortTypeChoices,
|
choices=ConsolePortTypeChoices,
|
||||||
@ -2831,11 +2858,9 @@ class ConsolePortCSVForm(CustomFieldModelCSVForm):
|
|||||||
class ConsoleServerPortFilterForm(DeviceComponentFilterForm):
|
class ConsoleServerPortFilterForm(DeviceComponentFilterForm):
|
||||||
model = ConsoleServerPort
|
model = ConsoleServerPort
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['name', 'label'],
|
['name', 'label', 'type', 'speed'],
|
||||||
['type', 'speed'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
type = forms.MultipleChoiceField(
|
type = forms.MultipleChoiceField(
|
||||||
choices=ConsolePortTypeChoices,
|
choices=ConsolePortTypeChoices,
|
||||||
@ -2939,10 +2964,9 @@ class ConsoleServerPortCSVForm(CustomFieldModelCSVForm):
|
|||||||
class PowerPortFilterForm(DeviceComponentFilterForm):
|
class PowerPortFilterForm(DeviceComponentFilterForm):
|
||||||
model = PowerPort
|
model = PowerPort
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['name', 'label', 'type'],
|
['name', 'label', 'type'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
|
||||||
['tag'],
|
|
||||||
]
|
]
|
||||||
type = forms.MultipleChoiceField(
|
type = forms.MultipleChoiceField(
|
||||||
choices=PowerPortTypeChoices,
|
choices=PowerPortTypeChoices,
|
||||||
@ -3045,10 +3069,9 @@ class PowerPortCSVForm(CustomFieldModelCSVForm):
|
|||||||
class PowerOutletFilterForm(DeviceComponentFilterForm):
|
class PowerOutletFilterForm(DeviceComponentFilterForm):
|
||||||
model = PowerOutlet
|
model = PowerOutlet
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['name', 'label', 'type'],
|
['name', 'label', 'type'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
|
||||||
['tag'],
|
|
||||||
]
|
]
|
||||||
type = forms.MultipleChoiceField(
|
type = forms.MultipleChoiceField(
|
||||||
choices=PowerOutletTypeChoices,
|
choices=PowerOutletTypeChoices,
|
||||||
@ -3218,11 +3241,9 @@ class PowerOutletCSVForm(CustomFieldModelCSVForm):
|
|||||||
class InterfaceFilterForm(DeviceComponentFilterForm):
|
class InterfaceFilterForm(DeviceComponentFilterForm):
|
||||||
model = Interface
|
model = Interface
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['name', 'label', 'type', 'enabled'],
|
['name', 'label', 'type', 'enabled', 'mgmt_only', 'mac_address'],
|
||||||
['mgmt_only', 'mac_address'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
|
||||||
['tag'],
|
|
||||||
]
|
]
|
||||||
type = forms.MultipleChoiceField(
|
type = forms.MultipleChoiceField(
|
||||||
choices=InterfaceTypeChoices,
|
choices=InterfaceTypeChoices,
|
||||||
@ -3578,10 +3599,9 @@ class InterfaceCSVForm(CustomFieldModelCSVForm):
|
|||||||
|
|
||||||
class FrontPortFilterForm(DeviceComponentFilterForm):
|
class FrontPortFilterForm(DeviceComponentFilterForm):
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['name', 'label', 'type', 'color'],
|
['name', 'label', 'type', 'color'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
model = FrontPort
|
model = FrontPort
|
||||||
type = forms.MultipleChoiceField(
|
type = forms.MultipleChoiceField(
|
||||||
@ -3768,10 +3788,9 @@ class FrontPortCSVForm(CustomFieldModelCSVForm):
|
|||||||
class RearPortFilterForm(DeviceComponentFilterForm):
|
class RearPortFilterForm(DeviceComponentFilterForm):
|
||||||
model = RearPort
|
model = RearPort
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['name', 'label', 'type', 'color'],
|
['name', 'label', 'type', 'color'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
type = forms.MultipleChoiceField(
|
type = forms.MultipleChoiceField(
|
||||||
choices=PortTypeChoices,
|
choices=PortTypeChoices,
|
||||||
@ -3870,10 +3889,9 @@ class RearPortCSVForm(CustomFieldModelCSVForm):
|
|||||||
class DeviceBayFilterForm(DeviceComponentFilterForm):
|
class DeviceBayFilterForm(DeviceComponentFilterForm):
|
||||||
model = DeviceBay
|
model = DeviceBay
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['name', 'label'],
|
['name', 'label'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
tag = TagFilterField(model)
|
tag = TagFilterField(model)
|
||||||
|
|
||||||
@ -4122,11 +4140,9 @@ class InventoryItemBulkEditForm(
|
|||||||
class InventoryItemFilterForm(DeviceComponentFilterForm):
|
class InventoryItemFilterForm(DeviceComponentFilterForm):
|
||||||
model = InventoryItem
|
model = InventoryItem
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['name', 'label', 'manufacturer_id'],
|
['name', 'label', 'manufacturer_id', 'serial', 'asset_tag', 'discovered'],
|
||||||
['serial', 'asset_tag', 'discovered'],
|
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
manufacturer_id = DynamicModelMultipleChoiceField(
|
manufacturer_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Manufacturer.objects.all(),
|
queryset=Manufacturer.objects.all(),
|
||||||
@ -4598,11 +4614,10 @@ class CableBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkE
|
|||||||
class CableFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
class CableFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||||
model = Cable
|
model = Cable
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
|
['site_id', 'rack_id', 'device_id'],
|
||||||
['type', 'status', 'color'],
|
['type', 'status', 'color'],
|
||||||
['device_id', 'rack_id'],
|
['tenant_id'],
|
||||||
['region_id', 'site_id', 'tenant_id'],
|
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -4672,11 +4687,6 @@ class CableFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form):
|
class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form):
|
||||||
q = forms.CharField(
|
|
||||||
required=False,
|
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
|
||||||
label=_('Search')
|
|
||||||
)
|
|
||||||
region_id = DynamicModelMultipleChoiceField(
|
region_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Region.objects.all(),
|
queryset=Region.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
@ -4704,11 +4714,6 @@ class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form):
|
|||||||
|
|
||||||
|
|
||||||
class PowerConnectionFilterForm(BootstrapMixin, forms.Form):
|
class PowerConnectionFilterForm(BootstrapMixin, forms.Form):
|
||||||
q = forms.CharField(
|
|
||||||
required=False,
|
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
|
||||||
label=_('Search')
|
|
||||||
)
|
|
||||||
region_id = DynamicModelMultipleChoiceField(
|
region_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Region.objects.all(),
|
queryset=Region.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
@ -4736,11 +4741,6 @@ class PowerConnectionFilterForm(BootstrapMixin, forms.Form):
|
|||||||
|
|
||||||
|
|
||||||
class InterfaceConnectionFilterForm(BootstrapMixin, forms.Form):
|
class InterfaceConnectionFilterForm(BootstrapMixin, forms.Form):
|
||||||
q = forms.CharField(
|
|
||||||
required=False,
|
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
|
||||||
label=_('Search')
|
|
||||||
)
|
|
||||||
region_id = DynamicModelMultipleChoiceField(
|
region_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Region.objects.all(),
|
queryset=Region.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
@ -5010,10 +5010,9 @@ class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldMod
|
|||||||
model = VirtualChassis
|
model = VirtualChassis
|
||||||
field_order = ['q', 'region_id', 'site_group_id', 'site_id', 'tenant_group_id', 'tenant_id']
|
field_order = ['q', 'region_id', 'site_group_id', 'site_id', 'tenant_group_id', 'tenant_id']
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -5036,7 +5035,8 @@ class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldMod
|
|||||||
queryset=Site.objects.all(),
|
queryset=Site.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
query_params={
|
query_params={
|
||||||
'region_id': '$region_id'
|
'region_id': '$region_id',
|
||||||
|
'group_id': '$site_group_id',
|
||||||
},
|
},
|
||||||
label=_('Site'),
|
label=_('Site'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
@ -5159,6 +5159,10 @@ class PowerPanelBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModel
|
|||||||
|
|
||||||
class PowerPanelFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
class PowerPanelFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||||
model = PowerPanel
|
model = PowerPanel
|
||||||
|
field_groups = (
|
||||||
|
('q', 'tag'),
|
||||||
|
('region_id', 'site_group_id', 'site_id', 'location_id')
|
||||||
|
)
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
||||||
@ -5180,7 +5184,8 @@ class PowerPanelFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
|||||||
queryset=Site.objects.all(),
|
queryset=Site.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
query_params={
|
query_params={
|
||||||
'region_id': '$region_id'
|
'region_id': '$region_id',
|
||||||
|
'group_id': '$site_group_id',
|
||||||
},
|
},
|
||||||
label=_('Site'),
|
label=_('Site'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
@ -5402,12 +5407,10 @@ class PowerFeedBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
|
|||||||
class PowerFeedFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
class PowerFeedFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||||
model = PowerFeed
|
model = PowerFeed
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id'],
|
||||||
['power_panel_id', 'rack_id'],
|
['power_panel_id', 'rack_id'],
|
||||||
['type', 'supply', 'max_utilization'],
|
['status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization'],
|
||||||
['phase', 'voltage', 'amperage'],
|
|
||||||
['status', 'tag']
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
|
@ -1512,10 +1512,18 @@ class ConsolePortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
||||||
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
||||||
|
|
||||||
|
locations = (
|
||||||
|
Location(name='Location 1', slug='location-1', site=sites[0]),
|
||||||
|
Location(name='Location 2', slug='location-2', site=sites[1]),
|
||||||
|
Location(name='Location 3', slug='location-3', site=sites[2]),
|
||||||
|
)
|
||||||
|
for location in locations:
|
||||||
|
location.save()
|
||||||
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
|
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]),
|
||||||
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
|
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]),
|
||||||
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
|
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]),
|
||||||
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
@ -1584,6 +1592,13 @@ class ConsolePortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
params = {'device': [devices[0].name, devices[1].name]}
|
params = {'device': [devices[0].name, devices[1].name]}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_location(self):
|
||||||
|
locations = Location.objects.all()[:2]
|
||||||
|
params = {'location_id': [locations[0].pk, locations[1].pk]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
params = {'location': [locations[0].slug, locations[1].slug]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
def test_cabled(self):
|
def test_cabled(self):
|
||||||
params = {'cabled': 'true'}
|
params = {'cabled': 'true'}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
@ -1624,10 +1639,18 @@ class ConsoleServerPortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
||||||
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
||||||
|
|
||||||
|
locations = (
|
||||||
|
Location(name='Location 1', slug='location-1', site=sites[0]),
|
||||||
|
Location(name='Location 2', slug='location-2', site=sites[1]),
|
||||||
|
Location(name='Location 3', slug='location-3', site=sites[2]),
|
||||||
|
)
|
||||||
|
for location in locations:
|
||||||
|
location.save()
|
||||||
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
|
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]),
|
||||||
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
|
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]),
|
||||||
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
|
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]),
|
||||||
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
@ -1689,6 +1712,13 @@ class ConsoleServerPortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
params = {'site': [sites[0].slug, sites[1].slug]}
|
params = {'site': [sites[0].slug, sites[1].slug]}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_location(self):
|
||||||
|
locations = Location.objects.all()[:2]
|
||||||
|
params = {'location_id': [locations[0].pk, locations[1].pk]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
params = {'location': [locations[0].slug, locations[1].slug]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
def test_device(self):
|
def test_device(self):
|
||||||
devices = Device.objects.all()[:2]
|
devices = Device.objects.all()[:2]
|
||||||
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
||||||
@ -1736,10 +1766,18 @@ class PowerPortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
||||||
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
||||||
|
|
||||||
|
locations = (
|
||||||
|
Location(name='Location 1', slug='location-1', site=sites[0]),
|
||||||
|
Location(name='Location 2', slug='location-2', site=sites[1]),
|
||||||
|
Location(name='Location 3', slug='location-3', site=sites[2]),
|
||||||
|
)
|
||||||
|
for location in locations:
|
||||||
|
location.save()
|
||||||
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
|
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]),
|
||||||
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
|
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]),
|
||||||
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
|
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]),
|
||||||
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
@ -1809,6 +1847,13 @@ class PowerPortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
params = {'site': [sites[0].slug, sites[1].slug]}
|
params = {'site': [sites[0].slug, sites[1].slug]}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_location(self):
|
||||||
|
locations = Location.objects.all()[:2]
|
||||||
|
params = {'location_id': [locations[0].pk, locations[1].pk]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
params = {'location': [locations[0].slug, locations[1].slug]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
def test_device(self):
|
def test_device(self):
|
||||||
devices = Device.objects.all()[:2]
|
devices = Device.objects.all()[:2]
|
||||||
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
||||||
@ -1856,10 +1901,18 @@ class PowerOutletTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
||||||
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
||||||
|
|
||||||
|
locations = (
|
||||||
|
Location(name='Location 1', slug='location-1', site=sites[0]),
|
||||||
|
Location(name='Location 2', slug='location-2', site=sites[1]),
|
||||||
|
Location(name='Location 3', slug='location-3', site=sites[2]),
|
||||||
|
)
|
||||||
|
for location in locations:
|
||||||
|
location.save()
|
||||||
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
|
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]),
|
||||||
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
|
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]),
|
||||||
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
|
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]),
|
||||||
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
@ -1925,6 +1978,13 @@ class PowerOutletTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
params = {'site': [sites[0].slug, sites[1].slug]}
|
params = {'site': [sites[0].slug, sites[1].slug]}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_location(self):
|
||||||
|
locations = Location.objects.all()[:2]
|
||||||
|
params = {'location_id': [locations[0].pk, locations[1].pk]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
params = {'location': [locations[0].slug, locations[1].slug]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
def test_device(self):
|
def test_device(self):
|
||||||
devices = Device.objects.all()[:2]
|
devices = Device.objects.all()[:2]
|
||||||
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
||||||
@ -1972,10 +2032,18 @@ class InterfaceTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
||||||
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
||||||
|
|
||||||
|
locations = (
|
||||||
|
Location(name='Location 1', slug='location-1', site=sites[0]),
|
||||||
|
Location(name='Location 2', slug='location-2', site=sites[1]),
|
||||||
|
Location(name='Location 3', slug='location-3', site=sites[2]),
|
||||||
|
)
|
||||||
|
for location in locations:
|
||||||
|
location.save()
|
||||||
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
|
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]),
|
||||||
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
|
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]),
|
||||||
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
|
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]),
|
||||||
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
@ -2082,6 +2150,13 @@ class InterfaceTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
params = {'site': [sites[0].slug, sites[1].slug]}
|
params = {'site': [sites[0].slug, sites[1].slug]}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_location(self):
|
||||||
|
locations = Location.objects.all()[:2]
|
||||||
|
params = {'location_id': [locations[0].pk, locations[1].pk]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
params = {'location': [locations[0].slug, locations[1].slug]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
def test_device(self):
|
def test_device(self):
|
||||||
devices = Device.objects.all()[:2]
|
devices = Device.objects.all()[:2]
|
||||||
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
||||||
@ -2143,10 +2218,18 @@ class FrontPortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
||||||
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
||||||
|
|
||||||
|
locations = (
|
||||||
|
Location(name='Location 1', slug='location-1', site=sites[0]),
|
||||||
|
Location(name='Location 2', slug='location-2', site=sites[1]),
|
||||||
|
Location(name='Location 3', slug='location-3', site=sites[2]),
|
||||||
|
)
|
||||||
|
for location in locations:
|
||||||
|
location.save()
|
||||||
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
|
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]),
|
||||||
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
|
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]),
|
||||||
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
|
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]),
|
||||||
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
@ -2217,6 +2300,13 @@ class FrontPortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
params = {'site': [sites[0].slug, sites[1].slug]}
|
params = {'site': [sites[0].slug, sites[1].slug]}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_location(self):
|
||||||
|
locations = Location.objects.all()[:2]
|
||||||
|
params = {'location_id': [locations[0].pk, locations[1].pk]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
params = {'location': [locations[0].slug, locations[1].slug]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
def test_device(self):
|
def test_device(self):
|
||||||
devices = Device.objects.all()[:2]
|
devices = Device.objects.all()[:2]
|
||||||
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
||||||
@ -2264,10 +2354,18 @@ class RearPortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
||||||
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
||||||
|
|
||||||
|
locations = (
|
||||||
|
Location(name='Location 1', slug='location-1', site=sites[0]),
|
||||||
|
Location(name='Location 2', slug='location-2', site=sites[1]),
|
||||||
|
Location(name='Location 3', slug='location-3', site=sites[2]),
|
||||||
|
)
|
||||||
|
for location in locations:
|
||||||
|
location.save()
|
||||||
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
|
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]),
|
||||||
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
|
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]),
|
||||||
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
|
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]),
|
||||||
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
Device(name=None, device_type=device_type, device_role=device_role, site=sites[3]), # For cable connections
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
@ -2332,6 +2430,13 @@ class RearPortTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
params = {'site': [sites[0].slug, sites[1].slug]}
|
params = {'site': [sites[0].slug, sites[1].slug]}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_location(self):
|
||||||
|
locations = Location.objects.all()[:2]
|
||||||
|
params = {'location_id': [locations[0].pk, locations[1].pk]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
params = {'location': [locations[0].slug, locations[1].slug]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
def test_device(self):
|
def test_device(self):
|
||||||
devices = Device.objects.all()[:2]
|
devices = Device.objects.all()[:2]
|
||||||
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
||||||
@ -2379,10 +2484,18 @@ class DeviceBayTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
|
||||||
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
|
||||||
|
|
||||||
|
locations = (
|
||||||
|
Location(name='Location 1', slug='location-1', site=sites[0]),
|
||||||
|
Location(name='Location 2', slug='location-2', site=sites[1]),
|
||||||
|
Location(name='Location 3', slug='location-3', site=sites[2]),
|
||||||
|
)
|
||||||
|
for location in locations:
|
||||||
|
location.save()
|
||||||
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
|
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]),
|
||||||
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
|
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]),
|
||||||
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
|
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]),
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
|
|
||||||
@ -2426,6 +2539,13 @@ class DeviceBayTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
params = {'site': [sites[0].slug, sites[1].slug]}
|
params = {'site': [sites[0].slug, sites[1].slug]}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
|
def test_location(self):
|
||||||
|
locations = Location.objects.all()[:2]
|
||||||
|
params = {'location_id': [locations[0].pk, locations[1].pk]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
params = {'location': [locations[0].slug, locations[1].slug]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
|
||||||
def test_device(self):
|
def test_device(self):
|
||||||
devices = Device.objects.all()[:2]
|
devices = Device.objects.all()[:2]
|
||||||
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
||||||
@ -2474,10 +2594,18 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
)
|
)
|
||||||
Site.objects.bulk_create(sites)
|
Site.objects.bulk_create(sites)
|
||||||
|
|
||||||
|
locations = (
|
||||||
|
Location(name='Location 1', slug='location-1', site=sites[0]),
|
||||||
|
Location(name='Location 2', slug='location-2', site=sites[1]),
|
||||||
|
Location(name='Location 3', slug='location-3', site=sites[2]),
|
||||||
|
)
|
||||||
|
for location in locations:
|
||||||
|
location.save()
|
||||||
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
|
Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]),
|
||||||
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
|
Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]),
|
||||||
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
|
Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]),
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
|
|
||||||
@ -2541,13 +2669,19 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests):
|
|||||||
params = {'site': [sites[0].slug, sites[1].slug]}
|
params = {'site': [sites[0].slug, sites[1].slug]}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
|
|
||||||
|
def test_location(self):
|
||||||
|
locations = Location.objects.all()[:2]
|
||||||
|
params = {'location_id': [locations[0].pk, locations[1].pk]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
|
params = {'location': [locations[0].slug, locations[1].slug]}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
|
|
||||||
def test_device(self):
|
def test_device(self):
|
||||||
# TODO: Allow multiple values
|
devices = Device.objects.all()[:2]
|
||||||
device = Device.objects.first()
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
||||||
params = {'device_id': device.pk}
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
params = {'device': [devices[0].name, devices[1].name]}
|
||||||
params = {'device': device.name}
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
||||||
|
|
||||||
def test_parent_id(self):
|
def test_parent_id(self):
|
||||||
parent_items = InventoryItem.objects.filter(parent__isnull=True)[:2]
|
parent_items = InventoryItem.objects.filter(parent__isnull=True)[:2]
|
||||||
|
@ -88,12 +88,14 @@ class CustomFieldFilterForm(BootstrapMixin, forms.Form):
|
|||||||
)
|
)
|
||||||
content_types = ContentTypeMultipleChoiceField(
|
content_types = ContentTypeMultipleChoiceField(
|
||||||
queryset=ContentType.objects.all(),
|
queryset=ContentType.objects.all(),
|
||||||
limit_choices_to=FeatureQuery('custom_fields')
|
limit_choices_to=FeatureQuery('custom_fields'),
|
||||||
|
required=False
|
||||||
)
|
)
|
||||||
type = forms.MultipleChoiceField(
|
type = forms.MultipleChoiceField(
|
||||||
choices=CustomFieldTypeChoices,
|
choices=CustomFieldTypeChoices,
|
||||||
required=False,
|
required=False,
|
||||||
widget=StaticSelectMultiple()
|
widget=StaticSelectMultiple(),
|
||||||
|
label=_('Field type')
|
||||||
)
|
)
|
||||||
weight = forms.IntegerField(
|
weight = forms.IntegerField(
|
||||||
required=False
|
required=False
|
||||||
@ -174,8 +176,7 @@ class CustomLinkBulkEditForm(BootstrapMixin, BulkEditForm):
|
|||||||
class CustomLinkFilterForm(BootstrapMixin, forms.Form):
|
class CustomLinkFilterForm(BootstrapMixin, forms.Form):
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q'],
|
||||||
['content_type'],
|
['content_type', 'weight', 'new_window'],
|
||||||
['weight', 'new_window'],
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -184,7 +185,8 @@ class CustomLinkFilterForm(BootstrapMixin, forms.Form):
|
|||||||
)
|
)
|
||||||
content_type = ContentTypeChoiceField(
|
content_type = ContentTypeChoiceField(
|
||||||
queryset=ContentType.objects.all(),
|
queryset=ContentType.objects.all(),
|
||||||
limit_choices_to=FeatureQuery('custom_fields')
|
limit_choices_to=FeatureQuery('custom_fields'),
|
||||||
|
required=False
|
||||||
)
|
)
|
||||||
weight = forms.IntegerField(
|
weight = forms.IntegerField(
|
||||||
required=False
|
required=False
|
||||||
@ -265,8 +267,7 @@ class ExportTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
|
|||||||
class ExportTemplateFilterForm(BootstrapMixin, forms.Form):
|
class ExportTemplateFilterForm(BootstrapMixin, forms.Form):
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q'],
|
||||||
['content_type', 'mime_type'],
|
['content_type', 'mime_type', 'file_extension', 'as_attachment'],
|
||||||
['file_extension', 'as_attachment'],
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -275,10 +276,12 @@ class ExportTemplateFilterForm(BootstrapMixin, forms.Form):
|
|||||||
)
|
)
|
||||||
content_type = ContentTypeChoiceField(
|
content_type = ContentTypeChoiceField(
|
||||||
queryset=ContentType.objects.all(),
|
queryset=ContentType.objects.all(),
|
||||||
limit_choices_to=FeatureQuery('custom_fields')
|
limit_choices_to=FeatureQuery('custom_fields'),
|
||||||
|
required=False
|
||||||
)
|
)
|
||||||
mime_type = forms.CharField(
|
mime_type = forms.CharField(
|
||||||
required=False
|
required=False,
|
||||||
|
label=_('MIME type')
|
||||||
)
|
)
|
||||||
file_extension = forms.CharField(
|
file_extension = forms.CharField(
|
||||||
required=False
|
required=False
|
||||||
@ -377,8 +380,8 @@ class WebhookBulkEditForm(BootstrapMixin, BulkEditForm):
|
|||||||
class WebhookFilterForm(BootstrapMixin, forms.Form):
|
class WebhookFilterForm(BootstrapMixin, forms.Form):
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q'],
|
||||||
['content_types', 'http_method'],
|
['content_types', 'http_method', 'enabled'],
|
||||||
['enabled', 'type_create', 'type_update', 'type_delete'],
|
['type_create', 'type_update', 'type_delete'],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -387,12 +390,14 @@ class WebhookFilterForm(BootstrapMixin, forms.Form):
|
|||||||
)
|
)
|
||||||
content_types = ContentTypeMultipleChoiceField(
|
content_types = ContentTypeMultipleChoiceField(
|
||||||
queryset=ContentType.objects.all(),
|
queryset=ContentType.objects.all(),
|
||||||
limit_choices_to=FeatureQuery('custom_fields')
|
limit_choices_to=FeatureQuery('custom_fields'),
|
||||||
|
required=False
|
||||||
)
|
)
|
||||||
http_method = forms.MultipleChoiceField(
|
http_method = forms.MultipleChoiceField(
|
||||||
choices=WebhookHttpMethodChoices,
|
choices=WebhookHttpMethodChoices,
|
||||||
required=False,
|
required=False,
|
||||||
widget=StaticSelectMultiple()
|
widget=StaticSelectMultiple(),
|
||||||
|
label=_('HTTP method')
|
||||||
)
|
)
|
||||||
enabled = forms.NullBooleanField(
|
enabled = forms.NullBooleanField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -693,16 +698,12 @@ class ConfigContextBulkEditForm(BootstrapMixin, BulkEditForm):
|
|||||||
|
|
||||||
|
|
||||||
class ConfigContextFilterForm(BootstrapMixin, forms.Form):
|
class ConfigContextFilterForm(BootstrapMixin, forms.Form):
|
||||||
field_order = [
|
|
||||||
'q', 'region_id', 'site_group_id', 'site_id', 'role_id', 'platform_id', 'cluster_group_id',
|
|
||||||
'cluster_id', 'tenant_group_id', 'tenant_id',
|
|
||||||
]
|
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id'],
|
||||||
['device_type_id', 'role_id', 'platform_id'],
|
['device_type_id', 'platform_id', 'role_id'],
|
||||||
['cluster_group_id', 'cluster_id'],
|
['cluster_group_id', 'cluster_id'],
|
||||||
['tenant_group_id', 'tenant_id', 'tag']
|
['tenant_group_id', 'tenant_id']
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
|
@ -107,12 +107,10 @@ class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEdi
|
|||||||
|
|
||||||
class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
||||||
model = VRF
|
model = VRF
|
||||||
field_order = ['q', 'import_target_id', 'export_target_id', 'tenant_group_id', 'tenant_id']
|
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['import_target_id', 'export_target_id'],
|
['import_target_id', 'export_target_id'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -186,9 +184,8 @@ class RouteTargetBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMode
|
|||||||
|
|
||||||
class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
||||||
model = RouteTarget
|
model = RouteTarget
|
||||||
field_order = ['q', 'name', 'tenant_group_id', 'tenant_id', 'importing_vrfs', 'exporting_vrfs']
|
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['importing_vrf_id', 'exporting_vrf_id'],
|
['importing_vrf_id', 'exporting_vrf_id'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
]
|
]
|
||||||
@ -348,9 +345,8 @@ class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
|
|||||||
|
|
||||||
class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
||||||
model = Aggregate
|
model = Aggregate
|
||||||
field_order = ['q', 'family', 'rir', 'tenant_group_id', 'tenant_id']
|
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['family', 'rir_id'],
|
['family', 'rir_id'],
|
||||||
['tenant_group_id', 'tenant_id']
|
['tenant_group_id', 'tenant_id']
|
||||||
]
|
]
|
||||||
@ -628,17 +624,13 @@ class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulk
|
|||||||
|
|
||||||
class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
||||||
model = Prefix
|
model = Prefix
|
||||||
field_order = [
|
|
||||||
'q', 'within_include', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status',
|
|
||||||
'region_id', 'site_group_id', 'site_id', 'role_id', 'tenant_group_id', 'tenant_id',
|
|
||||||
'is_pool', 'mark_utilized',
|
|
||||||
]
|
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['role_id', 'within_include', 'family', 'mask_length'],
|
['within_include', 'family', 'status', 'role_id'],
|
||||||
['vrf_id', 'present_in_vrf_id', 'is_pool', 'mark_utilized'],
|
['vrf_id', 'present_in_vrf_id'],
|
||||||
|
['mask_length', 'is_pool', 'mark_utilized'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id'],
|
||||||
['tenant_group_id', 'tenant_id', 'status', 'tag']
|
['tenant_group_id', 'tenant_id']
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -838,13 +830,10 @@ class IPRangeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBul
|
|||||||
|
|
||||||
class IPRangeFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
class IPRangeFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
||||||
model = IPRange
|
model = IPRange
|
||||||
field_order = [
|
|
||||||
'q', 'family', 'vrf_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id',
|
|
||||||
]
|
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['family', 'vrf_id', 'status', 'role_id'],
|
['family', 'vrf_id', 'status', 'role_id'],
|
||||||
['tenant_group_id', 'tenant_id', 'tag'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -1280,10 +1269,10 @@ class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFil
|
|||||||
'assigned_to_interface', 'tenant_group_id', 'tenant_id',
|
'assigned_to_interface', 'tenant_group_id', 'tenant_id',
|
||||||
]
|
]
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['parent', 'family', 'mask_length'],
|
['parent', 'family', 'status', 'role'],
|
||||||
['status', 'vrf_id', 'present_in_vrf_id'],
|
['vrf_id', 'present_in_vrf_id'],
|
||||||
['role', 'assigned_to_interface'],
|
['mask_length', 'assigned_to_interface'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
@ -1489,8 +1478,7 @@ class VLANGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm):
|
|||||||
class VLANGroupFilterForm(BootstrapMixin, forms.Form):
|
class VLANGroupFilterForm(BootstrapMixin, forms.Form):
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q'],
|
||||||
['region', 'sitegroup', 'site'],
|
['region', 'sitegroup', 'site', 'location', 'rack']
|
||||||
['location', 'rack']
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -1707,14 +1695,10 @@ class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEd
|
|||||||
|
|
||||||
class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
||||||
model = VLAN
|
model = VLAN
|
||||||
field_order = [
|
|
||||||
'q', 'region_id', 'site_group_id', 'site_id', 'group_id', 'status', 'role_id',
|
|
||||||
'tenant_group_id', 'tenant_id',
|
|
||||||
]
|
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['region_id', 'site_group_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id'],
|
||||||
['group_id', 'role_id', 'status'],
|
['group_id', 'status', 'role_id'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
@ -1818,6 +1802,10 @@ class ServiceForm(BootstrapMixin, CustomFieldModelForm):
|
|||||||
|
|
||||||
class ServiceFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
class ServiceFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||||
model = Service
|
model = Service
|
||||||
|
field_groups = (
|
||||||
|
('q', 'tag'),
|
||||||
|
('protocol', 'port'),
|
||||||
|
)
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
||||||
|
@ -4,42 +4,52 @@
|
|||||||
<form action="." method="get">
|
<form action="." method="get">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body overflow-visible d-flex flex-wrap justify-content-between py-3">
|
<div class="card-body overflow-visible d-flex flex-wrap justify-content-between py-3">
|
||||||
{% for field in filter_form.hidden_fields %}
|
{% for field in filter_form.hidden_fields %}
|
||||||
{{ field }}
|
{{ field }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if filter_form.field_groups %}
|
{% if filter_form.field_groups %}
|
||||||
{% for group in filter_form.field_groups %}
|
{# List filters by group #}
|
||||||
<div class="col col-12">
|
{% for group in filter_form.field_groups %}
|
||||||
{% for name in group %}
|
<div class="col col-12">
|
||||||
{% with field=filter_form|get_item:name %}
|
{% for name in group %}
|
||||||
{% render_field field %}
|
{% with field=filter_form|get_item:name %}
|
||||||
{% endwith %}
|
{% render_field field %}
|
||||||
{% endfor %}
|
{% endwith %}
|
||||||
</div>
|
{% endfor %}
|
||||||
<hr class="card-divider mt-0" />
|
</div>
|
||||||
{% endfor %}
|
{% if not forloop.last %}
|
||||||
{% for name in filter_form.custom_field_filters %}
|
<hr class="card-divider mt-0" />
|
||||||
<div class="col col-12">
|
|
||||||
{% with field=filter_form|get_item:name %}
|
|
||||||
{% render_field field %}
|
|
||||||
{% endwith %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
{% else %}
|
|
||||||
{% for field in filter_form.visible_fields %}
|
|
||||||
<div class="col col-12">
|
|
||||||
{% render_field field %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{# List all non-customfield filters as declared in the form class #}
|
||||||
|
{% for field in filter_form.visible_fields %}
|
||||||
|
{% if not filter_form.custom_field_filters or field.name not in filter_form.custom_field_filters %}
|
||||||
|
<div class="col col-12">
|
||||||
|
{% render_field field %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% if filter_form.custom_field_filters %}
|
||||||
|
{# List all custom field filters #}
|
||||||
|
<hr class="card-divider mt-0" />
|
||||||
|
{% for name in filter_form.custom_field_filters %}
|
||||||
|
<div class="col col-12">
|
||||||
|
{% with field=filter_form|get_item:name %}
|
||||||
|
{% render_field field %}
|
||||||
|
{% endwith %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="card-footer text-end noprint border-0">
|
<div class="card-footer text-end noprint border-0">
|
||||||
<button type="button" class="btn btn-sm btn-outline-danger m-1" data-reset-select>
|
<button type="button" class="btn btn-sm btn-outline-danger m-1" data-reset-select>
|
||||||
<i class="mdi mdi-backspace"></i> Reset
|
<i class="mdi mdi-backspace"></i> Reset
|
||||||
</button>
|
</button>
|
||||||
<button type="submit" class="btn btn-sm btn-primary m-1">
|
<button type="submit" class="btn btn-sm btn-primary m-1">
|
||||||
<i class="mdi mdi-filter-variant"></i> Filter
|
<i class="mdi mdi-filter-variant"></i> Filter
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -135,6 +135,10 @@ class TenantBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulk
|
|||||||
|
|
||||||
class TenantFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
class TenantFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||||
model = Tenant
|
model = Tenant
|
||||||
|
field_groups = (
|
||||||
|
('q', 'tag'),
|
||||||
|
('group_id',),
|
||||||
|
)
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
|
||||||
|
@ -228,11 +228,10 @@ class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilte
|
|||||||
'q', 'type_id', 'region_id', 'site_id', 'group_id', 'tenant_group_id', 'tenant_id',
|
'q', 'type_id', 'region_id', 'site_id', 'group_id', 'tenant_group_id', 'tenant_id',
|
||||||
]
|
]
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['type_id'],
|
['group_id', 'type_id'],
|
||||||
['region_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
['tag'],
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -251,12 +250,19 @@ class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilte
|
|||||||
label=_('Region'),
|
label=_('Region'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
)
|
)
|
||||||
|
site_group_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=SiteGroup.objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('Site group'),
|
||||||
|
fetch_trigger='open'
|
||||||
|
)
|
||||||
site_id = DynamicModelMultipleChoiceField(
|
site_id = DynamicModelMultipleChoiceField(
|
||||||
queryset=Site.objects.all(),
|
queryset=Site.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
null_option='None',
|
null_option='None',
|
||||||
query_params={
|
query_params={
|
||||||
'region_id': '$region_id'
|
'region_id': '$region_id',
|
||||||
|
'site_group_id': '$site_group_id',
|
||||||
},
|
},
|
||||||
label=_('Site'),
|
label=_('Site'),
|
||||||
fetch_trigger='open'
|
fetch_trigger='open'
|
||||||
@ -541,18 +547,12 @@ class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldM
|
|||||||
|
|
||||||
class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
|
||||||
model = VirtualMachine
|
model = VirtualMachine
|
||||||
field_order = [
|
|
||||||
'q', 'cluster_group_id', 'cluster_type_id', 'cluster_id', 'status', 'role_id', 'region_id', 'site_group_id',
|
|
||||||
'site_id', 'tenant_group_id', 'tenant_id', 'platform_id', 'mac_address',
|
|
||||||
]
|
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['status', 'role_id'],
|
|
||||||
['platform_id', 'mac_address'],
|
|
||||||
['cluster_group_id', 'cluster_type_id', 'cluster_id'],
|
['cluster_group_id', 'cluster_type_id', 'cluster_id'],
|
||||||
['region_id', 'site_id'],
|
['region_id', 'site_group_id', 'site_id'],
|
||||||
|
['status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip'],
|
||||||
['tenant_group_id', 'tenant_id'],
|
['tenant_group_id', 'tenant_id'],
|
||||||
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
@ -878,10 +878,9 @@ class VMInterfaceBulkRenameForm(BulkRenameForm):
|
|||||||
class VMInterfaceFilterForm(BootstrapMixin, forms.Form):
|
class VMInterfaceFilterForm(BootstrapMixin, forms.Form):
|
||||||
model = VMInterface
|
model = VMInterface
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'tag'],
|
||||||
['cluster_id', 'virtual_machine_id'],
|
['cluster_id', 'virtual_machine_id'],
|
||||||
['enabled', 'mac_address'],
|
['enabled', 'mac_address'],
|
||||||
['tag']
|
|
||||||
]
|
]
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
required=False,
|
required=False,
|
||||||
|
Loading…
Reference in New Issue
Block a user