From 23a9c33b5a14bcd43a2c551fd4c7556d13f28bd3 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 13 Jun 2025 10:53:20 -0700 Subject: [PATCH 1/3] 136 fix branch reversion --- netbox_branching/models/branches.py | 3 +++ netbox_branching/models/changes.py | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/netbox_branching/models/branches.py b/netbox_branching/models/branches.py index 628eff0..e7d634b 100644 --- a/netbox_branching/models/branches.py +++ b/netbox_branching/models/branches.py @@ -453,7 +453,10 @@ def revert(self, user, commit=True): except Exception as e: if err_message := str(e): + import traceback logger.error(err_message) + print(e) + print(traceback.format_exc()) # Disconnect signal receiver & restore original branch status post_save.disconnect(handler, sender=ObjectChange_) Branch.objects.filter(pk=self.pk).update(status=BranchStatusChoices.MERGED) diff --git a/netbox_branching/models/changes.py b/netbox_branching/models/changes.py index 08d3c2c..9fec0aa 100644 --- a/netbox_branching/models/changes.py +++ b/netbox_branching/models/changes.py @@ -81,9 +81,19 @@ def undo(self, using=DEFAULT_DB_ALIAS, logger=None): # Restoring a deleted object elif self.action == ObjectChangeActionChoices.ACTION_DELETE: - instance = deserialize_object(model, self.prechange_data, pk=self.changed_object_id) + deserialized = deserialize_object(model, self.prechange_data_clean, pk=self.changed_object_id) + instance = deserialized.object logger.debug(f'Restoring {model._meta.verbose_name} {instance}') - instance.object.full_clean() + + # Restore GenericForeignKey fields + for field in instance._meta.private_fields: + if isinstance(field, GenericForeignKey): + ct_field = getattr(instance, field.ct_field) + fk_field = getattr(instance, field.fk_field) + if ct_field and fk_field: + setattr(instance, field.name, ct_field.get_object_for_this_type(pk=fk_field)) + + instance.full_clean() instance.save(using=using) undo.alters_data = True From 45802753e850cc531f17be08a79c37ab85b63697 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 13 Jun 2025 10:54:19 -0700 Subject: [PATCH 2/3] 136 fix branch reversion --- netbox_branching/models/branches.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/netbox_branching/models/branches.py b/netbox_branching/models/branches.py index e7d634b..743af77 100644 --- a/netbox_branching/models/branches.py +++ b/netbox_branching/models/branches.py @@ -455,8 +455,6 @@ def revert(self, user, commit=True): if err_message := str(e): import traceback logger.error(err_message) - print(e) - print(traceback.format_exc()) # Disconnect signal receiver & restore original branch status post_save.disconnect(handler, sender=ObjectChange_) Branch.objects.filter(pk=self.pk).update(status=BranchStatusChoices.MERGED) From 292c242ffcfd3d48d44120e5f13938e800378363 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 13 Jun 2025 11:13:46 -0700 Subject: [PATCH 3/3] 136 fix branch reversion --- netbox_branching/models/branches.py | 1 - netbox_branching/models/changes.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/netbox_branching/models/branches.py b/netbox_branching/models/branches.py index 743af77..628eff0 100644 --- a/netbox_branching/models/branches.py +++ b/netbox_branching/models/branches.py @@ -453,7 +453,6 @@ def revert(self, user, commit=True): except Exception as e: if err_message := str(e): - import traceback logger.error(err_message) # Disconnect signal receiver & restore original branch status post_save.disconnect(handler, sender=ObjectChange_) diff --git a/netbox_branching/models/changes.py b/netbox_branching/models/changes.py index 9fec0aa..f22a9c6 100644 --- a/netbox_branching/models/changes.py +++ b/netbox_branching/models/changes.py @@ -84,7 +84,7 @@ def undo(self, using=DEFAULT_DB_ALIAS, logger=None): deserialized = deserialize_object(model, self.prechange_data_clean, pk=self.changed_object_id) instance = deserialized.object logger.debug(f'Restoring {model._meta.verbose_name} {instance}') - + # Restore GenericForeignKey fields for field in instance._meta.private_fields: if isinstance(field, GenericForeignKey): @@ -92,7 +92,7 @@ def undo(self, using=DEFAULT_DB_ALIAS, logger=None): fk_field = getattr(instance, field.fk_field) if ct_field and fk_field: setattr(instance, field.name, ct_field.get_object_for_this_type(pk=fk_field)) - + instance.full_clean() instance.save(using=using)