Compare commits

..

2 Commits

Author SHA1 Message Date
Jeremy Stretch
4bf1649f6c Fix filtering logic for VM filterset 2026-02-12 08:18:17 -05:00
Jeremy Stretch
6bfe1e7b89 Fixes #21196: q filter should match on primary IP only for IP address values 2026-02-11 16:15:56 -05:00
19 changed files with 157 additions and 613 deletions

View File

@@ -200,48 +200,6 @@ REDIS = {
!!! note
It is permissible to use Sentinel for only one database and not the other.
### SSL Configuration
If you need to configure SSL/TLS for Redis beyond the basic `SSL`, `CA_CERT_PATH`, and `INSECURE_SKIP_TLS_VERIFY` options (for example, client certificates, a specific TLS version, or custom ciphers), you can pass additional parameters via the `KWARGS` key in either the `tasks` or `caching` subsection.
NetBox already maps `CA_CERT_PATH` to `ssl_ca_certs` and (for caching) `INSECURE_SKIP_TLS_VERIFY` to `ssl_cert_reqs`; only add `KWARGS` when you need to override or extend those settings (for example, to supply client certificates or restrict TLS version or ciphers).
* `KWARGS` - Optional dictionary of additional SSL/TLS (or other) parameters passed to the Redis client. These are passed directly to the underlying Redis client: for `tasks` to [redis-py](https://redis-py.readthedocs.io/en/stable/connections.html), and for `caching` to the [django-redis](https://github.com/jazzband/django-redis#configure-as-cache-backend) connection pool.
Example:
```python
REDIS = {
'tasks': {
'HOST': 'redis.example.com',
'PORT': 1234,
'SSL': True,
'CA_CERT_PATH': '/etc/ssl/certs/ca.crt',
'KWARGS': {
'ssl_certfile': '/path/to/client-cert.pem',
'ssl_keyfile': '/path/to/client-key.pem',
'ssl_min_version': ssl.TLSVersion.TLSv1_2,
'ssl_ciphers': 'HIGH:!aNULL',
},
},
'caching': {
'HOST': 'redis.example.com',
'PORT': 1234,
'SSL': True,
'CA_CERT_PATH': '/etc/ssl/certs/ca.crt',
'KWARGS': {
'ssl_certfile': '/path/to/client-cert.pem',
'ssl_keyfile': '/path/to/client-key.pem',
'ssl_min_version': ssl.TLSVersion.TLSv1_2,
'ssl_ciphers': 'HIGH:!aNULL',
},
}
}
```
!!! note
If you use `ssl.TLSVersion` in your configuration (e.g. `ssl_min_version`), add `import ssl` at the top of your configuration file.
---
## SECRET_KEY

View File

@@ -99,13 +99,11 @@ class ProviderFilterSet(PrimaryModelFilterSet, ContactModelFilterSet):
class ProviderAccountFilterSet(PrimaryModelFilterSet, ContactModelFilterSet):
provider_id = django_filters.ModelMultipleChoiceFilter(
queryset=Provider.objects.all(),
distinct=False,
label=_('Provider (ID)'),
)
provider = django_filters.ModelMultipleChoiceFilter(
field_name='provider__slug',
queryset=Provider.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Provider (slug)'),
)
@@ -129,13 +127,11 @@ class ProviderAccountFilterSet(PrimaryModelFilterSet, ContactModelFilterSet):
class ProviderNetworkFilterSet(PrimaryModelFilterSet):
provider_id = django_filters.ModelMultipleChoiceFilter(
queryset=Provider.objects.all(),
distinct=False,
label=_('Provider (ID)'),
)
provider = django_filters.ModelMultipleChoiceFilter(
field_name='provider__slug',
queryset=Provider.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Provider (slug)'),
)
@@ -167,26 +163,22 @@ class CircuitTypeFilterSet(OrganizationalModelFilterSet):
class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
provider_id = django_filters.ModelMultipleChoiceFilter(
queryset=Provider.objects.all(),
distinct=False,
label=_('Provider (ID)'),
)
provider = django_filters.ModelMultipleChoiceFilter(
field_name='provider__slug',
queryset=Provider.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Provider (slug)'),
)
provider_account_id = django_filters.ModelMultipleChoiceFilter(
field_name='provider_account',
queryset=ProviderAccount.objects.all(),
distinct=False,
label=_('Provider account (ID)'),
)
provider_account = django_filters.ModelMultipleChoiceFilter(
field_name='provider_account__account',
queryset=Provider.objects.all(),
distinct=False,
to_field_name='account',
label=_('Provider account (account)'),
)
@@ -197,19 +189,16 @@ class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilt
)
type_id = django_filters.ModelMultipleChoiceFilter(
queryset=CircuitType.objects.all(),
distinct=False,
label=_('Circuit type (ID)'),
)
type = django_filters.ModelMultipleChoiceFilter(
field_name='type__slug',
queryset=CircuitType.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Circuit type (slug)'),
)
status = django_filters.MultipleChoiceFilter(
choices=CircuitStatusChoices,
distinct=False,
null_value=None
)
region_id = TreeNodeMultipleChoiceFilter(
@@ -256,12 +245,10 @@ class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilt
)
termination_a_id = django_filters.ModelMultipleChoiceFilter(
queryset=CircuitTermination.objects.all(),
distinct=False,
label=_('Termination A (ID)'),
)
termination_z_id = django_filters.ModelMultipleChoiceFilter(
queryset=CircuitTermination.objects.all(),
distinct=False,
label=_('Termination A (ID)'),
)
@@ -292,7 +279,6 @@ class CircuitTerminationFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet):
)
circuit_id = django_filters.ModelMultipleChoiceFilter(
queryset=Circuit.objects.all(),
distinct=False,
label=_('Circuit'),
)
termination_type = ContentTypeFilter()
@@ -324,14 +310,12 @@ class CircuitTerminationFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet):
)
site_id = django_filters.ModelMultipleChoiceFilter(
queryset=Site.objects.all(),
distinct=False,
field_name='_site',
label=_('Site (ID)'),
)
site = django_filters.ModelMultipleChoiceFilter(
field_name='_site__slug',
queryset=Site.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Site (slug)'),
)
@@ -350,20 +334,17 @@ class CircuitTerminationFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet):
)
provider_network_id = django_filters.ModelMultipleChoiceFilter(
queryset=ProviderNetwork.objects.all(),
distinct=False,
field_name='_provider_network',
label=_('ProviderNetwork (ID)'),
)
provider_id = django_filters.ModelMultipleChoiceFilter(
field_name='circuit__provider_id',
queryset=Provider.objects.all(),
distinct=False,
label=_('Provider (ID)'),
)
provider = django_filters.ModelMultipleChoiceFilter(
field_name='circuit__provider__slug',
queryset=Provider.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Provider (slug)'),
)
@@ -433,13 +414,11 @@ class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet):
)
group_id = django_filters.ModelMultipleChoiceFilter(
queryset=CircuitGroup.objects.all(),
distinct=False,
label=_('Circuit group (ID)'),
)
group = django_filters.ModelMultipleChoiceFilter(
field_name='group__slug',
queryset=CircuitGroup.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Circuit group (slug)'),
)
@@ -509,49 +488,41 @@ class VirtualCircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
provider_id = django_filters.ModelMultipleChoiceFilter(
field_name='provider_network__provider',
queryset=Provider.objects.all(),
distinct=False,
label=_('Provider (ID)'),
)
provider = django_filters.ModelMultipleChoiceFilter(
field_name='provider_network__provider__slug',
queryset=Provider.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Provider (slug)'),
)
provider_account_id = django_filters.ModelMultipleChoiceFilter(
field_name='provider_account',
queryset=ProviderAccount.objects.all(),
distinct=False,
label=_('Provider account (ID)'),
)
provider_account = django_filters.ModelMultipleChoiceFilter(
field_name='provider_account__account',
queryset=Provider.objects.all(),
distinct=False,
to_field_name='account',
label=_('Provider account (account)'),
)
provider_network_id = django_filters.ModelMultipleChoiceFilter(
queryset=ProviderNetwork.objects.all(),
distinct=False,
label=_('Provider network (ID)'),
)
type_id = django_filters.ModelMultipleChoiceFilter(
queryset=VirtualCircuitType.objects.all(),
distinct=False,
label=_('Virtual circuit type (ID)'),
)
type = django_filters.ModelMultipleChoiceFilter(
field_name='type__slug',
queryset=VirtualCircuitType.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Virtual circuit type (slug)'),
)
status = django_filters.MultipleChoiceFilter(
choices=CircuitStatusChoices,
distinct=False,
null_value=None
)
@@ -577,49 +548,41 @@ class VirtualCircuitTerminationFilterSet(NetBoxModelFilterSet):
)
virtual_circuit_id = django_filters.ModelMultipleChoiceFilter(
queryset=VirtualCircuit.objects.all(),
distinct=False,
label=_('Virtual circuit'),
)
role = django_filters.MultipleChoiceFilter(
choices=VirtualCircuitTerminationRoleChoices,
distinct=False,
null_value=None
)
provider_id = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_circuit__provider_network__provider',
queryset=Provider.objects.all(),
distinct=False,
label=_('Provider (ID)'),
)
provider = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_circuit__provider_network__provider__slug',
queryset=Provider.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Provider (slug)'),
)
provider_account_id = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_circuit__provider_account',
queryset=ProviderAccount.objects.all(),
distinct=False,
label=_('Provider account (ID)'),
)
provider_account = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_circuit__provider_account__account',
queryset=ProviderAccount.objects.all(),
distinct=False,
to_field_name='account',
label=_('Provider account (account)'),
)
provider_network_id = django_filters.ModelMultipleChoiceFilter(
queryset=ProviderNetwork.objects.all(),
distinct=False,
field_name='virtual_circuit__provider_network',
label=_('Provider network (ID)'),
)
interface_id = django_filters.ModelMultipleChoiceFilter(
queryset=Interface.objects.all(),
distinct=False,
field_name='interface',
label=_('Interface (ID)'),
)

