Skip to content

ProjectMergeRequest.save() discards _optional_get_attrs #2007

Open
@FirefighterBlu3

Description

@FirefighterBlu3

Description of the problem, including code/CLI snippet

When we request the MR object we can specify extra attributes to be returned to us. Once instantiated if we update part of the object and .save() it, our object loses these attributes.

Expected Behavior

The optional key:value in the MR attribute data should be retained

Actual Behavior

The keys and values for these particular attributes are lost

Specifications

  • python-gitlab version:
    • 3.4.0
  • API version you are using (v3/v4):
    • v4
  • Gitlab server version (or gitlab.com):
    • 13.12.10-ee

Here is a patch to retain these attributes across the .save() method. I'm working on a PR for this but tox is blowing up.

diff --git a/gitlab/mixins.py b/gitlab/mixins.py
index 1a3ff4d..1af1b2e 100644
--- a/gitlab/mixins.py
+++ b/gitlab/mixins.py
@@ -548,11 +548,29 @@ class SaveMixin(_RestObjectBase):
         if not updated_data:
             return None
 
+        # we need to save these attribute values across the .save() method
+        # or they'll be lost. the user didn't ask us to reload the MR object
+        # so be minimal in our actions
+        save_across_update = {}
+        for attr in self.manager._optional_get_attrs:
+            find_attr = attr
+            if find_attr.startswith("include_"):
+                find_attr = find_attr[8:]
+            if find_attr in self._attrs:
+                save_across_update[find_attr] = self._attrs[find_attr]
+
         # call the manager
         obj_id = self.encoded_id
         if TYPE_CHECKING:
             assert isinstance(self.manager, UpdateMixin)
         server_data = self.manager.update(obj_id, updated_data, **kwargs)
+
+        # restore the optional requested attributes lost when we did the .save()
+        # the gitlab REST API doesn't offer a way to request these attributes
+        # during the POST operation thus we can't blindly overwrite our existing
+        # data with the new data
+        server_data.update(save_across_update)
+
         self._update_attrs(server_data)
         return server_data

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions