From 81d77792d7566f7bb9e78fdd07bd072258bd39d1 Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Wed, 15 Apr 2026 13:35:08 +0200 Subject: [PATCH] Add basic relationship get/create (no modelling as yet) --- dspace_rest_client/client.py | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/dspace_rest_client/client.py b/dspace_rest_client/client.py index 3f8a643..37c39f9 100644 --- a/dspace_rest_client/client.py +++ b/dspace_rest_client/client.py @@ -1625,3 +1625,53 @@ def create_resource_policy(self, resource_policy, parent=None, eperson=None, gro return ResourcePolicy(api_resource=new_policy) else: logging.error("create operation failed: %s: %s (%s)", r.status_code, r.text, url) + + def create_relationship(self, relationship_type, left_uuid, right_uuid, leftward_value=None): + """ + Create a relationship between two items. Requires a valid relationship type. + @param relationship_type: Relationship type ID (integer) + @param left_uuid: UUID of the left-hand item + @param right_uuid: UUID of the right-hand item + @param leftward_value: optional name variant for the leftward relationship + @return: Relationship object constructed from the API response + """ + if left_uuid is None or right_uuid is None: + logging.error("Must provide UUIDs for both left and right items") + return None + + url = f"{self.API_ENDPOINT}/core/relationships" + params = parse_params({"relationshipType": relationship_type}, embeds=None) + if leftward_value is not None: + params["leftwardValue"] = leftward_value + uri_list = f"{left_uuid}\n{right_uuid}" + res = parse_json( + self.api_post_uri(url, params={"relationshipType": relationship_type, "leftwardValue": leftward_value}, + uri_list=uri_list) + ) + return res + + def get_relationships_for_item(self, item_uuid, relationship_type, relationship_label, related_items): + """ + Get a list of relationships for a given item + @param item_uuid: UUID of the (focus) item + @param relationship_type: relationship type ID (integer) + @param relationship_label: label of the (focus) item's relationship (e.g. isPublicationOfAuthor) + @param related_items: list of UUIDs of the related items + @return: list of Relationship objects + """ + if item_uuid is None: + logging.error("Must provide UUID for item") + return None + if related_items is None or len(related_items) == 0: + logging.error("Must provide a non-empty list of related items") + return None + + url = f"{self.API_ENDPOINT}/core/relationships/search/byItemsAndType" + params = parse_params({ + "typeId": relationship_type, "relationshipLabel": relationship_label, + "focusItem": item_uuid, "relatedItem": related_items}, embeds=None) + #pprint(params) + res = parse_json(self.api_get(url, params=params)) + return res + +