View File

@@ -25,17 +25,14 @@ __all__ = (
class DataSourceFilterSet(PrimaryModelFilterSet):
type = django_filters.MultipleChoiceFilter(
choices=get_data_backend_choices,
distinct=False,
null_value=None
)
status = django_filters.MultipleChoiceFilter(
choices=DataSourceStatusChoices,
distinct=False,
null_value=None
)
sync_interval = django_filters.MultipleChoiceFilter(
choices=JobIntervalChoices,
distinct=False,
null_value=None
)
@@ -60,13 +57,11 @@ class DataFileFilterSet(ChangeLoggedModelFilterSet):
)
source_id = django_filters.ModelMultipleChoiceFilter(
queryset=DataSource.objects.all(),
distinct=False,
label=_('Data source (ID)'),
)
source = django_filters.ModelMultipleChoiceFilter(
field_name='source__name',
queryset=DataSource.objects.all(),
distinct=False,
to_field_name='name',
label=_('Data source (name)'),
)
@@ -91,7 +86,6 @@ class JobFilterSet(BaseFilterSet):
)
object_type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ObjectType.objects.with_feature('jobs'),
distinct=False,
field_name='object_type_id',
)
object_type = ContentTypeFilter()
@@ -133,7 +127,6 @@ class JobFilterSet(BaseFilterSet):
)
status = django_filters.MultipleChoiceFilter(
choices=JobStatusChoices,
distinct=False,
null_value=None
)
queue_name = django_filters.CharFilter()
@@ -189,19 +182,16 @@ class ObjectChangeFilterSet(BaseFilterSet):
time = django_filters.DateTimeFromToRangeFilter()
changed_object_type = ContentTypeFilter()
changed_object_type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ContentType.objects.all(),
distinct=False,
queryset=ContentType.objects.all()
)
related_object_type = ContentTypeFilter()
user_id = django_filters.ModelMultipleChoiceFilter(
queryset=User.objects.all(),
distinct=False,
label=_('User (ID)'),
)
user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username',
queryset=User.objects.all(),
distinct=False,
to_field_name='username',
label=_('User name'),
)

View File

@@ -43,14 +43,12 @@ class ScopedFilterSet(BaseFilterSet):
)
site_id = django_filters.ModelMultipleChoiceFilter(
queryset=Site.objects.all(),
distinct=False,
field_name='_site',
label=_('Site (ID)'),
)
site = django_filters.ModelMultipleChoiceFilter(
field_name='_site__slug',
queryset=Site.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Site (slug)'),
)

File diff suppressed because it is too large Load Diff

View File

@@ -49,7 +49,6 @@ class ScriptFilterSet(BaseFilterSet):
)
module_id = django_filters.ModelMultipleChoiceFilter(
queryset=ScriptModule.objects.all(),
distinct=False,
label=_('Script module (ID)'),
)
@@ -72,8 +71,7 @@ class WebhookFilterSet(OwnerFilterMixin, NetBoxModelFilterSet):
label=_('Search'),
)
http_method = django_filters.MultipleChoiceFilter(
choices=WebhookHttpMethodChoices,
distinct=False,
choices=WebhookHttpMethodChoices
)
payload_url = MultiValueCharFilter(
lookup_expr='icontains'
@@ -113,8 +111,7 @@ class EventRuleFilterSet(OwnerFilterMixin, NetBoxModelFilterSet):
method='filter_event_type'
)
action_type = django_filters.MultipleChoiceFilter(
choices=EventRuleActionChoices,
distinct=False,
choices=EventRuleActionChoices
)
action_object_type = ContentTypeFilter()
action_object_id = MultiValueNumberFilter()
@@ -145,8 +142,7 @@ class CustomFieldFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
label=_('Search'),
)
type = django_filters.MultipleChoiceFilter(
choices=CustomFieldTypeChoices,
distinct=False,
choices=CustomFieldTypeChoices
)
object_type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ObjectType.objects.all(),
@@ -157,18 +153,15 @@ class CustomFieldFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
)
related_object_type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ObjectType.objects.all(),
distinct=False,
field_name='related_object_type'
)
related_object_type = ContentTypeFilter()
choice_set_id = django_filters.ModelMultipleChoiceFilter(
queryset=CustomFieldChoiceSet.objects.all(),
distinct=False,
queryset=CustomFieldChoiceSet.objects.all()
)
choice_set = django_filters.ModelMultipleChoiceFilter(
field_name='choice_set__name',
queryset=CustomFieldChoiceSet.objects.all(),
distinct=False,
to_field_name='name'
)
@@ -267,12 +260,10 @@ class ExportTemplateFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
)
data_source_id = django_filters.ModelMultipleChoiceFilter(
queryset=DataSource.objects.all(),
distinct=False,
label=_('Data source (ID)'),
)
data_file_id = django_filters.ModelMultipleChoiceFilter(
queryset=DataSource.objects.all(),
distinct=False,
label=_('Data file (ID)'),
)
@@ -308,13 +299,11 @@ class SavedFilterFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
)
user_id = django_filters.ModelMultipleChoiceFilter(
queryset=User.objects.all(),
distinct=False,
label=_('User (ID)'),
)
user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username',
queryset=User.objects.all(),
distinct=False,
to_field_name='username',
label=_('User (name)'),
)
@@ -356,7 +345,6 @@ class TableConfigFilterSet(ChangeLoggedModelFilterSet):
)
object_type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ObjectType.objects.all(),
distinct=False,
field_name='object_type'
)
object_type = ContentTypeFilter(
@@ -364,13 +352,11 @@ class TableConfigFilterSet(ChangeLoggedModelFilterSet):
)
user_id = django_filters.ModelMultipleChoiceFilter(
queryset=User.objects.all(),
distinct=False,
label=_('User (ID)'),
)
user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username',
queryset=User.objects.all(),
distinct=False,
to_field_name='username',
label=_('User (name)'),
)
@@ -412,13 +398,11 @@ class BookmarkFilterSet(BaseFilterSet):
object_type = ContentTypeFilter()
user_id = django_filters.ModelMultipleChoiceFilter(
queryset=User.objects.all(),
distinct=False,
label=_('User (ID)'),
)
user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username',
queryset=User.objects.all(),
distinct=False,
to_field_name='username',
label=_('User (name)'),
)
@@ -499,24 +483,20 @@ class JournalEntryFilterSet(NetBoxModelFilterSet):
created = django_filters.DateTimeFromToRangeFilter()
assigned_object_type = ContentTypeFilter()
assigned_object_type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ContentType.objects.all(),
distinct=False,
queryset=ContentType.objects.all()
)
created_by_id = django_filters.ModelMultipleChoiceFilter(
queryset=User.objects.all(),
distinct=False,
label=_('User (ID)'),
)
created_by = django_filters.ModelMultipleChoiceFilter(
field_name='created_by__username',
queryset=User.objects.all(),
distinct=False,
to_field_name='username',
label=_('User (name)'),
)
kind = django_filters.MultipleChoiceFilter(
choices=JournalEntryKindChoices,
distinct=False,
choices=JournalEntryKindChoices
)
class Meta:
@@ -601,17 +581,14 @@ class TaggedItemFilterSet(BaseFilterSet):
)
object_type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ContentType.objects.all(),
distinct=False,
field_name='content_type_id'
)
tag_id = django_filters.ModelMultipleChoiceFilter(
queryset=Tag.objects.all(),
distinct=False,
queryset=Tag.objects.all()
)
tag = django_filters.ModelMultipleChoiceFilter(
field_name='tag__slug',
queryset=Tag.objects.all(),
distinct=False,
to_field_name='slug',
)
@@ -637,12 +614,10 @@ class ConfigContextProfileFilterSet(PrimaryModelFilterSet):
)
data_source_id = django_filters.ModelMultipleChoiceFilter(
queryset=DataSource.objects.all(),
distinct=False,
label=_('Data source (ID)'),
)
data_file_id = django_filters.ModelMultipleChoiceFilter(
queryset=DataSource.objects.all(),
distinct=False,
label=_('Data file (ID)'),
)
@@ -670,13 +645,11 @@ class ConfigContextFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
)
profile_id = django_filters.ModelMultipleChoiceFilter(
queryset=ConfigContextProfile.objects.all(),
distinct=False,
label=_('Profile (ID)'),
)
profile = django_filters.ModelMultipleChoiceFilter(
field_name='profile__name',
queryset=ConfigContextProfile.objects.all(),
distinct=False,
to_field_name='name',
label=_('Profile (name)'),
)
@@ -813,12 +786,10 @@ class ConfigContextFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
)
data_source_id = django_filters.ModelMultipleChoiceFilter(
queryset=DataSource.objects.all(),
distinct=False,
label=_('Data source (ID)'),
)
data_file_id = django_filters.ModelMultipleChoiceFilter(
queryset=DataSource.objects.all(),
distinct=False,
label=_('Data file (ID)'),
)
@@ -844,12 +815,10 @@ class ConfigTemplateFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
)
data_source_id = django_filters.ModelMultipleChoiceFilter(
queryset=DataSource.objects.all(),
distinct=False,
label=_('Data source (ID)'),
)
data_file_id = django_filters.ModelMultipleChoiceFilter(
queryset=DataSource.objects.all(),
distinct=False,
label=_('Data file (ID)'),
)
tag = TagFilter()

