Skip to content

Commit 86996bf

Browse files
committed
[feature] Add support for inherited variables in DeviceDetialView #818
Expose inherited variables (from templates, groups, and global) in API response via optional query param. Fixes #818
1 parent ee8d2fe commit 86996bf

3 files changed

Lines changed: 40 additions & 0 deletions

File tree

openwisp_controller/config/api/serializers.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,18 @@ def update(self, instance, validated_data):
326326
)
327327
return super().update(instance, validated_data)
328328

329+
def get_inherited_variables(self, device):
330+
return {
331+
'global': getattr(app_settings, 'CONTEXT', {}),
332+
'group': DeviceGroupSerializer(device.group, context=self.context).data,
333+
'config': DeviceDetailConfigSerializer(
334+
device.config, context=self.context
335+
).data,
336+
'templates': TemplateSerializer(
337+
device.config.templates, many=True, context=self.context
338+
).data,
339+
}
340+
329341

330342
class FilterGroupTemplates(FilterTemplatesByOrganization):
331343
def get_queryset(self):

openwisp_controller/config/api/views.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,14 @@ def perform_destroy(self, instance):
111111
force_deletion = self.request.query_params.get('force', None) == 'true'
112112
instance.delete(check_deactivated=(not force_deletion))
113113

114+
def retrieve(self, request, *args, **kwargs):
115+
device = self.get_object()
116+
serializer = self.get_serializer(device)
117+
data = serializer.data
118+
if request.query_params.get('inherited_variables') == 'True':
119+
data['inherited_variables'] = serializer.get_inherited_variables(device)
120+
return Response(data)
121+
114122
def get_object(self):
115123
"""Set device property for serializer context."""
116124
obj = super().get_object()

openwisp_controller/config/tests/test_api.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,26 @@ def test_device_detail_config_api(self):
387387
self.assertEqual(r.status_code, 200)
388388
self.assertNotEqual(r.data['config'], None)
389389

390+
def test_device_detail_api_with_inherited_variables(self):
391+
org = self._get_org()
392+
device_group = self._create_device_group(organization=org)
393+
device = self._create_device(organization=org, group=device_group)
394+
config = self._create_config(device=device)
395+
template = self._create_template(organization=org)
396+
config.templates.add(template)
397+
path = reverse('config_api:device_detail', args=[device.pk])
398+
r = self.client.get(f'{path}?inherited_variables=True')
399+
self.assertEqual(r.status_code, 200)
400+
self.assertIn('inherited_variables', r.data)
401+
self.assertEqual(r.data['inherited_variables']['global'], app_settings.CONTEXT)
402+
self.assertEqual(
403+
r.data['inherited_variables']['group']['id'], str(device_group.pk)
404+
)
405+
self.assertEqual(r.data['inherited_variables']['config']['status'], 'modified')
406+
self.assertEqual(
407+
r.data['inherited_variables']['templates'][0]['id'], str(template.pk)
408+
)
409+
390410
def test_device_put_api(self):
391411
d1 = self._create_device(name='test-device')
392412
self._create_config(device=d1)

0 commit comments

Comments
 (0)