Skip to content

Commit 91a690f

Browse files
authored
add filter by locations (#63)
* frontend for locations * locations filter backend
1 parent 5f498f9 commit 91a690f

File tree

4 files changed

+81
-12
lines changed

4 files changed

+81
-12
lines changed

netbox_topology_views/api/views.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class SearchViewSet(ReadOnlyModelViewSet):
7878
queryset = Device.objects.all()
7979
serializer_class = TopologyDummySerializer
8080

81-
def _filter(self, site, role, name, tags, region):
81+
def _filter(self, site, role, name, tags, region, location):
8282
filter_devices = Device.objects.all()
8383
if name is not None:
8484
filter_devices = filter_devices.filter(name__contains=name)
@@ -90,6 +90,8 @@ def _filter(self, site, role, name, tags, region):
9090
filter_devices = filter_devices.filter(tags__id__in=tags)
9191
if region is not None:
9292
filter_devices = filter_devices.filter(site__region__id__in=region)
93+
if location is not None:
94+
filter_devices = filter_devices.filter(location__id__in=location)
9395
return filter_devices
9496

9597

@@ -115,14 +117,15 @@ def search(self, request):
115117
if regions == []:
116118
regions = None
117119

120+
locations = request.query_params.getlist('locations[]', None)
121+
if locations == []:
122+
locations = None
123+
118124
hide_unconnected = request.query_params.get('hide_unconnected', None)
119125
if hide_unconnected == "":
120126
hide_unconnected = None
121-
print(hide_unconnected)
122-
if hide_unconnected == 'false':
123-
print("ok")
124127

125-
devices = self._filter(sites, devicerole, name, tags, regions)
128+
devices = self._filter(sites, devicerole, name, tags, regions, locations)
126129

127130
nodes = []
128131
edges = []

netbox_topology_views/static/netbox_topology_views/js/app.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

netbox_topology_views/static_dev/js/home.js

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ var options = {
3333
}
3434
};
3535
var selected_regions = [];
36+
var selected_sites = [];
3637

3738
function iniPlotboxIndex() {
3839
document.addEventListener('DOMContentLoaded', function () {
@@ -113,6 +114,25 @@ function startLoadSearchBar() {
113114
}
114115
}
115116
});
117+
118+
$('#sites').on('select2:select', function (e) {
119+
var data = e.params.data;
120+
var index = selected_sites.indexOf(data.id.toString());
121+
if (index == -1) {
122+
selected_sites.push(data.id.toString());
123+
}
124+
});
125+
$('#sites').on('select2:unselect', function (e) {
126+
var data = e.params.data;
127+
var index = selected_sites.indexOf(data.id.toString());
128+
if (index > -1) {
129+
selected_sites.splice(index, 1);
130+
}
131+
});
132+
$('#sites').on('select2:clear', function (e) {
133+
selected_sites = [];
134+
});
135+
116136
$('#tags').select2({
117137
allowClear: true,
118138
placeholder: "---------",
@@ -178,7 +198,6 @@ function startLoadSearchBar() {
178198
$('#regions').on('select2:unselect', function (e) {
179199
var data = e.params.data;
180200
var index = selected_regions.indexOf(data.id.toString());
181-
console.log(index);
182201
if (index > -1) {
183202
selected_regions.splice(index, 1);
184203
}
@@ -187,6 +206,47 @@ function startLoadSearchBar() {
187206
selected_regions = [];
188207
});
189208

209+
$('#locations').select2({
210+
allowClear: true,
211+
placeholder: "---------",
212+
theme: "bootstrap",
213+
multiple: true,
214+
ajax: {
215+
url: function (params) {
216+
var base_url = "../../api/dcim/locations/?brief=true";
217+
if (selected_sites.length == 0) {
218+
return base_url;
219+
}
220+
else {
221+
for (var i = 0; i < selected_sites.length; i++) {
222+
var tmp = "&site_id=" + selected_sites[i];
223+
base_url = base_url + tmp;
224+
}
225+
return base_url;
226+
}
227+
228+
},
229+
dataType: "json",
230+
type: "GET",
231+
data: function (params) {
232+
var queryParameters = {
233+
q: params.term
234+
}
235+
return queryParameters;
236+
},
237+
processResults: function (data) {
238+
return {
239+
results: $.map(data.results, function (item) {
240+
return {
241+
text: item.name,
242+
id: item.id
243+
}
244+
})
245+
};
246+
}
247+
}
248+
});
249+
190250

191251
var deviceRolesSelect = $('#device-roles');
192252
$.ajax({
@@ -233,6 +293,7 @@ function handleButtonPress() {
233293
var value4 = $("#tags").val();
234294
var value5 = $("#regions").val();
235295
var value6 = $('#checkHideUnconnected').is(":checked");
296+
var value7 = $("#locations").val();
236297
$.ajax({
237298
type: "GET",
238299
url: "../../api/plugins/topology-views/search/search/",
@@ -242,7 +303,8 @@ function handleButtonPress() {
242303
'sites[]': value3,
243304
'tags[]': value4,
244305
'regions[]': value5,
245-
'hide_unconnected': value6
306+
'hide_unconnected': value6,
307+
'locations[]': value7
246308
},
247309
headers: { "X-CSRFToken": csrftoken },
248310
contentType: "application/json; charset=utf-8",

netbox_topology_views/templates/netbox_topology_views/index.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,24 @@
4141
<div class="form-group">
4242
<label for="device-roles">Device roles</label>
4343
<select class="form-control" multiple="multiple" id="device-roles"></select>
44+
</div>
45+
<div class="form-group">
46+
<label for="regions">Regions</label>
47+
<select class="form-control" multiple="multiple" id="regions"></select>
4448
</div>
4549
<div class="form-group">
4650
<label for="sites">Sites</label>
4751
<select class="form-control" multiple="multiple" id="sites"></select>
4852
</div>
4953
<div class="form-group">
54+
<label for="locations">Locations</label>
55+
<select class="form-control" multiple="multiple" id="locations"></select>
56+
</div>
57+
<div class="form-group">
5058
<label for="tags">Tags</label>
5159
<select class="form-control" multiple="multiple" id="tags"></select>
5260
</div>
5361
<div class="form-group">
54-
<label for="regions">Regions</label>
55-
<select class="form-control" multiple="multiple" id="regions"></select>
56-
</div>
57-
<div class="form-group">
5862
<div class="custom-control custom-checkbox">
5963
<input type="checkbox" class="custom-control-input" id="checkHideUnconnected">
6064
<label class="custom-control-label" for="checkHideUnconnected">Hide Unconnected</label>

0 commit comments

Comments
 (0)