View File

@@ -166,13 +166,11 @@ class AggregateFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFi
)
rir_id = django_filters.ModelMultipleChoiceFilter(
queryset=RIR.objects.all(),
distinct=False,
label=_('RIR (ID)'),
)
rir = django_filters.ModelMultipleChoiceFilter(
field_name='rir__slug',
queryset=RIR.objects.all(),
distinct=False,
to_field_name='slug',
label=_('RIR (slug)'),
)
@@ -208,13 +206,11 @@ class AggregateFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFi
class ASNRangeFilterSet(OrganizationalModelFilterSet, TenancyFilterSet):
rir_id = django_filters.ModelMultipleChoiceFilter(
queryset=RIR.objects.all(),
distinct=False,
label=_('RIR (ID)'),
)
rir = django_filters.ModelMultipleChoiceFilter(
field_name='rir__slug',
queryset=RIR.objects.all(),
distinct=False,
to_field_name='slug',
label=_('RIR (slug)'),
)
@@ -236,13 +232,11 @@ class ASNRangeFilterSet(OrganizationalModelFilterSet, TenancyFilterSet):
class ASNFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
rir_id = django_filters.ModelMultipleChoiceFilter(
queryset=RIR.objects.all(),
distinct=False,
label=_('RIR (ID)'),
)
rir = django_filters.ModelMultipleChoiceFilter(
field_name='rir__slug',
queryset=RIR.objects.all(),
distinct=False,
to_field_name='slug',
label=_('RIR (slug)'),
)
@@ -348,13 +342,11 @@ class PrefixFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilterSet,
)
vrf_id = django_filters.ModelMultipleChoiceFilter(
queryset=VRF.objects.all(),
distinct=False,
label=_('VRF'),
)
vrf = django_filters.ModelMultipleChoiceFilter(
field_name='vrf__rd',
queryset=VRF.objects.all(),
distinct=False,
to_field_name='rd',
label=_('VRF (RD)'),
)
@@ -372,20 +364,17 @@ class PrefixFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilterSet,
vlan_group_id = django_filters.ModelMultipleChoiceFilter(
field_name='vlan__group',
queryset=VLANGroup.objects.all(),
distinct=False,
to_field_name='id',
label=_('VLAN Group (ID)'),
)
vlan_group = django_filters.ModelMultipleChoiceFilter(
field_name='vlan__group__slug',
queryset=VLANGroup.objects.all(),
distinct=False,
to_field_name='slug',
label=_('VLAN Group (slug)'),
)
vlan_id = django_filters.ModelMultipleChoiceFilter(
queryset=VLAN.objects.all(),
distinct=False,
label=_('VLAN (ID)'),
)
vlan_vid = django_filters.NumberFilter(
@@ -394,19 +383,16 @@ class PrefixFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilterSet,
)
role_id = django_filters.ModelMultipleChoiceFilter(
queryset=Role.objects.all(),
distinct=False,
label=_('Role (ID)'),
)
role = django_filters.ModelMultipleChoiceFilter(
field_name='role__slug',
queryset=Role.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Role (slug)'),
)
status = django_filters.MultipleChoiceFilter(
choices=PrefixStatusChoices,
distinct=False,
null_value=None
)
@@ -500,31 +486,26 @@ class IPRangeFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilt
)
vrf_id = django_filters.ModelMultipleChoiceFilter(
queryset=VRF.objects.all(),
distinct=False,
label=_('VRF'),
)
vrf = django_filters.ModelMultipleChoiceFilter(
field_name='vrf__rd',
queryset=VRF.objects.all(),
distinct=False,
to_field_name='rd',
label=_('VRF (RD)'),
)
role_id = django_filters.ModelMultipleChoiceFilter(
queryset=Role.objects.all(),
distinct=False,
label=_('Role (ID)'),
)
role = django_filters.ModelMultipleChoiceFilter(
field_name='role__slug',
queryset=Role.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Role (slug)'),
)
status = django_filters.MultipleChoiceFilter(
choices=IPRangeStatusChoices,
distinct=False,
null_value=None
)
parent = MultiValueCharFilter(
@@ -607,13 +588,11 @@ class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFi
)
vrf_id = django_filters.ModelMultipleChoiceFilter(
queryset=VRF.objects.all(),
distinct=False,
label=_('VRF'),
)
vrf = django_filters.ModelMultipleChoiceFilter(
field_name='vrf__rd',
queryset=VRF.objects.all(),
distinct=False,
to_field_name='rd',
label=_('VRF (RD)'),
)
@@ -686,12 +665,10 @@ class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFi
)
status = django_filters.MultipleChoiceFilter(
choices=IPAddressStatusChoices,
distinct=False,
null_value=None
)
role = django_filters.MultipleChoiceFilter(
choices=IPAddressRoleChoices,
distinct=False,
choices=IPAddressRoleChoices
)
service_id = django_filters.ModelMultipleChoiceFilter(
field_name='services',
@@ -701,7 +678,6 @@ class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFi
nat_inside_id = django_filters.ModelMultipleChoiceFilter(
field_name='nat_inside',
queryset=IPAddress.objects.all(),
distinct=False,
label=_('NAT inside IP address (ID)'),
)
@@ -823,12 +799,10 @@ class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFi
@register_filterset
class FHRPGroupFilterSet(PrimaryModelFilterSet):
protocol = django_filters.MultipleChoiceFilter(
choices=FHRPGroupProtocolChoices,
distinct=False,
choices=FHRPGroupProtocolChoices
)
auth_type = django_filters.MultipleChoiceFilter(
choices=FHRPGroupAuthTypeChoices,
distinct=False,
choices=FHRPGroupAuthTypeChoices
)
related_ip = django_filters.ModelMultipleChoiceFilter(
queryset=IPAddress.objects.all(),
@@ -875,7 +849,6 @@ class FHRPGroupAssignmentFilterSet(ChangeLoggedModelFilterSet):
interface_type = ContentTypeFilter()
group_id = django_filters.ModelMultipleChoiceFilter(
queryset=FHRPGroup.objects.all(),
distinct=False,
label=_('Group (ID)'),
)
device = MultiValueCharFilter(
@@ -1006,43 +979,36 @@ class VLANFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
)
site_id = django_filters.ModelMultipleChoiceFilter(
queryset=Site.objects.all(),
distinct=False,
label=_('Site (ID)'),
)
site = django_filters.ModelMultipleChoiceFilter(
field_name='site__slug',
queryset=Site.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Site (slug)'),
)
group_id = django_filters.ModelMultipleChoiceFilter(
queryset=VLANGroup.objects.all(),
distinct=False,
label=_('Group (ID)'),
)
group = django_filters.ModelMultipleChoiceFilter(
field_name='group__slug',
queryset=VLANGroup.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Group'),
)
role_id = django_filters.ModelMultipleChoiceFilter(
queryset=Role.objects.all(),
distinct=False,
label=_('Role (ID)'),
)
role = django_filters.ModelMultipleChoiceFilter(
field_name='role__slug',
queryset=Role.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Role (slug)'),
)
status = django_filters.MultipleChoiceFilter(
choices=VLANStatusChoices,
distinct=False,
null_value=None
)
available_at_site = django_filters.ModelChoiceFilter(
@@ -1058,12 +1024,10 @@ class VLANFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
method='get_for_virtualmachine'
)
qinq_role = django_filters.MultipleChoiceFilter(
choices=VLANQinQRoleChoices,
distinct=False,
choices=VLANQinQRoleChoices
)
qinq_svlan_id = django_filters.ModelMultipleChoiceFilter(
queryset=VLAN.objects.all(),
distinct=False,
label=_('Q-in-Q SVLAN (ID)'),
)
qinq_svlan_vid = MultiValueNumberFilter(
@@ -1158,13 +1122,11 @@ class VLANTranslationPolicyFilterSet(PrimaryModelFilterSet):
class VLANTranslationRuleFilterSet(NetBoxModelFilterSet):
policy_id = django_filters.ModelMultipleChoiceFilter(
queryset=VLANTranslationPolicy.objects.all(),
distinct=False,
label=_('VLAN Translation Policy (ID)'),
)
policy = django_filters.ModelMultipleChoiceFilter(
field_name='policy__name',
queryset=VLANTranslationPolicy.objects.all(),
distinct=False,
to_field_name='name',
label=_('VLAN Translation Policy (name)'),
)
@@ -1303,26 +1265,22 @@ class PrimaryIPFilterSet(django_filters.FilterSet):
primary_ip4_id = django_filters.ModelMultipleChoiceFilter(
field_name='primary_ip4',
queryset=IPAddress.objects.all(),
distinct=False,
label=_('Primary IPv4 (ID)'),
)
primary_ip4 = django_filters.ModelMultipleChoiceFilter(
field_name='primary_ip4__address',
queryset=IPAddress.objects.all(),
distinct=False,
to_field_name='address',
label=_('Primary IPv4 (address)'),
)
primary_ip6_id = django_filters.ModelMultipleChoiceFilter(
field_name='primary_ip6',
queryset=IPAddress.objects.all(),
distinct=False,
label=_('Primary IPv6 (ID)'),
)
primary_ip6 = django_filters.ModelMultipleChoiceFilter(
field_name='primary_ip6__address',
queryset=IPAddress.objects.all(),
distinct=False,
to_field_name='address',
label=_('Primary IPv6 (address)'),
)

View File

@@ -408,11 +408,6 @@ if CACHING_REDIS_CA_CERT_PATH:
CACHES['default']['OPTIONS'].setdefault('CONNECTION_POOL_KWARGS', {})
CACHES['default']['OPTIONS']['CONNECTION_POOL_KWARGS']['ssl_ca_certs'] = CACHING_REDIS_CA_CERT_PATH
# Merge in KWARGS for additional parameters
if caching_redis_kwargs := REDIS['caching'].get('KWARGS'):
CACHES['default']['OPTIONS'].setdefault('CONNECTION_POOL_KWARGS', {})
CACHES['default']['OPTIONS']['CONNECTION_POOL_KWARGS'].update(caching_redis_kwargs)
#
# Sessions
@@ -822,11 +817,6 @@ if TASKS_REDIS_CA_CERT_PATH:
RQ_PARAMS.setdefault('REDIS_CLIENT_KWARGS', {})
RQ_PARAMS['REDIS_CLIENT_KWARGS']['ssl_ca_certs'] = TASKS_REDIS_CA_CERT_PATH
# Merge in KWARGS for additional parameters
if tasks_redis_kwargs := TASKS_REDIS.get('KWARGS'):
RQ_PARAMS.setdefault('REDIS_CLIENT_KWARGS', {})
RQ_PARAMS['REDIS_CLIENT_KWARGS'].update(tasks_redis_kwargs)
# Define named RQ queues
RQ_QUEUES = {
RQ_QUEUE_HIGH: RQ_PARAMS,

File diff suppressed because one or more lines are too long

View File

@@ -5,16 +5,6 @@
font-variant-ligatures: none;
}
// TODO: Remove when Tabler releases fix for https://github.com/tabler/tabler/issues/2271
// and NetBox upgrades to that version. Fix merged to Tabler dev branch in PR #2548.
:root,
:host {
@include media-breakpoint-up(lg) {
margin-left: 0;
scrollbar-gutter: stable;
}
}
// Restore default foreground & background colors for <pre> blocks
pre {
background-color: transparent;

View File

@@ -29,13 +29,11 @@ __all__ = (
class ContactGroupFilterSet(NestedGroupModelFilterSet):
parent_id = django_filters.ModelMultipleChoiceFilter(
queryset=ContactGroup.objects.all(),
distinct=False,
label=_('Parent contact group (ID)'),
)
parent = django_filters.ModelMultipleChoiceFilter(
field_name='parent__slug',
queryset=ContactGroup.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Parent contact group (slug)'),
)
@@ -115,7 +113,6 @@ class ContactAssignmentFilterSet(NetBoxModelFilterSet):
object_type = ContentTypeFilter()
contact_id = django_filters.ModelMultipleChoiceFilter(
queryset=Contact.objects.all(),
distinct=False,
label=_('Contact (ID)'),
)
group_id = TreeNodeMultipleChoiceFilter(
@@ -133,13 +130,11 @@ class ContactAssignmentFilterSet(NetBoxModelFilterSet):
)
role_id = django_filters.ModelMultipleChoiceFilter(
queryset=ContactRole.objects.all(),
distinct=False,
label=_('Contact role (ID)'),
)
role = django_filters.ModelMultipleChoiceFilter(
field_name='role__slug',
queryset=ContactRole.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Contact role (slug)'),
)
@@ -184,13 +179,11 @@ class ContactModelFilterSet(django_filters.FilterSet):
class TenantGroupFilterSet(NestedGroupModelFilterSet):
parent_id = django_filters.ModelMultipleChoiceFilter(
queryset=TenantGroup.objects.all(),
distinct=False,
label=_('Parent tenant group (ID)'),
)
parent = django_filters.ModelMultipleChoiceFilter(
field_name='parent__slug',
queryset=TenantGroup.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Parent tenant group (slug)'),
)
@@ -263,12 +256,10 @@ class TenancyFilterSet(django_filters.FilterSet):
)
tenant_id = django_filters.ModelMultipleChoiceFilter(
queryset=Tenant.objects.all(),
distinct=False,
label=_('Tenant (ID)'),
)
tenant = django_filters.ModelMultipleChoiceFilter(
queryset=Tenant.objects.all(),
distinct=False,
field_name='tenant__slug',
to_field_name='slug',
label=_('Tenant (slug)'),

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-12 05:28+0000\n"
"POT-Creation-Date: 2026-02-11 05:29+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -85,7 +85,7 @@ msgid "Decommissioned"
msgstr ""
#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1998
#: netbox/dcim/tables/devices.py:1207 netbox/templates/dcim/interface.html:148
#: netbox/dcim/tables/devices.py:1194 netbox/templates/dcim/interface.html:148
#: netbox/templates/virtualization/vminterface.html:83
#: netbox/tenancy/choices.py:17
msgid "Primary"
@@ -467,7 +467,7 @@ msgstr ""
#: netbox/dcim/forms/filtersets.py:1543 netbox/dcim/forms/filtersets.py:1759
#: netbox/dcim/forms/filtersets.py:1778 netbox/dcim/forms/filtersets.py:1802
#: netbox/dcim/forms/filtersets.py:1821 netbox/dcim/tables/devices.py:785
#: netbox/dcim/tables/devices.py:838 netbox/dcim/tables/devices.py:1099
#: netbox/dcim/tables/devices.py:838 netbox/dcim/tables/devices.py:1086
#: netbox/dcim/tables/devicetypes.py:213 netbox/dcim/tables/devicetypes.py:254
#: netbox/dcim/tables/devicetypes.py:273 netbox/dcim/tables/racks.py:29
#: netbox/extras/forms/bulk_edit.py:306 netbox/extras/tables/tables.py:551
@@ -513,10 +513,10 @@ msgstr ""
#: netbox/dcim/forms/model_forms.py:810 netbox/dcim/forms/model_forms.py:816
#: netbox/dcim/forms/object_import.py:85 netbox/dcim/forms/object_import.py:114
#: netbox/dcim/forms/object_import.py:127 netbox/dcim/tables/devices.py:181
#: netbox/dcim/tables/power.py:73 netbox/dcim/tables/racks.py:126
#: netbox/extras/forms/bulk_import.py:43 netbox/extras/tables/tables.py:509
#: netbox/extras/tables/tables.py:577 netbox/netbox/tables/tables.py:331
#: netbox/templates/circuits/circuit.html:30
#: netbox/dcim/tables/devices.py:897 netbox/dcim/tables/power.py:73
#: netbox/dcim/tables/racks.py:126 netbox/extras/forms/bulk_import.py:43
#: netbox/extras/tables/tables.py:509 netbox/extras/tables/tables.py:577
#: netbox/netbox/tables/tables.py:331 netbox/templates/circuits/circuit.html:30
#: netbox/templates/circuits/virtualcircuit.html:39
#: netbox/templates/circuits/virtualcircuittermination.html:64
#: netbox/templates/core/datasource.html:38 netbox/templates/dcim/cable.html:15
@@ -582,8 +582,8 @@ msgstr ""
#: netbox/dcim/forms/filtersets.py:1105 netbox/dcim/forms/filtersets.py:1208
#: netbox/dcim/forms/filtersets.py:1326 netbox/dcim/forms/filtersets.py:1547
#: netbox/dcim/forms/filtersets.py:1923 netbox/dcim/tables/devices.py:143
#: netbox/dcim/tables/devices.py:531 netbox/dcim/tables/devices.py:891
#: netbox/dcim/tables/devices.py:1047 netbox/dcim/tables/devices.py:1155
#: netbox/dcim/tables/devices.py:531 netbox/dcim/tables/devices.py:900
#: netbox/dcim/tables/devices.py:1034 netbox/dcim/tables/devices.py:1142
#: netbox/dcim/tables/modules.py:98 netbox/dcim/tables/power.py:70
#: netbox/dcim/tables/racks.py:114 netbox/dcim/tables/racks.py:211
#: netbox/dcim/tables/sites.py:61 netbox/dcim/tables/sites.py:105
@@ -1010,19 +1010,20 @@ msgstr ""
#: netbox/dcim/forms/filtersets.py:1900 netbox/dcim/forms/filtersets.py:1940
#: netbox/dcim/forms/model_forms.py:257 netbox/dcim/forms/model_forms.py:1224
#: netbox/dcim/forms/model_forms.py:1707 netbox/dcim/forms/object_import.py:182
#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:1031
#: netbox/dcim/tables/devicetypes.py:317 netbox/dcim/tables/racks.py:117
#: netbox/extras/filtersets.py:708 netbox/ipam/forms/bulk_edit.py:206
#: netbox/ipam/forms/bulk_edit.py:250 netbox/ipam/forms/bulk_edit.py:297
#: netbox/ipam/forms/bulk_edit.py:438 netbox/ipam/forms/bulk_import.py:199
#: netbox/ipam/forms/bulk_import.py:263 netbox/ipam/forms/bulk_import.py:299
#: netbox/ipam/forms/bulk_import.py:511 netbox/ipam/forms/filtersets.py:262
#: netbox/ipam/forms/filtersets.py:321 netbox/ipam/forms/filtersets.py:401
#: netbox/ipam/forms/filtersets.py:593 netbox/ipam/forms/model_forms.py:186
#: netbox/ipam/forms/model_forms.py:212 netbox/ipam/forms/model_forms.py:250
#: netbox/ipam/forms/model_forms.py:675 netbox/ipam/tables/ip.py:207
#: netbox/ipam/tables/ip.py:264 netbox/ipam/tables/ip.py:317
#: netbox/ipam/tables/vlans.py:103 netbox/ipam/tables/vlans.py:227
#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:892
#: netbox/dcim/tables/devices.py:1018 netbox/dcim/tables/devicetypes.py:317
#: netbox/dcim/tables/racks.py:117 netbox/extras/filtersets.py:708
#: netbox/ipam/forms/bulk_edit.py:206 netbox/ipam/forms/bulk_edit.py:250
#: netbox/ipam/forms/bulk_edit.py:297 netbox/ipam/forms/bulk_edit.py:438
#: netbox/ipam/forms/bulk_import.py:199 netbox/ipam/forms/bulk_import.py:263
#: netbox/ipam/forms/bulk_import.py:299 netbox/ipam/forms/bulk_import.py:511
#: netbox/ipam/forms/filtersets.py:262 netbox/ipam/forms/filtersets.py:321
#: netbox/ipam/forms/filtersets.py:401 netbox/ipam/forms/filtersets.py:593
#: netbox/ipam/forms/model_forms.py:186 netbox/ipam/forms/model_forms.py:212
#: netbox/ipam/forms/model_forms.py:250 netbox/ipam/forms/model_forms.py:675
#: netbox/ipam/tables/ip.py:207 netbox/ipam/tables/ip.py:264
#: netbox/ipam/tables/ip.py:317 netbox/ipam/tables/vlans.py:103
#: netbox/ipam/tables/vlans.py:227
#: netbox/templates/circuits/virtualcircuittermination.html:42
#: netbox/templates/dcim/inc/panels/inventory_items.html:20
#: netbox/templates/dcim/interface.html:191
@@ -1129,7 +1130,7 @@ msgstr ""
#: netbox/dcim/forms/bulk_import.py:1324 netbox/dcim/forms/model_forms.py:1298
#: netbox/dcim/forms/model_forms.py:1567 netbox/dcim/forms/model_forms.py:1748
#: netbox/dcim/forms/model_forms.py:1783 netbox/dcim/forms/model_forms.py:1908
#: netbox/dcim/tables/connections.py:65 netbox/dcim/tables/devices.py:1198
#: netbox/dcim/tables/connections.py:65 netbox/dcim/tables/devices.py:1185
#: netbox/ipam/forms/bulk_import.py:319 netbox/ipam/forms/model_forms.py:280
#: netbox/ipam/forms/model_forms.py:289 netbox/ipam/tables/fhrp.py:61
#: netbox/ipam/tables/ip.py:322 netbox/ipam/tables/vlans.py:146
@@ -1372,7 +1373,7 @@ msgstr ""
#: netbox/users/forms/bulk_edit.py:161 netbox/users/forms/filtersets.py:35
#: netbox/users/forms/filtersets.py:41 netbox/users/forms/filtersets.py:76
#: netbox/users/forms/filtersets.py:165 netbox/users/forms/filtersets.py:171
#: netbox/users/forms/model_forms.py:483 netbox/users/tables.py:186
#: netbox/users/forms/model_forms.py:483 netbox/users/tables.py:185
#: netbox/virtualization/forms/bulk_edit.py:55
#: netbox/virtualization/forms/bulk_import.py:49
#: netbox/virtualization/forms/filtersets.py:98
@@ -1689,10 +1690,10 @@ msgstr ""
#: netbox/dcim/tables/devices.py:498 netbox/dcim/tables/devices.py:552
#: netbox/dcim/tables/devices.py:575 netbox/dcim/tables/devices.py:706
#: netbox/dcim/tables/devices.py:728 netbox/dcim/tables/devices.py:809
#: netbox/dcim/tables/devices.py:862 netbox/dcim/tables/devices.py:937
#: netbox/dcim/tables/devices.py:1006 netbox/dcim/tables/devices.py:1071
#: netbox/dcim/tables/devices.py:1090 netbox/dcim/tables/devices.py:1119
#: netbox/dcim/tables/devices.py:1146 netbox/dcim/tables/devicetypes.py:31
#: netbox/dcim/tables/devices.py:862 netbox/dcim/tables/devices.py:924
#: netbox/dcim/tables/devices.py:993 netbox/dcim/tables/devices.py:1058
#: netbox/dcim/tables/devices.py:1077 netbox/dcim/tables/devices.py:1106
#: netbox/dcim/tables/devices.py:1133 netbox/dcim/tables/devicetypes.py:31
#: netbox/dcim/tables/devicetypes.py:228 netbox/dcim/tables/modules.py:17
#: netbox/dcim/tables/power.py:21 netbox/dcim/tables/power.py:58
#: netbox/dcim/tables/racks.py:20 netbox/dcim/tables/racks.py:102
@@ -1780,9 +1781,9 @@ msgstr ""
#: netbox/templates/vpn/tunnelgroup.html:26
#: netbox/templates/wireless/wirelesslangroup.html:29
#: netbox/tenancy/tables/contacts.py:38 netbox/tenancy/tables/contacts.py:53
#: netbox/tenancy/tables/tenants.py:35 netbox/users/tables.py:92
#: netbox/users/tables.py:106 netbox/users/tables.py:160
#: netbox/users/tables.py:182 netbox/virtualization/forms/bulk_create.py:20
#: netbox/tenancy/tables/tenants.py:35 netbox/users/tables.py:91
#: netbox/users/tables.py:105 netbox/users/tables.py:159
#: netbox/users/tables.py:181 netbox/virtualization/forms/bulk_create.py:20
#: netbox/virtualization/forms/object_create.py:13
#: netbox/virtualization/forms/object_create.py:23
#: netbox/virtualization/tables/clusters.py:17
@@ -1915,8 +1916,8 @@ msgstr ""
#: netbox/dcim/tables/devices.py:428 netbox/dcim/tables/devices.py:470
#: netbox/dcim/tables/devices.py:520 netbox/dcim/tables/devices.py:637
#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:831
#: netbox/dcim/tables/devices.py:884 netbox/dcim/tables/devices.py:956
#: netbox/dcim/tables/devices.py:1024 netbox/dcim/tables/devices.py:1150
#: netbox/dcim/tables/devices.py:884 netbox/dcim/tables/devices.py:943
#: netbox/dcim/tables/devices.py:1011 netbox/dcim/tables/devices.py:1137
#: netbox/dcim/tables/modules.py:81 netbox/extras/forms/filtersets.py:402
#: netbox/ipam/forms/bulk_import.py:305 netbox/ipam/forms/filtersets.py:649
#: netbox/ipam/forms/model_forms.py:322 netbox/ipam/tables/vlans.py:157
@@ -2079,7 +2080,7 @@ msgstr ""
#: netbox/templates/extras/htmx/script_result.html:12
#: netbox/templates/extras/journalentry.html:22
#: netbox/templates/generic/object.html:65
#: netbox/templates/htmx/quick_add_created.html:7 netbox/users/tables.py:37
#: netbox/templates/htmx/quick_add_created.html:7 netbox/users/tables.py:36
msgid "Created"
msgstr ""
@@ -2140,7 +2141,7 @@ msgstr ""
#: netbox/core/data_backends.py:63 netbox/core/tables/change_logging.py:20
#: netbox/templates/account/profile.html:13 netbox/templates/users/user.html:15
#: netbox/users/tables.py:64
#: netbox/users/tables.py:63
msgid "Username"
msgstr ""
@@ -2215,7 +2216,7 @@ msgstr ""
#: netbox/templates/virtualization/vminterface.html:29
#: netbox/users/forms/bulk_edit.py:87 netbox/users/forms/bulk_edit.py:105
#: netbox/users/forms/filtersets.py:67 netbox/users/forms/filtersets.py:133
#: netbox/users/tables.py:30 netbox/users/tables.py:113
#: netbox/users/tables.py:29 netbox/users/tables.py:112
#: netbox/virtualization/forms/bulk_edit.py:182
#: netbox/virtualization/forms/filtersets.py:237
msgid "Enabled"
@@ -2800,7 +2801,7 @@ msgid "Message"
msgstr ""
#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:48
#: netbox/users/tables.py:72
#: netbox/users/tables.py:71
msgid "Is Active"
msgstr ""
@@ -3154,8 +3155,8 @@ msgstr ""
#: netbox/dcim/forms/model_forms.py:525 netbox/dcim/forms/model_forms.py:1216
#: netbox/dcim/forms/model_forms.py:1699 netbox/dcim/forms/object_import.py:177
#: netbox/dcim/tables/devices.py:701 netbox/dcim/tables/devices.py:736
#: netbox/dcim/tables/devices.py:964 netbox/dcim/tables/devices.py:1051
#: netbox/dcim/tables/devices.py:1204 netbox/ipam/forms/bulk_import.py:578
#: netbox/dcim/tables/devices.py:951 netbox/dcim/tables/devices.py:1038
#: netbox/dcim/tables/devices.py:1191 netbox/ipam/forms/bulk_import.py:578
#: netbox/ipam/forms/model_forms.py:755 netbox/ipam/tables/fhrp.py:56
#: netbox/ipam/tables/ip.py:328 netbox/ipam/tables/services.py:42
#: netbox/netbox/tables/tables.py:321 netbox/netbox/ui/panels.py:202
@@ -4169,7 +4170,7 @@ msgstr ""
msgid "LAG interface (ID)"
msgstr ""
#: netbox/dcim/filtersets.py:2046 netbox/dcim/tables/devices.py:1193
#: netbox/dcim/filtersets.py:2046 netbox/dcim/tables/devices.py:1180
#: netbox/templates/dcim/interface.html:144
#: netbox/templates/dcim/macaddress.html:11
#: netbox/templates/dcim/macaddress.html:14
@@ -4312,7 +4313,7 @@ msgstr ""
#: netbox/dcim/forms/model_forms.py:426 netbox/dcim/forms/model_forms.py:530
#: netbox/dcim/forms/model_forms.py:1229 netbox/dcim/forms/model_forms.py:1712
#: netbox/dcim/forms/object_import.py:188 netbox/dcim/tables/devices.py:100
#: netbox/dcim/tables/devices.py:175 netbox/dcim/tables/devices.py:1034
#: netbox/dcim/tables/devices.py:175 netbox/dcim/tables/devices.py:1021
#: netbox/dcim/tables/devicetypes.py:86 netbox/dcim/tables/devicetypes.py:321
#: netbox/dcim/tables/modules.py:46 netbox/dcim/tables/modules.py:89
#: netbox/dcim/tables/racks.py:50 netbox/dcim/tables/racks.py:120
@@ -5266,7 +5267,7 @@ msgstr ""
msgid "Physical medium classification"
msgstr ""
#: netbox/dcim/forms/bulk_import.py:1145
#: netbox/dcim/forms/bulk_import.py:1145 netbox/dcim/tables/devices.py:905
msgid "Installed device"
msgstr ""
@@ -5427,7 +5428,7 @@ msgid ""
msgstr ""
#: netbox/dcim/forms/bulk_import.py:1584 netbox/dcim/forms/model_forms.py:890
#: netbox/dcim/tables/devices.py:1123
#: netbox/dcim/tables/devices.py:1110
#: netbox/templates/dcim/panels/virtual_chassis_members.html:10
#: netbox/templates/dcim/virtualchassis.html:17
#: netbox/templates/dcim/virtualchassis.html:57
@@ -5685,7 +5686,7 @@ msgstr ""
msgid "Cable"
msgstr ""
#: netbox/dcim/forms/filtersets.py:1916 netbox/dcim/tables/devices.py:1043
#: netbox/dcim/forms/filtersets.py:1916 netbox/dcim/tables/devices.py:1030
msgid "Discovered"
msgstr ""
@@ -5994,7 +5995,7 @@ msgid ""
"expected."
msgstr ""
#: netbox/dcim/forms/object_create.py:311 netbox/dcim/tables/devices.py:1129
#: netbox/dcim/forms/object_create.py:311 netbox/dcim/tables/devices.py:1116
#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:43
#: netbox/templates/dcim/virtualchassis_edit.html:59
#: netbox/templates/ipam/fhrpgroup.html:38
@@ -7661,7 +7662,7 @@ msgstr ""
msgid "U Height"
msgstr ""
#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1160
#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1147
#: netbox/ipam/forms/bulk_import.py:597 netbox/ipam/forms/model_forms.py:306
#: netbox/ipam/forms/model_forms.py:318 netbox/ipam/tables/ip.py:306
#: netbox/ipam/tables/ip.py:370 netbox/ipam/tables/ip.py:385
@@ -7670,12 +7671,12 @@ msgstr ""
msgid "IP Address"
msgstr ""
#: netbox/dcim/tables/devices.py:199 netbox/dcim/tables/devices.py:1164
#: netbox/dcim/tables/devices.py:199 netbox/dcim/tables/devices.py:1151
#: netbox/virtualization/tables/virtualmachines.py:56
msgid "IPv4 Address"
msgstr ""
#: netbox/dcim/tables/devices.py:203 netbox/dcim/tables/devices.py:1168
#: netbox/dcim/tables/devices.py:203 netbox/dcim/tables/devices.py:1155
#: netbox/virtualization/tables/virtualmachines.py:60
msgid "IPv6 Address"
msgstr ""
@@ -7713,7 +7714,7 @@ msgstr ""
msgid "Power outlets"
msgstr ""
#: netbox/dcim/tables/devices.py:253 netbox/dcim/tables/devices.py:1173
#: netbox/dcim/tables/devices.py:253 netbox/dcim/tables/devices.py:1160
#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1413
#: netbox/dcim/views.py:1750 netbox/dcim/views.py:2580
#: netbox/netbox/navigation/menu.py:97 netbox/netbox/navigation/menu.py:261
@@ -7847,52 +7848,28 @@ msgstr ""
msgid "Mappings"
msgstr ""
#: netbox/dcim/tables/devices.py:896 netbox/templates/dcim/devicebay.html:43
msgid "Installed Device"
msgstr ""
#: netbox/dcim/tables/devices.py:901
msgid "Installed Role"
msgstr ""
#: netbox/dcim/tables/devices.py:906
msgid "Installed Type"
msgstr ""
#: netbox/dcim/tables/devices.py:910
msgid "Installed Description"
msgstr ""
#: netbox/dcim/tables/devices.py:914
msgid "Installed Serial"
msgstr ""
#: netbox/dcim/tables/devices.py:918
msgid "Installed Asset Tag"
msgstr ""
#: netbox/dcim/tables/devices.py:968 netbox/templates/dcim/modulebay.html:53
#: netbox/dcim/tables/devices.py:955 netbox/templates/dcim/modulebay.html:53
msgid "Installed Module"
msgstr ""
#: netbox/dcim/tables/devices.py:971
#: netbox/dcim/tables/devices.py:958
msgid "Module Serial"
msgstr ""
#: netbox/dcim/tables/devices.py:975
#: netbox/dcim/tables/devices.py:962
msgid "Module Asset Tag"
msgstr ""
#: netbox/dcim/tables/devices.py:984
#: netbox/dcim/tables/devices.py:971
msgid "Module Status"
msgstr ""
#: netbox/dcim/tables/devices.py:1038 netbox/dcim/tables/devicetypes.py:325
#: netbox/dcim/tables/devices.py:1025 netbox/dcim/tables/devicetypes.py:325
#: netbox/templates/dcim/inventoryitem.html:44
msgid "Component"
msgstr ""
#: netbox/dcim/tables/devices.py:1096
#: netbox/dcim/tables/devices.py:1083
msgid "Items"
msgstr ""
@@ -8859,7 +8836,7 @@ msgstr ""
#: netbox/users/forms/filtersets.py:181 netbox/users/forms/model_forms.py:262
#: netbox/users/forms/model_forms.py:274 netbox/users/forms/model_forms.py:349
#: netbox/users/forms/model_forms.py:480 netbox/users/forms/model_forms.py:495
#: netbox/users/tables.py:136 netbox/users/tables.py:194
#: netbox/users/tables.py:135 netbox/users/tables.py:193
msgid "Users"
msgstr ""
@@ -8878,8 +8855,8 @@ msgstr ""
#: netbox/tenancy/tables/contacts.py:101 netbox/users/forms/filtersets.py:176
#: netbox/users/forms/model_forms.py:207 netbox/users/forms/model_forms.py:219
#: netbox/users/forms/model_forms.py:354 netbox/users/forms/model_forms.py:479
#: netbox/users/tables.py:68 netbox/users/tables.py:140
#: netbox/users/tables.py:190
#: netbox/users/tables.py:67 netbox/users/tables.py:139
#: netbox/users/tables.py:189
msgid "Groups"
msgstr ""
@@ -10036,7 +10013,7 @@ msgstr ""
#: netbox/extras/tables/tables.py:516 netbox/extras/tables/tables.py:554
#: netbox/templates/extras/customfield.html:105
#: netbox/templates/extras/eventrule.html:27
#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:110
#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:109
msgid "Object Types"
msgstr ""
@@ -12490,7 +12467,7 @@ msgstr ""
msgid "Owner Groups"
msgstr ""
#: netbox/netbox/navigation/menu.py:424 netbox/users/tables.py:166
#: netbox/netbox/navigation/menu.py:424 netbox/users/tables.py:165
msgid "Owners"
msgstr ""
@@ -13901,6 +13878,10 @@ msgstr ""
msgid "Device Bay"
msgstr ""
#: netbox/templates/dcim/devicebay.html:43
msgid "Installed Device"
msgstr ""
#: netbox/templates/dcim/devicebay_depopulate.html:6
#, python-format
msgid "Remove %(device)s from %(device_bay)s?"
@@ -15956,12 +15937,12 @@ msgid "Write enabled"
msgstr ""
#: netbox/users/forms/bulk_edit.py:120 netbox/users/forms/filtersets.py:144
#: netbox/users/tables.py:41
#: netbox/users/tables.py:40
msgid "Expires"
msgstr ""
#: netbox/users/forms/bulk_edit.py:125 netbox/users/forms/model_forms.py:136
#: netbox/users/tables.py:47
#: netbox/users/tables.py:46
msgid "Allowed IPs"
msgstr ""
@@ -15973,31 +15954,31 @@ msgstr ""
msgid "If no token is provided, one will be generated automatically."
msgstr ""
#: netbox/users/forms/filtersets.py:55 netbox/users/tables.py:75
#: netbox/users/forms/filtersets.py:55 netbox/users/tables.py:74
msgid "Is Superuser"
msgstr ""
#: netbox/users/forms/filtersets.py:88 netbox/users/tables.py:116
#: netbox/users/forms/filtersets.py:88 netbox/users/tables.py:115
msgid "Can View"
msgstr ""
#: netbox/users/forms/filtersets.py:95 netbox/users/tables.py:120
#: netbox/users/forms/filtersets.py:95 netbox/users/tables.py:119
msgid "Can Add"
msgstr ""
#: netbox/users/forms/filtersets.py:102 netbox/users/tables.py:124
#: netbox/users/forms/filtersets.py:102 netbox/users/tables.py:123
msgid "Can Change"
msgstr ""
#: netbox/users/forms/filtersets.py:109 netbox/users/tables.py:128
#: netbox/users/forms/filtersets.py:109 netbox/users/tables.py:127
msgid "Can Delete"
msgstr ""
#: netbox/users/forms/filtersets.py:140 netbox/users/tables.py:33
#: netbox/users/forms/filtersets.py:140 netbox/users/tables.py:32
msgid "Write Enabled"
msgstr ""
#: netbox/users/forms/filtersets.py:149 netbox/users/tables.py:44
#: netbox/users/forms/filtersets.py:149 netbox/users/tables.py:43
msgid "Last Used"
msgstr ""
@@ -16258,7 +16239,7 @@ msgstr ""
msgid "A user with this username already exists."
msgstr ""
#: netbox/users/tables.py:132
#: netbox/users/tables.py:131
msgid "Custom Actions"
msgstr ""

View File

@@ -14,26 +14,22 @@ class OwnerFilterMixin(django_filters.FilterSet):
"""
owner_group_id = django_filters.ModelMultipleChoiceFilter(
queryset=OwnerGroup.objects.all(),
distinct=False,
field_name='owner__group',
label=_('Owner Group (ID)'),
)
owner_group = django_filters.ModelMultipleChoiceFilter(
queryset=OwnerGroup.objects.all(),
distinct=False,
field_name='owner__group__name',
to_field_name='name',
label=_('Owner Group (name)'),
)
owner_id = django_filters.ModelMultipleChoiceFilter(
queryset=Owner.objects.all(),
distinct=False,
label=_('Owner (ID)'),
)
owner = django_filters.ModelMultipleChoiceFilter(
field_name='owner__name',
queryset=Owner.objects.all(),
distinct=False,
to_field_name='name',
label=_('Owner (name)'),
)

View File

@@ -131,13 +131,11 @@ class TokenFilterSet(BaseFilterSet):
user_id = django_filters.ModelMultipleChoiceFilter(
field_name='user',
queryset=User.objects.all(),
distinct=False,
label=_('User'),
)
user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username',
queryset=User.objects.all(),
distinct=False,
to_field_name='username',
label=_('User (name)'),
)
@@ -282,13 +280,11 @@ class OwnerFilterSet(BaseFilterSet):
)
group_id = django_filters.ModelMultipleChoiceFilter(
queryset=OwnerGroup.objects.all(),
distinct=False,
label=_('Group (ID)'),
)
group = django_filters.ModelMultipleChoiceFilter(
field_name='group__name',
queryset=OwnerGroup.objects.all(),
distinct=False,
to_field_name='name',
label=_('Group (name)'),
)

View File

@@ -24,7 +24,6 @@ class TokenTable(NetBoxTable):
token = columns.TemplateColumn(
verbose_name=_('token'),
template_code=TOKEN,
orderable=False,
)
enabled = columns.BooleanColumn(
verbose_name=_('Enabled')

View File

@@ -1,24 +0,0 @@
from django.test import RequestFactory, tag, TestCase
from users.models import Token
from users.tables import TokenTable
class TokenTableTest(TestCase):
@tag('regression')
def test_every_orderable_field_does_not_throw_exception(self):
tokens = Token.objects.all()
disallowed = {'actions'}
orderable_columns = [
column.name for column in TokenTable(tokens).columns
if column.orderable and column.name not in disallowed
]
fake_request = RequestFactory().get("/")
for col in orderable_columns:
for direction in ('-', ''):
with self.subTest(col=col, direction=direction):
table = TokenTable(tokens)
table.order_by = f'{direction}{col}'
table.as_html(fake_request)

View File

@@ -1,6 +1,8 @@
import django_filters
import netaddr
from django.db.models import Q
from django.utils.translation import gettext as _
from netaddr.core import AddrFormatError
from dcim.base_filtersets import ScopedFilterSet
from dcim.filtersets import CommonInterfaceFilterSet
@@ -47,31 +49,26 @@ class ClusterGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet)
class ClusterFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ScopedFilterSet, ContactModelFilterSet):
group_id = django_filters.ModelMultipleChoiceFilter(
queryset=ClusterGroup.objects.all(),
distinct=False,
label=_('Parent group (ID)'),
)
group = django_filters.ModelMultipleChoiceFilter(
field_name='group__slug',
queryset=ClusterGroup.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Parent group (slug)'),
)
type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ClusterType.objects.all(),
distinct=False,
label=_('Cluster type (ID)'),
)
type = django_filters.ModelMultipleChoiceFilter(
field_name='type__slug',
queryset=ClusterType.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Cluster type (slug)'),
)
status = django_filters.MultipleChoiceFilter(
choices=ClusterStatusChoices,
distinct=False,
null_value=None
)
@@ -99,61 +96,51 @@ class VirtualMachineFilterSet(
):
status = django_filters.MultipleChoiceFilter(
choices=VirtualMachineStatusChoices,
distinct=False,
null_value=None
)
start_on_boot = django_filters.MultipleChoiceFilter(
choices=VirtualMachineStartOnBootChoices,
distinct=False,
null_value=None
)
cluster_group_id = django_filters.ModelMultipleChoiceFilter(
field_name='cluster__group',
queryset=ClusterGroup.objects.all(),
distinct=False,
label=_('Cluster group (ID)'),
)
cluster_group = django_filters.ModelMultipleChoiceFilter(
field_name='cluster__group__slug',
queryset=ClusterGroup.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Cluster group (slug)'),
)
cluster_type_id = django_filters.ModelMultipleChoiceFilter(
field_name='cluster__type',
queryset=ClusterType.objects.all(),
distinct=False,
label=_('Cluster type (ID)'),
)
cluster_type = django_filters.ModelMultipleChoiceFilter(
field_name='cluster__type__slug',
queryset=ClusterType.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Cluster type (slug)'),
)
cluster_id = django_filters.ModelMultipleChoiceFilter(
queryset=Cluster.objects.all(),
distinct=False,
label=_('Cluster (ID)'),
)
cluster = django_filters.ModelMultipleChoiceFilter(
field_name='cluster__name',
queryset=Cluster.objects.all(),
distinct=False,
to_field_name='name',
label=_('Cluster'),
)
device_id = django_filters.ModelMultipleChoiceFilter(
queryset=Device.objects.all(),
distinct=False,
label=_('Device (ID)'),
)
device = django_filters.ModelMultipleChoiceFilter(
field_name='device__name',
queryset=Device.objects.all(),
distinct=False,
to_field_name='name',
label=_('Device'),
)
@@ -185,13 +172,11 @@ class VirtualMachineFilterSet(
)
site_id = django_filters.ModelMultipleChoiceFilter(
queryset=Site.objects.all(),
distinct=False,
label=_('Site (ID)'),
)
site = django_filters.ModelMultipleChoiceFilter(
field_name='site__slug',
queryset=Site.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Site (slug)'),
)
@@ -233,7 +218,6 @@ class VirtualMachineFilterSet(
)
config_template_id = django_filters.ModelMultipleChoiceFilter(
queryset=ConfigTemplate.objects.all(),
distinct=False,
label=_('Config template (ID)'),
)
@@ -247,14 +231,22 @@ class VirtualMachineFilterSet(
def search(self, queryset, name, value):
if not value.strip():
return queryset
return queryset.filter(
qs_filter = Q(
Q(name__icontains=value) |
Q(description__icontains=value) |
Q(comments__icontains=value) |
Q(primary_ip4__address__startswith=value) |
Q(primary_ip6__address__startswith=value) |
Q(serial__icontains=value)
)
# If the given value looks like an IP address, look for primary IPv4/IPv6 assignments
try:
ipaddress = netaddr.IPNetwork(value)
if ipaddress.version == 4:
qs_filter |= Q(primary_ip4__address__host__inet=ipaddress.ip)
elif ipaddress.version == 6:
qs_filter |= Q(primary_ip6__address__host__inet=ipaddress.ip)
except (AddrFormatError, ValueError):
pass
return queryset.filter(qs_filter)
def _has_primary_ip(self, queryset, name, value):
params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False)
@@ -268,39 +260,33 @@ class VMInterfaceFilterSet(CommonInterfaceFilterSet, OwnerFilterMixin, NetBoxMod
cluster_id = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_machine__cluster',
queryset=Cluster.objects.all(),
distinct=False,
label=_('Cluster (ID)'),
)
cluster = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_machine__cluster__name',
queryset=Cluster.objects.all(),
distinct=False,
to_field_name='name',
label=_('Cluster'),
)
virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_machine',
queryset=VirtualMachine.objects.all(),
distinct=False,
label=_('Virtual machine (ID)'),
)
virtual_machine = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_machine__name',
queryset=VirtualMachine.objects.all(),
distinct=False,
to_field_name='name',
label=_('Virtual machine'),
)
parent_id = django_filters.ModelMultipleChoiceFilter(
field_name='parent',
queryset=VMInterface.objects.all(),
distinct=False,
label=_('Parent interface (ID)'),
)
bridge_id = django_filters.ModelMultipleChoiceFilter(
field_name='bridge',
queryset=VMInterface.objects.all(),
distinct=False,
label=_('Bridged interface (ID)'),
)
mac_address = MultiValueMACAddressFilter(
@@ -310,13 +296,11 @@ class VMInterfaceFilterSet(CommonInterfaceFilterSet, OwnerFilterMixin, NetBoxMod
primary_mac_address_id = django_filters.ModelMultipleChoiceFilter(
field_name='primary_mac_address',
queryset=MACAddress.objects.all(),
distinct=False,
label=_('Primary MAC address (ID)'),
)
primary_mac_address = django_filters.ModelMultipleChoiceFilter(
field_name='primary_mac_address__mac_address',
queryset=MACAddress.objects.all(),
distinct=False,
to_field_name='mac_address',
label=_('Primary MAC address'),
)
@@ -339,13 +323,11 @@ class VirtualDiskFilterSet(OwnerFilterMixin, NetBoxModelFilterSet):
virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_machine',
queryset=VirtualMachine.objects.all(),
distinct=False,
label=_('Virtual machine (ID)'),
)
virtual_machine = django_filters.ModelMultipleChoiceFilter(
field_name='virtual_machine__name',
queryset=VirtualMachine.objects.all(),
distinct=False,
to_field_name='name',
label=_('Virtual machine'),
)

View File

@@ -38,34 +38,28 @@ class TunnelGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet):
@register_filterset
class TunnelFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
status = django_filters.MultipleChoiceFilter(
choices=TunnelStatusChoices,
distinct=False,
choices=TunnelStatusChoices
)
group_id = django_filters.ModelMultipleChoiceFilter(
queryset=TunnelGroup.objects.all(),
distinct=False,
label=_('Tunnel group (ID)'),
)
group = django_filters.ModelMultipleChoiceFilter(
field_name='group__slug',
queryset=TunnelGroup.objects.all(),
distinct=False,
to_field_name='slug',
label=_('Tunnel group (slug)'),
)
encapsulation = django_filters.MultipleChoiceFilter(
choices=TunnelEncapsulationChoices,
distinct=False,
choices=TunnelEncapsulationChoices
)
ipsec_profile_id = django_filters.ModelMultipleChoiceFilter(
queryset=IPSecProfile.objects.all(),
distinct=False,
label=_('IPSec profile (ID)'),
)
ipsec_profile = django_filters.ModelMultipleChoiceFilter(
field_name='ipsec_profile__name',
queryset=IPSecProfile.objects.all(),
distinct=False,
to_field_name='name',
label=_('IPSec profile (name)'),
)
@@ -89,19 +83,16 @@ class TunnelTerminationFilterSet(NetBoxModelFilterSet):
tunnel_id = django_filters.ModelMultipleChoiceFilter(
field_name='tunnel',
queryset=Tunnel.objects.all(),
distinct=False,
label=_('Tunnel (ID)'),
)
tunnel = django_filters.ModelMultipleChoiceFilter(
field_name='tunnel__name',
queryset=Tunnel.objects.all(),
distinct=False,
to_field_name='name',
label=_('Tunnel (name)'),
)
role = django_filters.MultipleChoiceFilter(
choices=TunnelTerminationRoleChoices,
distinct=False,
choices=TunnelTerminationRoleChoices
)
termination_type = ContentTypeFilter()
interface = django_filters.ModelMultipleChoiceFilter(
@@ -129,7 +120,6 @@ class TunnelTerminationFilterSet(NetBoxModelFilterSet):
outside_ip_id = django_filters.ModelMultipleChoiceFilter(
field_name='outside_ip',
queryset=IPAddress.objects.all(),
distinct=False,
label=_('Outside IP (ID)'),
)
@@ -152,20 +142,16 @@ class IKEProposalFilterSet(PrimaryModelFilterSet):
label=_('IKE policy (name)'),
)
authentication_method = django_filters.MultipleChoiceFilter(
choices=AuthenticationMethodChoices,
distinct=False,
choices=AuthenticationMethodChoices
)
encryption_algorithm = django_filters.MultipleChoiceFilter(
choices=EncryptionAlgorithmChoices,
distinct=False,
choices=EncryptionAlgorithmChoices
)
authentication_algorithm = django_filters.MultipleChoiceFilter(
choices=AuthenticationAlgorithmChoices,
distinct=False,
choices=AuthenticationAlgorithmChoices
)
group = django_filters.MultipleChoiceFilter(
choices=DHGroupChoices,
distinct=False,
choices=DHGroupChoices
)
class Meta:
@@ -185,12 +171,10 @@ class IKEProposalFilterSet(PrimaryModelFilterSet):
@register_filterset
class IKEPolicyFilterSet(PrimaryModelFilterSet):
version = django_filters.MultipleChoiceFilter(
choices=IKEVersionChoices,
distinct=False,
choices=IKEVersionChoices
)
mode = django_filters.MultipleChoiceFilter(
choices=IKEModeChoices,
distinct=False,
choices=IKEModeChoices
)
ike_proposal_id = django_filters.ModelMultipleChoiceFilter(
field_name='proposals',
@@ -230,12 +214,10 @@ class IPSecProposalFilterSet(PrimaryModelFilterSet):
label=_('IPSec policy (name)'),
)
encryption_algorithm = django_filters.MultipleChoiceFilter(
choices=EncryptionAlgorithmChoices,
distinct=False,
choices=EncryptionAlgorithmChoices
)
authentication_algorithm = django_filters.MultipleChoiceFilter(
choices=AuthenticationAlgorithmChoices,
distinct=False,
choices=AuthenticationAlgorithmChoices
)
class Meta:
@@ -255,8 +237,7 @@ class IPSecProposalFilterSet(PrimaryModelFilterSet):
@register_filterset
class IPSecPolicyFilterSet(PrimaryModelFilterSet):
pfs_group = django_filters.MultipleChoiceFilter(
choices=DHGroupChoices,
distinct=False,
choices=DHGroupChoices
)
ipsec_proposal_id = django_filters.ModelMultipleChoiceFilter(
field_name='proposals',
@@ -285,30 +266,25 @@ class IPSecPolicyFilterSet(PrimaryModelFilterSet):
@register_filterset
class IPSecProfileFilterSet(PrimaryModelFilterSet):
mode = django_filters.MultipleChoiceFilter(
choices=IPSecModeChoices,
distinct=False,
choices=IPSecModeChoices
)
ike_policy_id = django_filters.ModelMultipleChoiceFilter(
queryset=IKEPolicy.objects.all(),
distinct=False,
label=_('IKE policy (ID)'),
)
ike_policy = django_filters.ModelMultipleChoiceFilter(
field_name='ike_policy__name',
queryset=IKEPolicy.objects.all(),
distinct=False,
to_field_name='name',
label=_('IKE policy (name)'),
)
ipsec_policy_id = django_filters.ModelMultipleChoiceFilter(
queryset=IPSecPolicy.objects.all(),
distinct=False,
label=_('IPSec policy (ID)'),
)
ipsec_policy = django_filters.ModelMultipleChoiceFilter(
field_name='ipsec_policy__name',
queryset=IPSecPolicy.objects.all(),
distinct=False,
to_field_name='name',
label=_('IPSec policy (name)'),
)
@@ -331,12 +307,10 @@ class IPSecProfileFilterSet(PrimaryModelFilterSet):
class L2VPNFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
type = django_filters.MultipleChoiceFilter(
choices=L2VPNTypeChoices,
distinct=False,
null_value=None
)
status = django_filters.MultipleChoiceFilter(
choices=L2VPNStatusChoices,
distinct=False,
)
import_target_id = django_filters.ModelMultipleChoiceFilter(
field_name='import_targets',
@@ -380,13 +354,11 @@ class L2VPNFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilter
class L2VPNTerminationFilterSet(NetBoxModelFilterSet):
l2vpn_id = django_filters.ModelMultipleChoiceFilter(
queryset=L2VPN.objects.all(),
distinct=False,
label=_('L2VPN (ID)'),
)
l2vpn = django_filters.ModelMultipleChoiceFilter(
field_name='l2vpn__slug',
queryset=L2VPN.objects.all(),
distinct=False,
to_field_name='slug',
label=_('L2VPN (slug)'),
)
@@ -471,7 +443,6 @@ class L2VPNTerminationFilterSet(NetBoxModelFilterSet):
)
assigned_object_type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ObjectType.objects.all(),
distinct=False,
field_name='assigned_object_type'
)
assigned_object_type = ContentTypeFilter()

View File

@@ -22,13 +22,11 @@ __all__ = (
@register_filterset
class WirelessLANGroupFilterSet(NestedGroupModelFilterSet):
parent_id = django_filters.ModelMultipleChoiceFilter(
queryset=WirelessLANGroup.objects.all(),
distinct=False,
queryset=WirelessLANGroup.objects.all()
)
parent = django_filters.ModelMultipleChoiceFilter(
field_name='parent__slug',
queryset=WirelessLANGroup.objects.all(),
distinct=False,
to_field_name='slug'
)
ancestor_id = TreeNodeMultipleChoiceFilter(
@@ -62,24 +60,20 @@ class WirelessLANFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilter
to_field_name='slug'
)
status = django_filters.MultipleChoiceFilter(
choices=WirelessLANStatusChoices,
distinct=False,
choices=WirelessLANStatusChoices
)
vlan_id = django_filters.ModelMultipleChoiceFilter(
queryset=VLAN.objects.all(),
distinct=False,
queryset=VLAN.objects.all()
)
interface_id = django_filters.ModelMultipleChoiceFilter(
queryset=Interface.objects.all(),
field_name='interfaces'
)
auth_type = django_filters.MultipleChoiceFilter(
choices=WirelessAuthTypeChoices,
distinct=False,
choices=WirelessAuthTypeChoices
)
auth_cipher = django_filters.MultipleChoiceFilter(
choices=WirelessAuthCipherChoices,
distinct=False,
choices=WirelessAuthCipherChoices
)
class Meta:
@@ -99,24 +93,19 @@ class WirelessLANFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilter
@register_filterset
class WirelessLinkFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
interface_a_id = django_filters.ModelMultipleChoiceFilter(
queryset=Interface.objects.all(),
distinct=False,
queryset=Interface.objects.all()
)
interface_b_id = django_filters.ModelMultipleChoiceFilter(
queryset=Interface.objects.all(),
distinct=False,
queryset=Interface.objects.all()
)
status = django_filters.MultipleChoiceFilter(
choices=LinkStatusChoices,
distinct=False,
choices=LinkStatusChoices
)
auth_type = django_filters.MultipleChoiceFilter(
choices=WirelessAuthTypeChoices,
distinct=False,
choices=WirelessAuthTypeChoices
)
auth_cipher = django_filters.MultipleChoiceFilter(
choices=WirelessAuthCipherChoices,
distinct=False,
choices=WirelessAuthCipherChoices
)
class Meta: