Skip to content

Commit 0c06725

Browse files
Merge pull request #14633 from netbox-community/develop
Release v3.6.9
2 parents 46b933a + 199685d commit 0c06725

File tree

23 files changed

+1532
-310
lines changed

23 files changed

+1532
-310
lines changed

.github/ISSUE_TEMPLATE/bug_report.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ body:
2323
attributes:
2424
label: NetBox Version
2525
description: What version of NetBox are you currently running?
26-
placeholder: v3.6.8
26+
placeholder: v3.6.9
2727
validations:
2828
required: true
2929
- type: dropdown

.github/ISSUE_TEMPLATE/feature_request.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ body:
1414
attributes:
1515
label: NetBox version
1616
description: What version of NetBox are you currently running?
17-
placeholder: v3.6.8
17+
placeholder: v3.6.9
1818
validations:
1919
required: true
2020
- type: dropdown

docs/release-notes/version-3.6.md

+14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
# NetBox v3.6
22

3+
## v3.6.9 (2023-12-28)
4+
5+
### Enhancements
6+
7+
* [#14631](https://github.com/netbox-community/netbox/issues/14631) - All models can be filtered and searched by their description field (where applicable)
8+
9+
### Bug Fixes
10+
11+
* [#14482](https://github.com/netbox-community/netbox/issues/14482) - Fix validation error when attempting to move a primary IP address to a new parent object
12+
* [#14620](https://github.com/netbox-community/netbox/issues/14620) - Permit setting device type U height to 0 during bulk edit
13+
* [#14621](https://github.com/netbox-community/netbox/issues/14621) - Fix error when using the device search filter
14+
15+
---
16+
317
## v3.6.8 (2023-12-27)
418

519
### Enhancements

netbox/circuits/filtersets.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,14 @@ class ProviderFilterSet(NetBoxModelFilterSet, ContactModelFilterSet):
6767

6868
class Meta:
6969
model = Provider
70-
fields = ['id', 'name', 'slug']
70+
fields = ['id', 'name', 'slug', 'description']
7171

7272
def search(self, queryset, name, value):
7373
if not value.strip():
7474
return queryset
7575
return queryset.filter(
7676
Q(name__icontains=value) |
77+
Q(description__icontains=value) |
7778
Q(accounts__account__icontains=value) |
7879
Q(accounts__name__icontains=value) |
7980
Q(comments__icontains=value)
@@ -101,6 +102,7 @@ def search(self, queryset, name, value):
101102
return queryset
102103
return queryset.filter(
103104
Q(name__icontains=value) |
105+
Q(description__icontains=value) |
104106
Q(account__icontains=value) |
105107
Q(comments__icontains=value)
106108
).distinct()

netbox/circuits/tests/test_filtersets.py

+30-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def setUpTestData(cls):
2525
ASN.objects.bulk_create(asns)
2626

2727
providers = (
28-
Provider(name='Provider 1', slug='provider-1'),
29-
Provider(name='Provider 2', slug='provider-2'),
28+
Provider(name='Provider 1', slug='provider-1', description='foobar1'),
29+
Provider(name='Provider 2', slug='provider-2', description='foobar2'),
3030
Provider(name='Provider 3', slug='provider-3'),
3131
Provider(name='Provider 4', slug='provider-4'),
3232
Provider(name='Provider 5', slug='provider-5'),
@@ -74,6 +74,10 @@ def setUpTestData(cls):
7474
CircuitTermination(circuit=circuits[1], site=sites[0], term_side='A'),
7575
))
7676

77+
def test_q(self):
78+
params = {'q': 'foobar1'}
79+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
80+
7781
def test_name(self):
7882
params = {'name': ['Provider 1', 'Provider 2']}
7983
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@@ -82,6 +86,10 @@ def test_slug(self):
8286
params = {'slug': ['provider-1', 'provider-2']}
8387
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
8488

89+
def test_description(self):
90+
params = {'description': ['foobar1', 'foobar2']}
91+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
92+
8593
def test_asn_id(self): # ASN object assignment
8694
asns = ASN.objects.all()[:2]
8795
params = {'asn_id': [asns[0].pk, asns[1].pk]}
@@ -122,6 +130,10 @@ def setUpTestData(cls):
122130
CircuitType(name='Circuit Type 3', slug='circuit-type-3'),
123131
))
124132

133+
def test_q(self):
134+
params = {'q': 'foobar1'}
135+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
136+
125137
def test_name(self):
126138
params = {'name': ['Circuit Type 1']}
127139
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
@@ -227,6 +239,10 @@ def setUpTestData(cls):
227239
))
228240
CircuitTermination.objects.bulk_create(circuit_terminations)
229241

