Skip to content

Commit adaa725

Browse files
committed
[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 7c26901 commit adaa725

2 files changed

Lines changed: 17 additions & 3 deletions

File tree

openwisp_controller/config/base/device.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,9 +325,9 @@ def _get_initial_values_for_checked_fields(self):
325325
if not present_values:
326326
return
327327
self.refresh_from_db(fields=present_values.keys())
328-
for field in self._changed_checked_fields:
329-
setattr(self, f"_initial_{field}", field)
330-
setattr(self, field, present_values[field])
328+
for field, value in present_values.items():
329+
setattr(self, f"_initial_{field}", getattr(self, field))
330+
setattr(self, field, value)
331331

332332
def _check_name_changed(self):
333333
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
@@ -529,6 +529,20 @@ def test_device_field_changed_checks(self):
529529
with self.assertNumQueries(3):
530530
device._check_changed_fields()
531531

532+
def test_deferred_fields_populated_correctly(self):
533+
device = self._create_device(
534+
name="deferred-test",
535+
management_ip="10.0.0.1",
536+
)
537+
# Load the instance with deferred fields omitted
538+
device = Device.objects.only("id").get(pk=device.pk)
539+
device.management_ip = "10.0.0.55"
540+
# Saving the device object will populate the deferred fields
541+
device.save()
542+
# Ensure `_initial_<field>` contains the actual value, not the field name
543+
self.assertEqual(getattr(device, "_initial_management_ip"), "10.0.0.55")
544+
self.assertNotEqual(getattr(device, "_initial_management_ip"), "management_ip")
545+
532546
def test_exceed_organization_device_limit(self):
533547
org = self._get_org()
534548
org.config_limits.device_limit = 1

0 commit comments

Comments
 (0)