Skip to content

Commit f253c01

Browse files
authored
Merge pull request #3647 from Uninett/feat/3149-support-description-in-search
Support search by description in search providers
2 parents f7e0c84 + 22325bc commit f253c01

File tree

4 files changed

+83
-8
lines changed

4 files changed

+83
-8
lines changed

changelog.d/3149.changed.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add support for searching by description in main info search

python/nav/web/info/netboxgroup/views.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,11 @@ def index(request):
6666
query = request.GET['query']
6767
id_filter = Q(pk__icontains=query)
6868
netbox_filter = Q(netboxes__sysname__icontains=query)
69+
description_filter = Q(description__icontains=query)
6970
groups = (
70-
NetboxGroup.objects.filter(id_filter | netbox_filter)
71+
NetboxGroup.objects.filter(
72+
id_filter | netbox_filter | description_filter
73+
)
7174
.distinct()
7275
.order_by('id')
7376
)

python/nav/web/info/searchproviders.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ class RoomSearchProvider(SearchProvider):
8484
link = 'Roomid'
8585

8686
def fetch_results(self):
87-
results = Room.objects.filter(id__icontains=self.query).order_by("id")
87+
results = Room.objects.filter(
88+
Q(id__icontains=self.query) | Q(description__icontains=self.query)
89+
).order_by("id")
8890
for result in results:
8991
self.results.append(
9092
SearchResult(reverse('room-info', kwargs={'roomid': result.id}), result)
@@ -99,7 +101,9 @@ class LocationSearchProvider(SearchProvider):
99101
link = 'Locationid'
100102

101103
def fetch_results(self):
102-
results = Location.objects.filter(id__icontains=self.query).order_by("id")
104+
results = Location.objects.filter(
105+
Q(id__icontains=self.query) | Q(description__icontains=self.query)
106+
).order_by("id")
103107
for result in results:
104108
self.results.append(
105109
SearchResult(
@@ -211,6 +215,7 @@ def fetch_results(self):
211215
Q(vlan__contains=self.query)
212216
| Q(net_ident__icontains=self.query)
213217
| Q(net_type__description__icontains=self.query)
218+
| Q(description__icontains=self.query)
214219
)
215220
.order_by('vlan')
216221
)
@@ -273,9 +278,11 @@ class DevicegroupSearchProvider(SearchProvider):
273278
link = 'Device Group'
274279

275280
def fetch_results(self):
276-
self.results = [
277-
SearchResult(g.get_absolute_url(), g)
278-
for g in NetboxGroup.objects.filter(id__icontains=self.query)
281+
query_result = (
282+
NetboxGroup.objects.filter(
283+
Q(id__icontains=self.query) | Q(description__icontains=self.query)
284+
)
279285
.order_by('id')
280286
.annotate(num_netboxes=Count('netboxes'))
281-
]
287+
)
288+
self.results = [SearchResult(g.get_absolute_url(), g) for g in query_result]

tests/integration/web/info/search_test.py

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
# -*- coding: utf-8 -*-
2+
from django.db import models
23
from django.urls import reverse
34

4-
from nav.models.manage import Interface
5+
from nav.models.manage import Interface, Location, NetType, Room, Vlan, NetboxGroup
6+
from nav.web.info.forms import SearchForm
7+
from nav.web.info.views import process_form
58

69

710
def test_search_for_ip_devices_should_not_crash(client):
@@ -40,6 +43,67 @@ def test_search_for_device_groups_should_not_crash(client):
4043
assert response.status_code == 200
4144

4245

46+
class TestProcessFormDescriptionSearch:
47+
"""Tests for process_form view searching by description."""
48+
49+
def test_location_search_by_description_should_return_results(self, db):
50+
location = Location.objects.create(
51+
id="testlocation", description="test location description"
52+
)
53+
54+
self.assert_search_provider_result(
55+
instance=location,
56+
provider_name='Locations',
57+
)
58+
59+
def test_room_search_by_description_should_return_results(self, db):
60+
room = Room.objects.create(
61+
id="testroom", description="test room description", location_id="mylocation"
62+
)
63+
64+
self.assert_search_provider_result(
65+
instance=room,
66+
provider_name='Rooms',
67+
)
68+
69+
def test_vlan_search_by_description_should_return_results(self, db):
70+
nettype = NetType.objects.create(description="testdescription")
71+
vlan = Vlan.objects.create(
72+
vlan="20", description="test vlan description", net_type=nettype
73+
)
74+
self.assert_search_provider_result(
75+
instance=vlan,
76+
provider_name='Vlans',
77+
)
78+
79+
def test_devicegroup_search_by_description_should_return_results(
80+
self, db, localhost
81+
):
82+
device_group = NetboxGroup.objects.create(
83+
id='test-group-001', description='Core network switches group'
84+
)
85+
self.assert_search_provider_result(
86+
instance=device_group,
87+
provider_name='Device groups',
88+
)
89+
90+
@staticmethod
91+
def assert_search_provider_result(instance: models.Model, provider_name: str):
92+
"""
93+
Helper method to assert that a search by description returns
94+
the expected instance.
95+
"""
96+
97+
form = SearchForm({'query': instance.description}, auto_id=False)
98+
form.is_valid()
99+
providers, _ = process_form(form)
100+
101+
provider = next((p for p in providers if p.name == provider_name), None)
102+
assert provider is not None
103+
assert len(provider.results) == 1
104+
assert provider.results[0].inst.id == instance.id
105+
106+
43107
class TestIndexSearchPreviewView:
44108
"""Tests for the search preview feature."""
45109

0 commit comments

Comments
 (0)