242+
def test_q(self):
243+
params = {'q': 'foobar1'}
244+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
245+
230246
def test_cid(self):
231247
params = {'cid': ['Test Circuit 1', 'Test Circuit 2']}
232248
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@@ -369,6 +385,10 @@ def setUpTestData(cls):
369385

370386
Cable(a_terminations=[circuit_terminations[0]], b_terminations=[circuit_terminations[1]]).save()
371387

388+
def test_q(self):
389+
params = {'q': 'foobar1'}
390+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
391+
372392
def test_term_side(self):
373393
params = {'term_side': 'A'}
374394
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7)
@@ -440,6 +460,10 @@ def setUpTestData(cls):
440460
)
441461
ProviderNetwork.objects.bulk_create(provider_networks)
442462

463+
def test_q(self):
464+
params = {'q': 'foobar1'}
465+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
466+
443467
def test_name(self):
444468
params = {'name': ['Provider Network 1', 'Provider Network 2']}
445469
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@@ -477,6 +501,10 @@ def setUpTestData(cls):
477501
)
478502
ProviderAccount.objects.bulk_create(provider_accounts)
479503

504+
def test_q(self):
505+
params = {'q': 'foobar1'}
506+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
507+
480508
def test_name(self):
481509
params = {'name': ['Provider Account 1', 'Provider Account 2']}
482510
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)

netbox/core/filtersets.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class DataSourceFilterSet(NetBoxModelFilterSet):
2626

2727
class Meta:
2828
model = DataSource
29-
fields = ('id', 'name', 'enabled')
29+
fields = ('id', 'name', 'enabled', 'description')
3030

3131
def search(self, queryset, name, value):
3232
if not value.strip():

netbox/core/tests/test_filtersets.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,16 @@ def setUpTestData(cls):
2121
type=DataSourceTypeChoices.LOCAL,
2222
source_url='file:///var/tmp/source1/',
2323
status=DataSourceStatusChoices.NEW,
24-
enabled=True
24+
enabled=True,
25+
description='foobar1'
2526
),
2627
DataSource(
2728
name='Data Source 2',
2829
type=DataSourceTypeChoices.LOCAL,
2930
source_url='file:///var/tmp/source2/',
3031
status=DataSourceStatusChoices.SYNCING,
31-
enabled=True
32+
enabled=True,
33+
description='foobar2'
3234
),
3335
DataSource(
3436
name='Data Source 3',
@@ -40,10 +42,18 @@ def setUpTestData(cls):
4042
)
4143
DataSource.objects.bulk_create(data_sources)
4244

45+
def test_q(self):
46+
params = {'q': 'foobar1'}
47+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
48+
4349
def test_name(self):
4450
params = {'name': ['Data Source 1', 'Data Source 2']}
4551
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
4652

53+
def test_description(self):
54+
params = {'description': ['foobar1', 'foobar2']}
55+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
56+
4757
def test_type(self):
4858
params = {'type': [DataSourceTypeChoices.LOCAL]}
4959
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@@ -97,6 +107,10 @@ def setUpTestData(cls):
97107
)
98108
DataFile.objects.bulk_create(data_files)
99109

110+
def test_q(self):
111+
params = {'q': 'file1.txt'}
112+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
113+
100114
def test_source(self):
101115
sources = DataSource.objects.all()
102116
params = {'source_id': [sources[0].pk, sources[1].pk]}

0 commit comments

Comments
 (0)