Skip to content

Commit 8bb7ebb

Browse files
authored
[WEB-5285] feat: enhance ChangeTrackerMixin to capture changed fields on save (#8270)
- Added an override for the save method in ChangeTrackerMixin to store changed fields before resetting tracking. - Implemented a new method, _reset_tracked_fields, to ensure subsequent saves detect changes relative to the last saved state. - Updated IssueComment to utilize _changes_on_save for determining changed fields, improving accuracy in tracking modifications.
1 parent 079a624 commit 8bb7ebb

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

apps/api/plane/db/mixins.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,3 +188,30 @@ def old_values(self) -> dict[str, Any]:
188188
all non-deferred fields).
189189
"""
190190
return self._original_values
191+
192+
def save(self, *args: Any, **kwargs: Any) -> None:
193+
"""
194+
Override save to automatically capture changed fields and reset tracking.
195+
196+
Before saving, the current changed_fields are captured and stored in
197+
_changes_on_save. After saving, the tracked fields are reset so
198+
that subsequent saves correctly detect changes relative to the last
199+
saved state, not the original load-time state.
200+
201+
Models that need to access the changed fields after save (e.g., for
202+
syncing related models) can use self._changes_on_save.
203+
"""
204+
self._changes_on_save = self.changed_fields
205+
super().save(*args, **kwargs)
206+
self._reset_tracked_fields()
207+
208+
def _reset_tracked_fields(self) -> None:
209+
"""
210+
Reset the tracked field values to the current state.
211+
212+
This is called automatically after save() to ensure that subsequent
213+
saves correctly detect changes relative to the last saved state,
214+
rather than the original load-time state.
215+
"""
216+
self._original_values = {}
217+
self._track_fields()

apps/api/plane/db/models/issue.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,10 +513,12 @@ def save(self, *args, **kwargs):
513513
"comment_json": "description_json",
514514
}
515515

516+
# Use _changes_on_save which is captured by ChangeTrackerMixin.save()
517+
# before the tracked fields are reset
516518
changed_fields = {
517519
desc_field: getattr(self, comment_field)
518520
for comment_field, desc_field in field_mapping.items()
519-
if self.has_changed(comment_field)
521+
if comment_field in self._changes_on_save
520522
}
521523

522524
# Update description only if comment fields changed

0 commit comments

Comments
 (0)