Skip to content

Commit 0d17acd

Browse files
authored
[fix] Corrected initial field value assignment in AbstractDevice class
Fixed incorrect initialization of `_initial_<field>` values when a Device instance is loaded with deferred fields, which could break change detection logic. [backport 1.2]
1 parent b73e83a commit 0d17acd

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

openwisp_controller/config/base/device.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,9 @@ def _get_initial_values_for_checked_fields(self):
338338
if not present_values:
339339
return
340340
self.refresh_from_db(fields=present_values.keys())
341-
for field in self._changed_checked_fields:
342-
setattr(self, f"_initial_{field}", field)
343-
setattr(self, field, present_values[field])
341+
for field, value in present_values.items():
342+
setattr(self, f"_initial_{field}", getattr(self, field))
343+
setattr(self, field, value)
344344

345345
def _check_name_changed(self):
346346
if self._initial_name == models.DEFERRED:

openwisp_controller/config/tests/test_device.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,20 @@ def test_changed_checked_fields_no_duplicates(self):
541541
device.__init__()
542542
self.assertEqual(device._changed_checked_fields.count("last_ip"), 1)
543543

544+
def test_deferred_fields_populated_correctly(self):
545+
device = self._create_device(
546+
name="deferred-test",
547+
management_ip="10.0.0.1",
548+
)
549+
# Load the instance with deferred fields omitted
550+
device = Device.objects.only("id").get(pk=device.pk)
551+
device.management_ip = "10.0.0.55"
552+
# Saving the device object will populate the deferred fields
553+
device.save()
554+
# Ensure `_initial_<field>` contains the actual value, not the field name
555+
self.assertEqual(getattr(device, "_initial_management_ip"), "10.0.0.55")
556+
self.assertNotEqual(getattr(device, "_initial_management_ip"), "management_ip")
557+
544558
def test_exceed_organization_device_limit(self):
545559
org = self._get_org()
546560
org.config_limits.device_limit = 1

0 commit comments

Comments
 (0)