Skip to content

Commit

Permalink
[fix] Avoid logging error for Device without DeviceConnection #249
Browse files Browse the repository at this point in the history
Don't log error on device change page if the device does not
have any DeviceConnection objects.

Closes #249
  • Loading branch information
pandafy authored Apr 30, 2024
1 parent 5a104a8 commit 4f579ec
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 4 deletions.
10 changes: 8 additions & 2 deletions openwisp_firmware_upgrader/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
Category = load_model('Category')
Build = load_model('Build')
Device = swapper.load_model('config', 'Device')
DeviceConnection = swapper.load_model('connection', 'DeviceConnection')


class BaseAdmin(MultitenantAdminMixin, TimeReadonlyAdminMixin, admin.ModelAdmin):
Expand Down Expand Up @@ -422,8 +423,13 @@ def _get_conditional_queryset(self, request, obj, select_related=False):
def get_formset(self, request, obj=None, **kwargs):
formset = super().get_formset(request, obj=obj, **kwargs)
if obj:
schema = get_upgrader_schema_for_device(obj)
formset.extra_context = json.dumps(schema, cls=DjangoJSONEncoder)
try:
schema = get_upgrader_schema_for_device(obj)
formset.extra_context = json.dumps(schema, cls=DjangoJSONEncoder)
except DeviceConnection.DoesNotExist:
# We cannot retrieve the schema for upgrade options because this
# device does not have any related DeviceConnection object.
pass
return formset


Expand Down
2 changes: 1 addition & 1 deletion openwisp_firmware_upgrader/base/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ def clean(self):
_(
'This device does not have a related connection object defined '
'yet and therefore it would not be possible to upgrade it, '
'please add one in the section named "DEVICE CONNECTIONS"'
'please add one in the section named "Credentials"'
)
)
if self.device.model not in self.image.boards:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{% include "admin/edit_inline/stacked.html" %}

<script>
var firmwareUpgraderSchema = {{ inline_admin_formset.formset.extra_context | safe }}
var firmwareUpgraderSchema = {{ inline_admin_formset.formset.extra_context | default:"null" | safe }}
</script>
22 changes: 22 additions & 0 deletions openwisp_firmware_upgrader/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
admin,
)
from openwisp_users.tests.utils import TestMultitenantAdminMixin
from openwisp_utils.tests import capture_stderr

from ..hardware import REVERSE_FIRMWARE_IMAGE_MAP
from ..swapper import load_model
Expand Down Expand Up @@ -319,6 +320,27 @@ def test_save_device_with_deleted_devicefirmware(self):
)
self.assertEqual(response.status_code, 200)

@capture_stderr()
@mock.patch(
'openwisp_firmware_upgrader.utils.get_upgrader_class_from_device_connection'
)
def test_device_firmware_upgrade_without_device_connection(
self, captured_stderr, mocked_func, *args
):
self._login()
device_fw = self._create_device_firmware()
device = device_fw.device
device.deviceconnection_set.all().delete()
response = self.client.get(
reverse('admin:config_device_change', args=[device.id])
)
self.assertNotIn(
'\'NoneType\' object has no attribute \'update_strategy\'',
captured_stderr.getvalue(),
)
mocked_func.assert_not_called()
self.assertEqual(response.status_code, 200)


_mock_updrade = 'openwisp_firmware_upgrader.upgraders.openwrt.OpenWrt.upgrade'
_mock_connect = 'openwisp_controller.connection.models.DeviceConnection.connect'
Expand Down
2 changes: 2 additions & 0 deletions openwisp_firmware_upgrader/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ def get_upgrader_class_for_device(device):
update_strategy__icontains='ssh',
enabled=True,
).first()
if not device_conn:
raise device.deviceconnection_set.model.DoesNotExist
return get_upgrader_class_from_device_connection(device_conn)


Expand Down

0 comments on commit 4f579ec

Please sign in to comment.