From e8bef80b56c387a6fd346a3aedad31c879ced18b Mon Sep 17 00:00:00 2001 From: Ronald Krist Date: Thu, 14 Mar 2024 16:10:29 +0100 Subject: [PATCH 1/5] onmodel create url in progress --- oarepo_requests/resources/draft/config.py | 2 + oarepo_requests/resources/draft/resource.py | 23 +++- oarepo_requests/resources/oarepo/resource.py | 7 +- oarepo_requests/resources/record/config.py | 7 +- oarepo_requests/resources/record/resource.py | 31 +++++- oarepo_requests/services/draft/service.py | 28 ++++- oarepo_requests/services/record/service.py | 30 ++++- oarepo_requests/services/results.py | 6 +- oarepo_requests/services/schema.py | 16 ++- oarepo_requests/utils.py | 7 ++ tests/test_requests/test_create_inmodel.py | 42 +++++++ .../test_publish_delete_components.py | 104 ------------------ 12 files changed, 179 insertions(+), 124 deletions(-) create mode 100644 tests/test_requests/test_create_inmodel.py delete mode 100644 tests/test_requests/test_publish_delete_components.py diff --git a/oarepo_requests/resources/draft/config.py b/oarepo_requests/resources/draft/config.py index aadf9303..8cca976e 100644 --- a/oarepo_requests/resources/draft/config.py +++ b/oarepo_requests/resources/draft/config.py @@ -1,10 +1,12 @@ from oarepo_requests.resources.record.config import RecordRequestsResourceConfig + class DraftRecordRequestsResourceConfig(RecordRequestsResourceConfig): """""" routes = { **RecordRequestsResourceConfig.routes, "list-drafts": "//draft/requests", + "type-draft": "//draft/requests/" } diff --git a/oarepo_requests/resources/draft/resource.py b/oarepo_requests/resources/draft/resource.py index 66597294..a6a2fa1f 100644 --- a/oarepo_requests/resources/draft/resource.py +++ b/oarepo_requests/resources/draft/resource.py @@ -3,11 +3,12 @@ from invenio_records_resources.resources.records.resource import ( request_extra_args, request_search_args, - request_view_args, + request_view_args, request_data, ) from invenio_records_resources.resources.records.utils import search_preference from oarepo_requests.resources.record.resource import RecordRequestsResource +from oarepo_requests.utils import stringify_first_val class DraftRecordRequestsResource(RecordRequestsResource): @@ -18,6 +19,7 @@ def create_url_rules(self): url_rules = [ route("GET", routes["list-drafts"], self.search_requests_for_draft), + route("POST", routes["type-draft"], self.create_for_draft) ] return url_rules + old_rules @@ -35,3 +37,22 @@ def search_requests_for_draft(self): expand=resource_requestctx.args.get("expand", False), ) return hits.to_dict(), 200 + + @request_extra_args + @request_view_args + @request_data + @response_handler() + def create_for_draft(self): + """Create an item.""" + items = self.service.create_for_draft( + identity=g.identity, + data=resource_requestctx.data, + request_type=resource_requestctx.view_args["request_type"], + receiver=stringify_first_val(resource_requestctx.data.pop("receiver")), + creator=stringify_first_val(resource_requestctx.data.pop("creator", None)), + topic_id=resource_requestctx.view_args["pid_value"], # do in service; put type_id into service config, what about draft/not draft, different url? + expand=resource_requestctx.data.pop("expand", False), #? + ) + + return items.to_dict(), 201 + diff --git a/oarepo_requests/resources/oarepo/resource.py b/oarepo_requests/resources/oarepo/resource.py index 0fa3ac06..6b420da2 100644 --- a/oarepo_requests/resources/oarepo/resource.py +++ b/oarepo_requests/resources/oarepo/resource.py @@ -9,6 +9,8 @@ ) from invenio_requests.resources import RequestsResource +from oarepo_requests.utils import stringify_first_val + class OARepoRequestsResource(RequestsResource, ErrorHandlersMixin): """ @@ -43,11 +45,6 @@ def s(route): @request_data @response_handler() def create(self): - def stringify_first_val(dct): - if isinstance(dct, dict): - for k, v in dct.items(): - dct[k] = str(v) - return dct items = self.service.create( identity=g.identity, diff --git a/oarepo_requests/resources/record/config.py b/oarepo_requests/resources/record/config.py index 319a9658..69a8612f 100644 --- a/oarepo_requests/resources/record/config.py +++ b/oarepo_requests/resources/record/config.py @@ -1,8 +1,11 @@ from invenio_records_resources.resources import RecordResourceConfig +import marshmallow as ma -class RecordRequestsResourceConfig(RecordResourceConfig): - routes = {"list": "//requests"} +class RecordRequestsResourceConfig: + routes = {"list": "//requests", + "type": "//requests/",} + request_view_args = RecordResourceConfig.request_view_args | {"request_type": ma.fields.Str()} """ @property def response_handlers(self): diff --git a/oarepo_requests/resources/record/resource.py b/oarepo_requests/resources/record/resource.py index c054b616..507a5a8e 100644 --- a/oarepo_requests/resources/record/resource.py +++ b/oarepo_requests/resources/record/resource.py @@ -6,13 +6,15 @@ from invenio_records_resources.resources.records.resource import ( request_extra_args, request_search_args, - request_view_args, + request_view_args, request_data, ) from invenio_records_resources.resources.records.utils import search_preference +from oarepo_requests.utils import stringify_first_val + class RecordRequestsResource(RecordResource): - def __init__(self, config, service, record_requests_config): + def __init__(self, record_requests_config, config, service): """ :param config: main record resource config :param service: @@ -20,8 +22,9 @@ def __init__(self, config, service, record_requests_config): """ actual_config = copy.deepcopy(config) actual_config.blueprint_name = f"{config.blueprint_name}_requests" - # possibly do some nontrivial merge - actual_config.routes = record_requests_config.routes + vars_to_overwrite = [x for x in dir(record_requests_config) if not x.startswith("_")] + for var in vars_to_overwrite: + setattr(actual_config, var, getattr(record_requests_config, var)) super().__init__(actual_config, service) def create_url_rules(self): @@ -30,6 +33,7 @@ def create_url_rules(self): url_rules = [ route("GET", routes["list"], self.search_requests_for_record), + route("POST", routes["type"], self.create) ] return url_rules @@ -47,3 +51,22 @@ def search_requests_for_record(self): expand=resource_requestctx.args.get("expand", False), ) return hits.to_dict(), 200 + + + @request_extra_args + @request_view_args + @request_data + @response_handler() + def create(self): + """Create an item.""" + items = self.service.create( + identity=g.identity, + data=resource_requestctx.data, + request_type=resource_requestctx.view_args["request_type"], + receiver=stringify_first_val(resource_requestctx.data.pop("receiver")), + creator=stringify_first_val(resource_requestctx.data.pop("creator", None)), + topic_id=resource_requestctx.view_args["pid_value"], # do in service; put type_id into service config, what about draft/not draft, different url? + expand=resource_requestctx.data.pop("expand", False), #? + ) + + return items.to_dict(), 201 diff --git a/oarepo_requests/services/draft/service.py b/oarepo_requests/services/draft/service.py index 67d3ce14..af65e44d 100644 --- a/oarepo_requests/services/draft/service.py +++ b/oarepo_requests/services/draft/service.py @@ -2,7 +2,7 @@ from oarepo_requests.services.record.service import RecordRequestsService from oarepo_requests.utils import get_type_id_for_record_cls - +from invenio_records_resources.services.uow import unit_of_work class DraftRecordRequestsService(RecordRequestsService): @property @@ -47,3 +47,29 @@ def search_requests_for_draft( extra_filter=search_filter, **kwargs, ) + + + @unit_of_work() + def create_for_draft( + self, + identity, + data, + request_type, + receiver, + creator=None, + topic_id=None, + expires_at=None, + uow=None, + expand=False, + ): + record = self.draft_cls.pid.resolve(topic_id, registered_only=False) + return self.oarepo_requests_service.create( + identity=identity, + data=data, + request_type=request_type, + receiver=receiver, + creator=creator, + topic=record, + expand=expand, + uow=uow, + ) diff --git a/oarepo_requests/services/record/service.py b/oarepo_requests/services/record/service.py index dd74aa69..d5f31b1f 100644 --- a/oarepo_requests/services/record/service.py +++ b/oarepo_requests/services/record/service.py @@ -4,11 +4,14 @@ from oarepo_requests.proxies import current_oarepo_requests from oarepo_requests.utils import get_type_id_for_record_cls +from invenio_records_resources.services.uow import unit_of_work + class RecordRequestsService: - def __init__(self, record_service): + def __init__(self, record_service, oarepo_requests_service): self.record_service = record_service + self.oarepo_requests_service = oarepo_requests_service # so api doesn't fall apart @property @@ -66,3 +69,28 @@ def search_requests_for_record( extra_filter=search_filter, **kwargs, ) + + @unit_of_work() + def create( + self, + identity, + data, + request_type, + receiver, + creator=None, + topic_id=None, + expires_at=None, + uow=None, + expand=False, + ): + record = self.record_cls.pid.resolve(topic_id) + return self.oarepo_requests_service.create( + identity=identity, + data=data, + request_type=request_type, + receiver=receiver, + creator=creator, + topic=record, + expand=expand, + uow=uow, + ) diff --git a/oarepo_requests/services/results.py b/oarepo_requests/services/results.py index b8209b13..46404f6f 100644 --- a/oarepo_requests/services/results.py +++ b/oarepo_requests/services/results.py @@ -27,8 +27,7 @@ def update_data(self, identity, record, projection): ) request_type_link = data request_types_list.append(request_type_link) - if request_types_list: - projection["request_types"] = request_types_list + projection["request_types"] = request_types_list class RequestsComponent: @@ -45,5 +44,4 @@ def update_data(self, identity, record, projection): requests = list(reader(identity, record["id"]).hits) except PermissionDeniedError: requests = [] - if requests: - projection["requests"] = requests + projection["requests"] = requests diff --git a/oarepo_requests/services/schema.py b/oarepo_requests/services/schema.py index 517dd230..9ae64c67 100644 --- a/oarepo_requests/services/schema.py +++ b/oarepo_requests/services/schema.py @@ -7,6 +7,12 @@ from oarepo_requests.proxies import current_oarepo_requests_resource +from invenio_records_resources.services import ConditionalLink, RecordLink +from invenio_drafts_resources.services.records.config import is_record + +from oarepo_requests.utils import get_matching_service_for_record + + def get_links_schema(): # TODO possibly specify more return ma.fields.Dict(keys=ma.fields.String()) @@ -21,9 +27,15 @@ class RequestTypeSchema(ma.Schema): def create_link(self, data, **kwargs): type_id = data["type_id"] type = current_request_type_registry.lookup(type_id, quiet=True) - link = Link(f"{{+api}}{current_oarepo_requests_resource.config.url_prefix}") + record = self.context["record"] + service = get_matching_service_for_record(record) + link = ConditionalLink( + cond=is_record, + if_=Link(f"{{+api}}{service.config.url_prefix}requests/{type_id}"), + else_=Link(f"{{+api}}{service.config.url_prefix}draft/requests/{type_id}"), + ) template = LinksTemplate({"create": link}) - data["links"] = {"actions": template.expand(self.context["identity"], type)} + data["links"] = {"actions": template.expand(self.context["identity"], record)} return data diff --git a/oarepo_requests/utils.py b/oarepo_requests/utils.py index 71a2ae5f..420ee6f6 100644 --- a/oarepo_requests/utils.py +++ b/oarepo_requests/utils.py @@ -134,3 +134,10 @@ def get_type_id_for_record_cls(record_cls): def get_requests_service_for_records_service(records_service): return current_service_registry.get(f"{records_service.config.service_id}_requests") + + +def stringify_first_val(dct): + if isinstance(dct, dict): + for k, v in dct.items(): + dct[k] = str(v) + return dct \ No newline at end of file diff --git a/tests/test_requests/test_create_inmodel.py b/tests/test_requests/test_create_inmodel.py new file mode 100644 index 00000000..38fa52e7 --- /dev/null +++ b/tests/test_requests/test_create_inmodel.py @@ -0,0 +1,42 @@ + +def test_record( + logged_client_post, + record_factory, + identity_simple, + users, + urls, + delete_record_data_function, + search_clear, +): + creator = users[0] + receiver = users[1] + record1 = record_factory() + + ThesisRecord.index.refresh() + + + +def test_draft( + logged_client_post, + identity_simple, + users, + urls, + publish_request_data_function, + search_clear, +): + creator = users[0] + receiver = users[1] + + draft1 = logged_client_post(creator, "post", urls["BASE_URL"], json={}) + draft_id = draft1.json["id"] + + resp_request_create = logged_client_post( + creator, + "post", + f"{urls['BASE_URL']}{draft_id}/draft/requests/thesis_draft_publish_draft", + json={"receiver":{"user": receiver.id}}, + ) + assert resp_request_create.status_code == 201 + assert resp_request_create.json.request_types + print() + diff --git a/tests/test_requests/test_publish_delete_components.py b/tests/test_requests/test_publish_delete_components.py deleted file mode 100644 index 896827d7..00000000 --- a/tests/test_requests/test_publish_delete_components.py +++ /dev/null @@ -1,104 +0,0 @@ -""" -# not needed for now - -def test_workflow( - requests_service, - record_service, - example_topic_draft, - identity_simple, -): - record_id = example_topic_draft["id"] - - resp1 = record_service.read_draft(identity_simple, record_id) - with pytest.raises(PIDUnregistered): - record_service.read(identity_simple, record_id) - - requests_service.execute_action( - identity_simple, resp1._obj.parent.publish_draft.id, "accept" - ) - - with pytest.raises(NoResultFound): - record_service.read_draft(identity_simple, record_id) - resp2 = record_service.read(identity_simple, record_id) - assert resp2._obj.parent.publish_draft is None - - requests_service.execute_action( - identity_simple, resp2._obj.parent.delete_record.id, "submit" - ) - - with pytest.raises(PIDDeletedError): - record_service.read_draft(identity_simple, record_id) - with pytest.raises(PIDDeletedError): - record_service.read(identity_simple, record_id) - - -def test_direct_publish_request_deleted( - requests_service, record_service, example_topic_draft, identity_simple -): - record_id = example_topic_draft["id"] - resp = record_service.publish(identity_simple, record_id) - - assert resp._obj.parent.publish_draft is None - - -def test_parent_dump( - requests_service, record_service, example_topic_draft, identity_simple -): - record_id = example_topic_draft["id"] - - resp1 = record_service.read_draft(identity_simple, record_id) - - assert "parent" in resp1.data - assert "publish_draft" in resp1.data["parent"] - assert "delete_record" not in resp1.data["parent"] - - requests_service.execute_action( - identity_simple, resp1.data["parent"]["publish_draft"]["id"], "submit" - ) - resp2 = record_service.read(identity_simple, record_id) - - assert "parent" in resp2.data - assert "publish_draft" not in resp2.data["parent"] - assert "delete_record" in resp2.data["parent"] - - requests_service.execute_action( - identity_simple, resp2.data["parent"]["delete_record"]["id"], "submit" - ) - - with pytest.raises(PIDDeletedError): - record_service.read_draft(identity_simple, record_id) - with pytest.raises(PIDDeletedError): - record_service.read(identity_simple, record_id) - - -def test_receiver_permissions_user( - request_with_receiver_user, requests_service, identity_creator, identity_receiver -): - request_id = request_with_receiver_user.id - - with pytest.raises(PermissionDeniedError): - receiver_submit = requests_service.execute_action( - identity=identity_receiver, id_=request_id, action="submit" - ) - creator_submit = requests_service.execute_action( - identity=identity_creator, id_=request_id, action="submit" - ) - assert creator_submit.data["status"] == "submitted" - - with pytest.raises(PermissionDeniedError): - creator_accept = requests_service.execute_action( - identity=identity_creator, id_=request_id, action="accept" - ) - receiver_accept = requests_service.execute_action( - identity=identity_receiver, id_=request_id, action="accept" - ) - assert receiver_accept.data["status"] == "accepted" - - -def test_api_create(client_with_credentials, request_data): - headers = {"accept": "application/json", "content-type": "application/json"} - resp = client_with_credentials.post( - "/requests/create", headers=headers, json=request_data - ) - assert resp.status_code == 201 -""" From 46b15f6832bbf7796e681cc4667aa3586a1b0e6f Mon Sep 17 00:00:00 2001 From: Ronald Krist Date: Fri, 15 Mar 2024 10:27:43 +0100 Subject: [PATCH 2/5] create url on model --- oarepo_requests/services/schema.py | 10 +++- setup.cfg | 2 +- tests/conftest.py | 6 +- tests/test_requests/test_create_conditions.py | 4 +- tests/test_requests/test_create_inmodel.py | 59 +++++++++++++++++-- tests/test_ui/test_ui_resource.py | 12 ++-- 6 files changed, 74 insertions(+), 19 deletions(-) diff --git a/oarepo_requests/services/schema.py b/oarepo_requests/services/schema.py index 9ae64c67..4a6172c9 100644 --- a/oarepo_requests/services/schema.py +++ b/oarepo_requests/services/schema.py @@ -25,16 +25,20 @@ class RequestTypeSchema(ma.Schema): @ma.post_dump def create_link(self, data, **kwargs): + if "links" in data: + return data + if 'record' not in self.context: + raise ma.ValidationError("record not in context for request types serialization") type_id = data["type_id"] type = current_request_type_registry.lookup(type_id, quiet=True) record = self.context["record"] service = get_matching_service_for_record(record) link = ConditionalLink( cond=is_record, - if_=Link(f"{{+api}}{service.config.url_prefix}requests/{type_id}"), - else_=Link(f"{{+api}}{service.config.url_prefix}draft/requests/{type_id}"), + if_=Link(f"{{+api}}{service.config.url_prefix}{{id}}/requests/{type_id}"), + else_=Link(f"{{+api}}{service.config.url_prefix}{{id}}/draft/requests/{type_id}"), ) - template = LinksTemplate({"create": link}) + template = LinksTemplate({"create": link}, context={"id": record["id"]}) data["links"] = {"actions": template.expand(self.context["identity"], record)} return data diff --git a/setup.cfg b/setup.cfg index ea3d5609..107e935c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = oarepo-requests -version = 1.1.3 +version = 1.1.4 description = authors = Ronald Krist readme = README.md diff --git a/tests/conftest.py b/tests/conftest.py index 827bb8e7..bd6ea322 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -23,7 +23,7 @@ def publish_request_data_function(): def ret_data(receiver_id, record_id): return { "receiver": {"user": receiver_id}, - "request_type": "thesis_draft_publish_draft", + "request_type": "thesis_publish_draft", "topic": {"thesis_draft": record_id}, } @@ -57,7 +57,7 @@ def _result(topic_id, request_id): "timeline": f"https://127.0.0.1:5000/api/requests/extended/{request_id}/timeline", }, "revision_id": 3, - "type": "thesis_draft_publish_draft", + "type": "thesis_publish_draft", "title": "", "number": "1", "status": "submitted", @@ -114,7 +114,7 @@ def _result(topic_id, request_id): "reference": {"thesis_draft": topic_id}, "type": "thesis_draft", }, - "type": "thesis_draft_publish_draft", + "type": "thesis_publish_draft", # 'updated': '2024-01-26T10:06:18.084317' } diff --git a/tests/test_requests/test_create_conditions.py b/tests/test_requests/test_create_conditions.py index 6a4cbedb..a862b1f1 100644 --- a/tests/test_requests/test_create_conditions.py +++ b/tests/test_requests/test_create_conditions.py @@ -8,7 +8,7 @@ def data(receiver_id, record_id): return { "receiver": {"user": receiver_id}, - "request_type": "thesis_draft_non_duplicable", + "request_type": "thesis_non_duplicable", "topic": {"thesis_draft": record_id}, } @@ -62,7 +62,7 @@ def find_request_type(requests, type): f"{urls['BASE_URL']}{draft1.json['id']}/draft" ) assert find_request_type( - record_resp_no_request.json["request_types"], "thesis_draft_non_duplicable" + record_resp_no_request.json["request_types"], "thesis_non_duplicable" ) assert ( find_request_type(record_resp_request.json["request_types"], "non_duplicable") diff --git a/tests/test_requests/test_create_inmodel.py b/tests/test_requests/test_create_inmodel.py index 38fa52e7..a4afbdab 100644 --- a/tests/test_requests/test_create_inmodel.py +++ b/tests/test_requests/test_create_inmodel.py @@ -1,3 +1,12 @@ +from tests.test_requests.utils import link_api2testclient +from thesis.records.api import ThesisRecord, ThesisDraft + + +def pick_request_type(types_list, queried_type): + for type in types_list: + if type["type_id"] == queried_type: + return type + return None def test_record( logged_client_post, @@ -11,8 +20,36 @@ def test_record( creator = users[0] receiver = users[1] record1 = record_factory() + record1 = logged_client_post( + creator, + "get", + f"{urls['BASE_URL']}{record1['id']}" + ) + link = link_api2testclient(pick_request_type(record1.json['request_types'], "thesis_delete_record")['links']['actions']['create']) + + resp_request_create = logged_client_post( + creator, + "post", + link, + json={"receiver":{"user": receiver.id}}, + ) + assert resp_request_create.status_code == 201 + resp_request_submit = logged_client_post( + creator, + "post", + link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), + ) + + record = logged_client_post(receiver, "get", f"{urls['BASE_URL']}{record1.json['id']}") + delete = logged_client_post( + receiver, + "post", + link_api2testclient(record.json["requests"][0]["links"]["actions"]["accept"]), + ) ThesisRecord.index.refresh() + lst = logged_client_post(creator, "get", urls["BASE_URL"]) + assert len(lst.json["hits"]["hits"]) == 0 @@ -28,15 +65,29 @@ def test_draft( receiver = users[1] draft1 = logged_client_post(creator, "post", urls["BASE_URL"], json={}) - draft_id = draft1.json["id"] + link = link_api2testclient(pick_request_type(draft1.json['request_types'], "thesis_publish_draft")['links']['actions']['create']) + resp_request_create = logged_client_post( creator, "post", - f"{urls['BASE_URL']}{draft_id}/draft/requests/thesis_draft_publish_draft", + link, json={"receiver":{"user": receiver.id}}, ) assert resp_request_create.status_code == 201 - assert resp_request_create.json.request_types - print() + resp_request_submit = logged_client_post( + creator, + "post", + link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), + ) + + record = logged_client_post(receiver, "get", f"{urls['BASE_URL']}{draft1.json['id']}/draft") + delete = logged_client_post( + receiver, + "post", + link_api2testclient(record.json["requests"][0]["links"]["actions"]["accept"]), + ) + ThesisRecord.index.refresh() + lst = logged_client_post(creator, "get", urls["BASE_URL"]) + assert len(lst.json["hits"]["hits"]) == 1 diff --git a/tests/test_ui/test_ui_resource.py b/tests/test_ui/test_ui_resource.py index 431cbac8..d9dfe782 100644 --- a/tests/test_ui/test_ui_resource.py +++ b/tests/test_ui/test_ui_resource.py @@ -14,14 +14,14 @@ def test_draft_publish_request_present( with client_with_login.get(f"/thesis/{example_topic_draft['id']}/edit") as c: assert c.status_code == 200 data = json.loads(c.text) - assert data["creatable_request_types"]["thesis_draft_non_duplicable"] == { + assert data["creatable_request_types"]["thesis_non_duplicable"] == { "description": "", - "links": {"actions": {"create": "https://127.0.0.1:5000/api/requests"}}, + "links": {"actions": {"create": f"https://127.0.0.1:5000/api/thesis/{example_topic_draft['id']}/draft/requests/thesis_non_duplicable"}}, "name": "Non-duplicable", } - assert data["creatable_request_types"]["thesis_draft_publish_draft"] == { + assert data["creatable_request_types"]["thesis_publish_draft"] == { "description": "Request publishing of a draft", - "links": {"actions": {"create": "https://127.0.0.1:5000/api/requests"}}, + "links": {"actions": {"create": f"https://127.0.0.1:5000/api/thesis/{example_topic_draft['id']}/draft/requests/thesis_publish_draft"}}, "name": "Publish-draft", } @@ -44,12 +44,12 @@ def test_record_delete_request_present( assert len(data["creatable_request_types"]) == 2 assert data["creatable_request_types"]["thesis_generic_request"] == { "description": "", - "links": {"actions": {"create": "https://127.0.0.1:5000/api/requests"}}, + "links": {"actions": {"create": f"https://127.0.0.1:5000/api/thesis/{example_topic['id']}/requests/thesis_generic_request"}}, "name": "Generic-request", } assert data["creatable_request_types"]["thesis_delete_record"] == { "description": "Request deletion of published record", - "links": {"actions": {"create": "https://127.0.0.1:5000/api/requests"}}, + "links": {"actions": {"create": f"https://127.0.0.1:5000/api/thesis/{example_topic['id']}/requests/thesis_delete_record"}}, "name": "Delete-record", } From 7ff7119d00b8b6ce46bb4084127d7209312b5ff4 Mon Sep 17 00:00:00 2001 From: Ronald Krist Date: Fri, 15 Mar 2024 10:34:36 +0100 Subject: [PATCH 3/5] format --- oarepo_requests/actions/edit_topic.py | 1 - oarepo_requests/resources/draft/config.py | 3 +- oarepo_requests/resources/draft/resource.py | 12 ++++--- oarepo_requests/resources/record/config.py | 12 ++++--- oarepo_requests/resources/record/resource.py | 16 +++++---- oarepo_requests/services/draft/service.py | 24 ++++++------- oarepo_requests/services/record/service.py | 23 ++++++------ oarepo_requests/services/schema.py | 18 +++++----- oarepo_requests/types/delete_record.py | 2 +- oarepo_requests/types/edit_record.py | 3 +- oarepo_requests/types/publish_draft.py | 3 +- oarepo_requests/utils.py | 6 ++-- tests/conftest.py | 1 + tests/test_requests/test_create_inmodel.py | 37 ++++++++++++-------- tests/test_ui/test_ui_resource.py | 24 ++++++++++--- 15 files changed, 106 insertions(+), 79 deletions(-) diff --git a/oarepo_requests/actions/edit_topic.py b/oarepo_requests/actions/edit_topic.py index 1c5f15d5..c5339883 100644 --- a/oarepo_requests/actions/edit_topic.py +++ b/oarepo_requests/actions/edit_topic.py @@ -1,4 +1,3 @@ -from invenio_records_resources.services.uow import RecordDeleteOp # from .generic import AcceptAction from invenio_requests.customizations import actions diff --git a/oarepo_requests/resources/draft/config.py b/oarepo_requests/resources/draft/config.py index 8cca976e..3bb32018 100644 --- a/oarepo_requests/resources/draft/config.py +++ b/oarepo_requests/resources/draft/config.py @@ -1,12 +1,11 @@ from oarepo_requests.resources.record.config import RecordRequestsResourceConfig - class DraftRecordRequestsResourceConfig(RecordRequestsResourceConfig): """""" routes = { **RecordRequestsResourceConfig.routes, "list-drafts": "//draft/requests", - "type-draft": "//draft/requests/" + "type-draft": "//draft/requests/", } diff --git a/oarepo_requests/resources/draft/resource.py b/oarepo_requests/resources/draft/resource.py index a6a2fa1f..1c93310e 100644 --- a/oarepo_requests/resources/draft/resource.py +++ b/oarepo_requests/resources/draft/resource.py @@ -1,9 +1,10 @@ from flask import g from flask_resources import resource_requestctx, response_handler, route from invenio_records_resources.resources.records.resource import ( + request_data, request_extra_args, request_search_args, - request_view_args, request_data, + request_view_args, ) from invenio_records_resources.resources.records.utils import search_preference @@ -19,7 +20,7 @@ def create_url_rules(self): url_rules = [ route("GET", routes["list-drafts"], self.search_requests_for_draft), - route("POST", routes["type-draft"], self.create_for_draft) + route("POST", routes["type-draft"], self.create_for_draft), ] return url_rules + old_rules @@ -50,9 +51,10 @@ def create_for_draft(self): request_type=resource_requestctx.view_args["request_type"], receiver=stringify_first_val(resource_requestctx.data.pop("receiver")), creator=stringify_first_val(resource_requestctx.data.pop("creator", None)), - topic_id=resource_requestctx.view_args["pid_value"], # do in service; put type_id into service config, what about draft/not draft, different url? - expand=resource_requestctx.data.pop("expand", False), #? + topic_id=resource_requestctx.view_args[ + "pid_value" + ], # do in service; put type_id into service config, what about draft/not draft, different url? + expand=resource_requestctx.data.pop("expand", False), # ? ) return items.to_dict(), 201 - diff --git a/oarepo_requests/resources/record/config.py b/oarepo_requests/resources/record/config.py index 69a8612f..f3f09578 100644 --- a/oarepo_requests/resources/record/config.py +++ b/oarepo_requests/resources/record/config.py @@ -1,11 +1,15 @@ -from invenio_records_resources.resources import RecordResourceConfig import marshmallow as ma +from invenio_records_resources.resources import RecordResourceConfig class RecordRequestsResourceConfig: - routes = {"list": "//requests", - "type": "//requests/",} - request_view_args = RecordResourceConfig.request_view_args | {"request_type": ma.fields.Str()} + routes = { + "list": "//requests", + "type": "//requests/", + } + request_view_args = RecordResourceConfig.request_view_args | { + "request_type": ma.fields.Str() + } """ @property def response_handlers(self): diff --git a/oarepo_requests/resources/record/resource.py b/oarepo_requests/resources/record/resource.py index 507a5a8e..59347e06 100644 --- a/oarepo_requests/resources/record/resource.py +++ b/oarepo_requests/resources/record/resource.py @@ -4,9 +4,10 @@ from flask_resources import resource_requestctx, response_handler, route from invenio_records_resources.resources import RecordResource from invenio_records_resources.resources.records.resource import ( + request_data, request_extra_args, request_search_args, - request_view_args, request_data, + request_view_args, ) from invenio_records_resources.resources.records.utils import search_preference @@ -22,7 +23,9 @@ def __init__(self, record_requests_config, config, service): """ actual_config = copy.deepcopy(config) actual_config.blueprint_name = f"{config.blueprint_name}_requests" - vars_to_overwrite = [x for x in dir(record_requests_config) if not x.startswith("_")] + vars_to_overwrite = [ + x for x in dir(record_requests_config) if not x.startswith("_") + ] for var in vars_to_overwrite: setattr(actual_config, var, getattr(record_requests_config, var)) super().__init__(actual_config, service) @@ -33,7 +36,7 @@ def create_url_rules(self): url_rules = [ route("GET", routes["list"], self.search_requests_for_record), - route("POST", routes["type"], self.create) + route("POST", routes["type"], self.create), ] return url_rules @@ -52,7 +55,6 @@ def search_requests_for_record(self): ) return hits.to_dict(), 200 - @request_extra_args @request_view_args @request_data @@ -65,8 +67,10 @@ def create(self): request_type=resource_requestctx.view_args["request_type"], receiver=stringify_first_val(resource_requestctx.data.pop("receiver")), creator=stringify_first_val(resource_requestctx.data.pop("creator", None)), - topic_id=resource_requestctx.view_args["pid_value"], # do in service; put type_id into service config, what about draft/not draft, different url? - expand=resource_requestctx.data.pop("expand", False), #? + topic_id=resource_requestctx.view_args[ + "pid_value" + ], # do in service; put type_id into service config, what about draft/not draft, different url? + expand=resource_requestctx.data.pop("expand", False), # ? ) return items.to_dict(), 201 diff --git a/oarepo_requests/services/draft/service.py b/oarepo_requests/services/draft/service.py index af65e44d..f454e610 100644 --- a/oarepo_requests/services/draft/service.py +++ b/oarepo_requests/services/draft/service.py @@ -1,8 +1,9 @@ +from invenio_records_resources.services.uow import unit_of_work from invenio_search.engine import dsl from oarepo_requests.services.record.service import RecordRequestsService from oarepo_requests.utils import get_type_id_for_record_cls -from invenio_records_resources.services.uow import unit_of_work + class DraftRecordRequestsService(RecordRequestsService): @property @@ -48,19 +49,18 @@ def search_requests_for_draft( **kwargs, ) - @unit_of_work() def create_for_draft( - self, - identity, - data, - request_type, - receiver, - creator=None, - topic_id=None, - expires_at=None, - uow=None, - expand=False, + self, + identity, + data, + request_type, + receiver, + creator=None, + topic_id=None, + expires_at=None, + uow=None, + expand=False, ): record = self.draft_cls.pid.resolve(topic_id, registered_only=False) return self.oarepo_requests_service.create( diff --git a/oarepo_requests/services/record/service.py b/oarepo_requests/services/record/service.py index d5f31b1f..011673fd 100644 --- a/oarepo_requests/services/record/service.py +++ b/oarepo_requests/services/record/service.py @@ -1,11 +1,10 @@ from types import SimpleNamespace +from invenio_records_resources.services.uow import unit_of_work from invenio_search.engine import dsl from oarepo_requests.proxies import current_oarepo_requests from oarepo_requests.utils import get_type_id_for_record_cls -from invenio_records_resources.services.uow import unit_of_work - class RecordRequestsService: @@ -72,16 +71,16 @@ def search_requests_for_record( @unit_of_work() def create( - self, - identity, - data, - request_type, - receiver, - creator=None, - topic_id=None, - expires_at=None, - uow=None, - expand=False, + self, + identity, + data, + request_type, + receiver, + creator=None, + topic_id=None, + expires_at=None, + uow=None, + expand=False, ): record = self.record_cls.pid.resolve(topic_id) return self.oarepo_requests_service.create( diff --git a/oarepo_requests/services/schema.py b/oarepo_requests/services/schema.py index 4a6172c9..afc8a8ac 100644 --- a/oarepo_requests/services/schema.py +++ b/oarepo_requests/services/schema.py @@ -1,15 +1,11 @@ import marshmallow as ma +from invenio_drafts_resources.services.records.config import is_record +from invenio_records_resources.services import ConditionalLink from invenio_records_resources.services.base.links import Link, LinksTemplate from invenio_requests.proxies import current_request_type_registry from invenio_requests.services.schemas import GenericRequestSchema from marshmallow import fields -from oarepo_requests.proxies import current_oarepo_requests_resource - - -from invenio_records_resources.services import ConditionalLink, RecordLink -from invenio_drafts_resources.services.records.config import is_record - from oarepo_requests.utils import get_matching_service_for_record @@ -27,8 +23,10 @@ class RequestTypeSchema(ma.Schema): def create_link(self, data, **kwargs): if "links" in data: return data - if 'record' not in self.context: - raise ma.ValidationError("record not in context for request types serialization") + if "record" not in self.context: + raise ma.ValidationError( + "record not in context for request types serialization" + ) type_id = data["type_id"] type = current_request_type_registry.lookup(type_id, quiet=True) record = self.context["record"] @@ -36,7 +34,9 @@ def create_link(self, data, **kwargs): link = ConditionalLink( cond=is_record, if_=Link(f"{{+api}}{service.config.url_prefix}{{id}}/requests/{type_id}"), - else_=Link(f"{{+api}}{service.config.url_prefix}{{id}}/draft/requests/{type_id}"), + else_=Link( + f"{{+api}}{service.config.url_prefix}{{id}}/draft/requests/{type_id}" + ), ) template = LinksTemplate({"create": link}, context={"id": record["id"]}) data["links"] = {"actions": template.expand(self.context["identity"], record)} diff --git a/oarepo_requests/types/delete_record.py b/oarepo_requests/types/delete_record.py index ff94b1fa..1335d264 100644 --- a/oarepo_requests/types/delete_record.py +++ b/oarepo_requests/types/delete_record.py @@ -1,10 +1,10 @@ from invenio_requests.customizations import RequestType +from oarepo_runtime.i18n import lazy_gettext as _ from oarepo_requests.actions.delete_topic import DeleteTopicAcceptAction from .generic import OARepoRequestType -from oarepo_runtime.i18n import lazy_gettext as _ class DeleteRecordRequestType(OARepoRequestType): available_actions = { diff --git a/oarepo_requests/types/edit_record.py b/oarepo_requests/types/edit_record.py index d19bfd84..84807777 100644 --- a/oarepo_requests/types/edit_record.py +++ b/oarepo_requests/types/edit_record.py @@ -1,11 +1,10 @@ from invenio_requests.customizations import RequestType +from oarepo_runtime.i18n import lazy_gettext as _ from oarepo_requests.actions.edit_topic import EditTopicAcceptAction from .generic import OARepoRequestType -from oarepo_runtime.i18n import lazy_gettext as _ - class EditRecordRequestType(OARepoRequestType): available_actions = { diff --git a/oarepo_requests/types/publish_draft.py b/oarepo_requests/types/publish_draft.py index 0438271b..2ef92ad5 100644 --- a/oarepo_requests/types/publish_draft.py +++ b/oarepo_requests/types/publish_draft.py @@ -1,11 +1,10 @@ from invenio_requests.customizations import RequestType +from oarepo_runtime.i18n import lazy_gettext as _ from oarepo_requests.actions.publish_draft import PublishDraftAcceptAction from .generic import OARepoRequestType -from oarepo_runtime.i18n import lazy_gettext as _ - class PublishDraftRequestType(OARepoRequestType): available_actions = { diff --git a/oarepo_requests/utils.py b/oarepo_requests/utils.py index 420ee6f6..26f506d6 100644 --- a/oarepo_requests/utils.py +++ b/oarepo_requests/utils.py @@ -102,9 +102,7 @@ def resolve_reference_dict(reference_dict): except ValueError: # Value error ignored from matches_reference_dict pass - obj = topic_resolver.get_entity_proxy( - reference_dict - ).resolve() + obj = topic_resolver.get_entity_proxy(reference_dict).resolve() return obj @@ -140,4 +138,4 @@ def stringify_first_val(dct): if isinstance(dct, dict): for k, v in dct.items(): dct[k] = str(v) - return dct \ No newline at end of file + return dct diff --git a/tests/conftest.py b/tests/conftest.py index bd6ea322..3f403a11 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -253,6 +253,7 @@ def users(app, db): db.session.commit() return [user1, user2] + @pytest.fixture() def client_with_login(client, users): """Log in a user to the client.""" diff --git a/tests/test_requests/test_create_inmodel.py b/tests/test_requests/test_create_inmodel.py index a4afbdab..42be32dc 100644 --- a/tests/test_requests/test_create_inmodel.py +++ b/tests/test_requests/test_create_inmodel.py @@ -1,5 +1,6 @@ +from thesis.records.api import ThesisRecord + from tests.test_requests.utils import link_api2testclient -from thesis.records.api import ThesisRecord, ThesisDraft def pick_request_type(types_list, queried_type): @@ -8,6 +9,7 @@ def pick_request_type(types_list, queried_type): return type return None + def test_record( logged_client_post, record_factory, @@ -20,19 +22,19 @@ def test_record( creator = users[0] receiver = users[1] record1 = record_factory() - record1 = logged_client_post( - creator, - "get", - f"{urls['BASE_URL']}{record1['id']}" - ) + record1 = logged_client_post(creator, "get", f"{urls['BASE_URL']}{record1['id']}") - link = link_api2testclient(pick_request_type(record1.json['request_types'], "thesis_delete_record")['links']['actions']['create']) + link = link_api2testclient( + pick_request_type(record1.json["request_types"], "thesis_delete_record")[ + "links" + ]["actions"]["create"] + ) resp_request_create = logged_client_post( creator, "post", link, - json={"receiver":{"user": receiver.id}}, + json={"receiver": {"user": receiver.id}}, ) assert resp_request_create.status_code == 201 resp_request_submit = logged_client_post( @@ -41,7 +43,9 @@ def test_record( link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), ) - record = logged_client_post(receiver, "get", f"{urls['BASE_URL']}{record1.json['id']}") + record = logged_client_post( + receiver, "get", f"{urls['BASE_URL']}{record1.json['id']}" + ) delete = logged_client_post( receiver, "post", @@ -52,7 +56,6 @@ def test_record( assert len(lst.json["hits"]["hits"]) == 0 - def test_draft( logged_client_post, identity_simple, @@ -65,14 +68,17 @@ def test_draft( receiver = users[1] draft1 = logged_client_post(creator, "post", urls["BASE_URL"], json={}) - link = link_api2testclient(pick_request_type(draft1.json['request_types'], "thesis_publish_draft")['links']['actions']['create']) - + link = link_api2testclient( + pick_request_type(draft1.json["request_types"], "thesis_publish_draft")[ + "links" + ]["actions"]["create"] + ) resp_request_create = logged_client_post( creator, "post", link, - json={"receiver":{"user": receiver.id}}, + json={"receiver": {"user": receiver.id}}, ) assert resp_request_create.status_code == 201 resp_request_submit = logged_client_post( @@ -81,7 +87,9 @@ def test_draft( link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), ) - record = logged_client_post(receiver, "get", f"{urls['BASE_URL']}{draft1.json['id']}/draft") + record = logged_client_post( + receiver, "get", f"{urls['BASE_URL']}{draft1.json['id']}/draft" + ) delete = logged_client_post( receiver, "post", @@ -90,4 +98,3 @@ def test_draft( ThesisRecord.index.refresh() lst = logged_client_post(creator, "get", urls["BASE_URL"]) assert len(lst.json["hits"]["hits"]) == 1 - diff --git a/tests/test_ui/test_ui_resource.py b/tests/test_ui/test_ui_resource.py index d9dfe782..6e23009f 100644 --- a/tests/test_ui/test_ui_resource.py +++ b/tests/test_ui/test_ui_resource.py @@ -16,12 +16,20 @@ def test_draft_publish_request_present( data = json.loads(c.text) assert data["creatable_request_types"]["thesis_non_duplicable"] == { "description": "", - "links": {"actions": {"create": f"https://127.0.0.1:5000/api/thesis/{example_topic_draft['id']}/draft/requests/thesis_non_duplicable"}}, + "links": { + "actions": { + "create": f"https://127.0.0.1:5000/api/thesis/{example_topic_draft['id']}/draft/requests/thesis_non_duplicable" + } + }, "name": "Non-duplicable", } assert data["creatable_request_types"]["thesis_publish_draft"] == { "description": "Request publishing of a draft", - "links": {"actions": {"create": f"https://127.0.0.1:5000/api/thesis/{example_topic_draft['id']}/draft/requests/thesis_publish_draft"}}, + "links": { + "actions": { + "create": f"https://127.0.0.1:5000/api/thesis/{example_topic_draft['id']}/draft/requests/thesis_publish_draft" + } + }, "name": "Publish-draft", } @@ -44,12 +52,20 @@ def test_record_delete_request_present( assert len(data["creatable_request_types"]) == 2 assert data["creatable_request_types"]["thesis_generic_request"] == { "description": "", - "links": {"actions": {"create": f"https://127.0.0.1:5000/api/thesis/{example_topic['id']}/requests/thesis_generic_request"}}, + "links": { + "actions": { + "create": f"https://127.0.0.1:5000/api/thesis/{example_topic['id']}/requests/thesis_generic_request" + } + }, "name": "Generic-request", } assert data["creatable_request_types"]["thesis_delete_record"] == { "description": "Request deletion of published record", - "links": {"actions": {"create": f"https://127.0.0.1:5000/api/thesis/{example_topic['id']}/requests/thesis_delete_record"}}, + "links": { + "actions": { + "create": f"https://127.0.0.1:5000/api/thesis/{example_topic['id']}/requests/thesis_delete_record" + } + }, "name": "Delete-record", } From 9bf04bf78db76d34424b53bcfb42423f7f958fbc Mon Sep 17 00:00:00 2001 From: Ronald Krist Date: Fri, 15 Mar 2024 12:33:14 +0100 Subject: [PATCH 4/5] creator and receiver not in resource --- oarepo_requests/actions/edit_topic.py | 1 - oarepo_requests/ext.py | 12 ++++++++++ oarepo_requests/resources/draft/resource.py | 10 ++++++--- oarepo_requests/resources/oarepo/resource.py | 22 +------------------ oarepo_requests/resources/record/resource.py | 9 +------- oarepo_requests/services/draft/service.py | 6 +---- oarepo_requests/services/oarepo/service.py | 8 ++++++- oarepo_requests/services/record/service.py | 6 +---- tests/conftest.py | 12 ++++++---- tests/test_requests/test_create_conditions.py | 9 ++++---- tests/test_requests/test_create_inmodel.py | 8 +------ tests/test_requests/test_delete.py | 6 ++--- tests/test_requests/test_publish.py | 6 ++--- tests/test_requests/test_read_extended.py | 2 +- tests/test_requests/test_record_requests.py | 12 +++++----- .../test_requests/test_ui_serialialization.py | 4 ++-- 16 files changed, 58 insertions(+), 75 deletions(-) diff --git a/oarepo_requests/actions/edit_topic.py b/oarepo_requests/actions/edit_topic.py index c5339883..f6246dda 100644 --- a/oarepo_requests/actions/edit_topic.py +++ b/oarepo_requests/actions/edit_topic.py @@ -1,4 +1,3 @@ - # from .generic import AcceptAction from invenio_requests.customizations import actions diff --git a/oarepo_requests/ext.py b/oarepo_requests/ext.py index 26780035..58d1e38f 100644 --- a/oarepo_requests/ext.py +++ b/oarepo_requests/ext.py @@ -1,3 +1,5 @@ +from invenio_base.utils import obj_or_import_string + from oarepo_requests.resources.oarepo.config import OARepoRequestsResourceConfig from oarepo_requests.resources.oarepo.resource import OARepoRequestsResource from oarepo_requests.services.oarepo.config import OARepoRequestsServiceConfig @@ -22,6 +24,16 @@ def init_app(self, app): def entity_reference_ui_resolvers(self): return self.app.config["ENTITY_REFERENCE_UI_RESOLVERS"] + def default_request_receiver(self, request_type_id): + """ + returns function that returns default request receiver + def receiver_getter(identity, request_type, topic, creator): + return + """ + return obj_or_import_string( + self.app.config["OAREPO_REQUESTS_DEFAULT_RECEIVER"] + )[request_type_id] + # copied from invenio_requests for now def service_configs(self, app): """Customized service configs.""" diff --git a/oarepo_requests/resources/draft/resource.py b/oarepo_requests/resources/draft/resource.py index 1c93310e..a55f3461 100644 --- a/oarepo_requests/resources/draft/resource.py +++ b/oarepo_requests/resources/draft/resource.py @@ -49,12 +49,16 @@ def create_for_draft(self): identity=g.identity, data=resource_requestctx.data, request_type=resource_requestctx.view_args["request_type"], - receiver=stringify_first_val(resource_requestctx.data.pop("receiver")), - creator=stringify_first_val(resource_requestctx.data.pop("creator", None)), topic_id=resource_requestctx.view_args[ "pid_value" ], # do in service; put type_id into service config, what about draft/not draft, different url? - expand=resource_requestctx.data.pop("expand", False), # ? + expand=( + stringify_first_val( + resource_requestctx.data.pop("expand", False) + ) # for what is this used, or can i just delete it + if resource_requestctx.data + else None + ), ) return items.to_dict(), 201 diff --git a/oarepo_requests/resources/oarepo/resource.py b/oarepo_requests/resources/oarepo/resource.py index 6b420da2..fcce5631 100644 --- a/oarepo_requests/resources/oarepo/resource.py +++ b/oarepo_requests/resources/oarepo/resource.py @@ -50,16 +50,6 @@ def create(self): identity=g.identity, data=resource_requestctx.data, request_type=resource_requestctx.data.pop("request_type", None), - receiver=( - stringify_first_val(resource_requestctx.data.pop("receiver", None)) - if resource_requestctx.data - else None - ), - creator=( - stringify_first_val(resource_requestctx.data.pop("creator", None)) - if resource_requestctx.data - else None - ), topic=( stringify_first_val(resource_requestctx.data.pop("topic", None)) if resource_requestctx.data @@ -85,17 +75,7 @@ def stringify_first_val(dct): items = self.service.create( identity=g.identity, data=resource_requestctx.data, - request_type=resource_requestctx.data.pop("request_type", None), - receiver=( - stringify_first_val(resource_requestctx.data.pop("receiver", None)) - if resource_requestctx.data - else None - ), - creator=( - stringify_first_val(resource_requestctx.data.pop("creator", None)) - if resource_requestctx.data - else None - ), + type_id=resource_requestctx.data.pop("request_type", None), topic=( stringify_first_val(resource_requestctx.data.pop("topic", None)) if resource_requestctx.data diff --git a/oarepo_requests/resources/record/resource.py b/oarepo_requests/resources/record/resource.py index 59347e06..618b32b0 100644 --- a/oarepo_requests/resources/record/resource.py +++ b/oarepo_requests/resources/record/resource.py @@ -11,8 +11,6 @@ ) from invenio_records_resources.resources.records.utils import search_preference -from oarepo_requests.utils import stringify_first_val - class RecordRequestsResource(RecordResource): def __init__(self, record_requests_config, config, service): @@ -65,12 +63,7 @@ def create(self): identity=g.identity, data=resource_requestctx.data, request_type=resource_requestctx.view_args["request_type"], - receiver=stringify_first_val(resource_requestctx.data.pop("receiver")), - creator=stringify_first_val(resource_requestctx.data.pop("creator", None)), - topic_id=resource_requestctx.view_args[ - "pid_value" - ], # do in service; put type_id into service config, what about draft/not draft, different url? - expand=resource_requestctx.data.pop("expand", False), # ? + topic_id=resource_requestctx.view_args["pid_value"], ) return items.to_dict(), 201 diff --git a/oarepo_requests/services/draft/service.py b/oarepo_requests/services/draft/service.py index f454e610..67c129be 100644 --- a/oarepo_requests/services/draft/service.py +++ b/oarepo_requests/services/draft/service.py @@ -55,9 +55,7 @@ def create_for_draft( identity, data, request_type, - receiver, - creator=None, - topic_id=None, + topic_id, expires_at=None, uow=None, expand=False, @@ -67,8 +65,6 @@ def create_for_draft( identity=identity, data=data, request_type=request_type, - receiver=receiver, - creator=creator, topic=record, expand=expand, uow=uow, diff --git a/oarepo_requests/services/oarepo/service.py b/oarepo_requests/services/oarepo/service.py index 0788ff6f..cb5c72f4 100644 --- a/oarepo_requests/services/oarepo/service.py +++ b/oarepo_requests/services/oarepo/service.py @@ -3,6 +3,7 @@ from invenio_requests.services import RequestsService from oarepo_requests.errors import UnknownRequestType +from oarepo_requests.proxies import current_oarepo_requests class OARepoRequestsService(RequestsService): @@ -12,7 +13,7 @@ def create( identity, data, request_type, - receiver, + receiver=None, creator=None, topic=None, expires_at=None, @@ -22,6 +23,11 @@ def create( type_ = current_request_type_registry.lookup(request_type, quiet=True) if not type_: raise UnknownRequestType(request_type) + + if receiver is None: + receiver = current_oarepo_requests.default_request_receiver(request_type) + if data is None: + data = {} if hasattr(type_, "can_create"): error = type_.can_create(identity, data, receiver, topic, creator) else: diff --git a/oarepo_requests/services/record/service.py b/oarepo_requests/services/record/service.py index 011673fd..0e90da97 100644 --- a/oarepo_requests/services/record/service.py +++ b/oarepo_requests/services/record/service.py @@ -75,9 +75,7 @@ def create( identity, data, request_type, - receiver, - creator=None, - topic_id=None, + topic_id, expires_at=None, uow=None, expand=False, @@ -87,8 +85,6 @@ def create( identity=identity, data=data, request_type=request_type, - receiver=receiver, - creator=creator, topic=record, expand=expand, uow=uow, diff --git a/tests/conftest.py b/tests/conftest.py index 3f403a11..b4b912eb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -20,9 +20,8 @@ def urls(): @pytest.fixture() def publish_request_data_function(): - def ret_data(receiver_id, record_id): + def ret_data(record_id): return { - "receiver": {"user": receiver_id}, "request_type": "thesis_publish_draft", "topic": {"thesis_draft": record_id}, } @@ -32,9 +31,8 @@ def ret_data(receiver_id, record_id): @pytest.fixture() def delete_record_data_function(): - def ret_data(receiver_id, record_id): + def ret_data(record_id): return { - "receiver": {"user": receiver_id}, "request_type": "thesis_delete_record", "topic": {"thesis": record_id}, } @@ -139,6 +137,12 @@ def app_config(app_config): ) app_config["CACHE_TYPE"] = "SimpleCache" + app_config["OAREPO_REQUESTS_DEFAULT_RECEIVER"] = { + "thesis_publish_draft": {"user": "2"}, + "thesis_delete_record": {"user": "2"}, + "thesis_non_duplicable": {"user": "2"}, + } + """ app_config.setdefault("ENTITY_REFERENCE_UI_RESOLVERS", {}).update({ #"user": user_entity_reference_ui_resolver, diff --git a/tests/test_requests/test_create_conditions.py b/tests/test_requests/test_create_conditions.py index a862b1f1..026d32ff 100644 --- a/tests/test_requests/test_create_conditions.py +++ b/tests/test_requests/test_create_conditions.py @@ -5,9 +5,8 @@ from .utils import link_api2testclient -def data(receiver_id, record_id): +def data(record_id): return { - "receiver": {"user": receiver_id}, "request_type": "thesis_non_duplicable", "topic": {"thesis_draft": record_id}, } @@ -20,7 +19,7 @@ def test_can_create(client_logged_as, identity_simple, users, urls, search_clear draft1 = creator_client.post(urls["BASE_URL"], json={}) resp_request_create = creator_client.post( - urls["BASE_URL_REQUESTS"], json=data(receiver.id, draft1.json["id"]) + urls["BASE_URL_REQUESTS"], json=data(draft1.json["id"]) ) resp_request_submit = creator_client.post( @@ -29,7 +28,7 @@ def test_can_create(client_logged_as, identity_simple, users, urls, search_clear with pytest.raises(OpenRequestAlreadyExists): resp_request_create2 = creator_client.post( - urls["BASE_URL_REQUESTS"], json=data(receiver.id, draft1.json["id"]) + urls["BASE_URL_REQUESTS"], json=data(draft1.json["id"]) ) @@ -45,7 +44,7 @@ def test_can_possibly_create( f"{urls['BASE_URL']}{draft1.json['id']}/draft" ) resp_request_create = creator_client.post( - urls["BASE_URL_REQUESTS"], json=data(receiver.id, draft1.json["id"]) + urls["BASE_URL_REQUESTS"], json=data(draft1.json["id"]) ) resp_request_submit = creator_client.post( diff --git a/tests/test_requests/test_create_inmodel.py b/tests/test_requests/test_create_inmodel.py index 42be32dc..aeecbb0f 100644 --- a/tests/test_requests/test_create_inmodel.py +++ b/tests/test_requests/test_create_inmodel.py @@ -34,7 +34,6 @@ def test_record( creator, "post", link, - json={"receiver": {"user": receiver.id}}, ) assert resp_request_create.status_code == 201 resp_request_submit = logged_client_post( @@ -74,12 +73,7 @@ def test_draft( ]["actions"]["create"] ) - resp_request_create = logged_client_post( - creator, - "post", - link, - json={"receiver": {"user": receiver.id}}, - ) + resp_request_create = logged_client_post(creator, "post", link) assert resp_request_create.status_code == 201 resp_request_submit = logged_client_post( creator, diff --git a/tests/test_requests/test_delete.py b/tests/test_requests/test_delete.py index 17f945c8..85c473c6 100644 --- a/tests/test_requests/test_delete.py +++ b/tests/test_requests/test_delete.py @@ -26,7 +26,7 @@ def test_delete( creator, "post", urls["BASE_URL_REQUESTS"], - json=delete_record_data_function(receiver.id, record1["id"]), + json=delete_record_data_function(record1["id"]), ) resp_request_submit = logged_client_post( creator, @@ -55,7 +55,7 @@ def test_delete( creator, "post", urls["BASE_URL_REQUESTS"], - json=delete_record_data_function(receiver.id, record2["id"]), + json=delete_record_data_function(record2["id"]), ) resp_request_submit = logged_client_post( creator, @@ -77,7 +77,7 @@ def test_delete( creator, "post", urls["BASE_URL_REQUESTS"], - json=delete_record_data_function(receiver.id, record3["id"]), + json=delete_record_data_function(record3["id"]), ) resp_request_submit = logged_client_post( creator, diff --git a/tests/test_requests/test_publish.py b/tests/test_requests/test_publish.py index 98f2ab57..acd8adc1 100644 --- a/tests/test_requests/test_publish.py +++ b/tests/test_requests/test_publish.py @@ -28,7 +28,7 @@ def test_publish( creator, "post", urls["BASE_URL_REQUESTS"], - json=publish_request_data_function(receiver.id, draft1.json["id"]), + json=publish_request_data_function(draft1.json["id"]), ) resp_request_submit = logged_client_post( @@ -67,7 +67,7 @@ def test_publish( creator, "post", urls["BASE_URL_REQUESTS"], - json=publish_request_data_function(receiver.id, draft2.json["id"]), + json=publish_request_data_function(draft2.json["id"]), ) resp_request_submit = logged_client_post( creator, @@ -94,7 +94,7 @@ def test_publish( creator, "post", urls["BASE_URL_REQUESTS"], - json=publish_request_data_function(receiver.id, draft3.json["id"]), + json=publish_request_data_function(draft3.json["id"]), ) resp_request_submit = logged_client_post( creator, diff --git a/tests/test_requests/test_read_extended.py b/tests/test_requests/test_read_extended.py index 1ab559a9..e4da43ae 100644 --- a/tests/test_requests/test_read_extended.py +++ b/tests/test_requests/test_read_extended.py @@ -15,7 +15,7 @@ def test_read_extended( creator_client = client_logged_as(users[0].email) resp_request_create = creator_client.post( urls["BASE_URL_REQUESTS"], - json=publish_request_data_function(receiver.id, example_topic_draft["id"]), + json=publish_request_data_function(example_topic_draft["id"]), ) resp_request_submit = creator_client.post( link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]) diff --git a/tests/test_requests/test_record_requests.py b/tests/test_requests/test_record_requests.py index a09e08f5..8701f545 100644 --- a/tests/test_requests/test_record_requests.py +++ b/tests/test_requests/test_record_requests.py @@ -22,15 +22,15 @@ def test_read_requests_on_draft( r1 = creator_client.post( urls["BASE_URL_REQUESTS"], - json=publish_request_data_function(receiver.id, draft1.json["id"]), + json=publish_request_data_function(draft1.json["id"]), ) r2 = creator_client.post( urls["BASE_URL_REQUESTS"], - json=publish_request_data_function(receiver.id, draft1.json["id"]), + json=publish_request_data_function(draft1.json["id"]), ) r3 = creator_client.post( urls["BASE_URL_REQUESTS"], - json=publish_request_data_function(receiver.id, draft2.json["id"]), + json=publish_request_data_function(draft2.json["id"]), ) creator_client.post(link_api2testclient(r1.json["links"]["actions"]["submit"])) @@ -71,15 +71,15 @@ def test_read_requests_on_record( ThesisDraft.index.refresh() r1 = creator_client.post( urls["BASE_URL_REQUESTS"], - json=delete_record_data_function(receiver.id, record1["id"]), + json=delete_record_data_function(record1["id"]), ) r2 = creator_client.post( urls["BASE_URL_REQUESTS"], - json=delete_record_data_function(receiver.id, record1["id"]), + json=delete_record_data_function(record1["id"]), ) r3 = creator_client.post( urls["BASE_URL_REQUESTS"], - json=delete_record_data_function(receiver.id, record2["id"]), + json=delete_record_data_function(record2["id"]), ) creator_client.post(link_api2testclient(r1.json["links"]["actions"]["submit"])) diff --git a/tests/test_requests/test_ui_serialialization.py b/tests/test_requests/test_ui_serialialization.py index c8d2d8e3..bb6afbaa 100644 --- a/tests/test_requests/test_ui_serialialization.py +++ b/tests/test_requests/test_ui_serialialization.py @@ -24,7 +24,7 @@ def test_publish( resp_request_create = creator_client.post( urls["BASE_URL_REQUESTS"], - json=publish_request_data_function(receiver.id, draft1.json["id"]), + json=publish_request_data_function(draft1.json["id"]), ) resp_request_submit = creator_client.post( @@ -65,7 +65,7 @@ def test_resolver_fallback( resp_request_create = creator_client.post( urls["BASE_URL_REQUESTS"], - json=publish_request_data_function(receiver.id, draft1.json["id"]), + json=publish_request_data_function(draft1.json["id"]), ) resp_request_submit = creator_client.post( From bea3a2e12dacc9122bebb47d64c6e5b11921ea1b Mon Sep 17 00:00:00 2001 From: Ronald Krist Date: Fri, 15 Mar 2024 13:08:23 +0100 Subject: [PATCH 5/5] review fixes --- oarepo_requests/services/oarepo/service.py | 5 ++- tests/conftest.py | 15 ++++--- tests/test_requests/test_create_inmodel.py | 30 +++++++------- tests/test_requests/test_delete.py | 38 +++++++++-------- tests/test_requests/test_publish.py | 48 +++++++++++----------- 5 files changed, 74 insertions(+), 62 deletions(-) diff --git a/oarepo_requests/services/oarepo/service.py b/oarepo_requests/services/oarepo/service.py index cb5c72f4..8fd2f0fe 100644 --- a/oarepo_requests/services/oarepo/service.py +++ b/oarepo_requests/services/oarepo/service.py @@ -25,7 +25,10 @@ def create( raise UnknownRequestType(request_type) if receiver is None: - receiver = current_oarepo_requests.default_request_receiver(request_type) + receiver_getter = current_oarepo_requests.default_request_receiver( + request_type + ) + receiver = receiver_getter(identity, request_type, topic, creator) if data is None: data = {} if hasattr(type_, "can_create"): diff --git a/tests/conftest.py b/tests/conftest.py index b4b912eb..bf6a6706 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -137,10 +137,13 @@ def app_config(app_config): ) app_config["CACHE_TYPE"] = "SimpleCache" + def default_receiver(*args, **kwargs): + return {"user": "2"} + app_config["OAREPO_REQUESTS_DEFAULT_RECEIVER"] = { - "thesis_publish_draft": {"user": "2"}, - "thesis_delete_record": {"user": "2"}, - "thesis_non_duplicable": {"user": "2"}, + "thesis_publish_draft": default_receiver, + "thesis_delete_record": default_receiver, + "thesis_non_duplicable": default_receiver, } """ @@ -284,12 +287,12 @@ def log_user(user_email): @pytest.fixture() -def logged_client_post(client_logged_as): - def _logged_client_post(user, method, *args, **kwargs): +def logged_client_request(client_logged_as): + def _logged_client_request(user, method, *args, **kwargs): applied_client = client_logged_as(user.email) return getattr(applied_client, method)(*args, **kwargs) - return _logged_client_post + return _logged_client_request @pytest.fixture() diff --git a/tests/test_requests/test_create_inmodel.py b/tests/test_requests/test_create_inmodel.py index aeecbb0f..1fa4ff57 100644 --- a/tests/test_requests/test_create_inmodel.py +++ b/tests/test_requests/test_create_inmodel.py @@ -11,7 +11,7 @@ def pick_request_type(types_list, queried_type): def test_record( - logged_client_post, + logged_client_request, record_factory, identity_simple, users, @@ -22,7 +22,9 @@ def test_record( creator = users[0] receiver = users[1] record1 = record_factory() - record1 = logged_client_post(creator, "get", f"{urls['BASE_URL']}{record1['id']}") + record1 = logged_client_request( + creator, "get", f"{urls['BASE_URL']}{record1['id']}" + ) link = link_api2testclient( pick_request_type(record1.json["request_types"], "thesis_delete_record")[ @@ -30,33 +32,33 @@ def test_record( ]["actions"]["create"] ) - resp_request_create = logged_client_post( + resp_request_create = logged_client_request( creator, "post", link, ) assert resp_request_create.status_code == 201 - resp_request_submit = logged_client_post( + resp_request_submit = logged_client_request( creator, "post", link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), ) - record = logged_client_post( + record = logged_client_request( receiver, "get", f"{urls['BASE_URL']}{record1.json['id']}" ) - delete = logged_client_post( + delete = logged_client_request( receiver, "post", link_api2testclient(record.json["requests"][0]["links"]["actions"]["accept"]), ) ThesisRecord.index.refresh() - lst = logged_client_post(creator, "get", urls["BASE_URL"]) + lst = logged_client_request(creator, "get", urls["BASE_URL"]) assert len(lst.json["hits"]["hits"]) == 0 def test_draft( - logged_client_post, + logged_client_request, identity_simple, users, urls, @@ -66,29 +68,29 @@ def test_draft( creator = users[0] receiver = users[1] - draft1 = logged_client_post(creator, "post", urls["BASE_URL"], json={}) + draft1 = logged_client_request(creator, "post", urls["BASE_URL"], json={}) link = link_api2testclient( pick_request_type(draft1.json["request_types"], "thesis_publish_draft")[ "links" ]["actions"]["create"] ) - resp_request_create = logged_client_post(creator, "post", link) + resp_request_create = logged_client_request(creator, "post", link) assert resp_request_create.status_code == 201 - resp_request_submit = logged_client_post( + resp_request_submit = logged_client_request( creator, "post", link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), ) - record = logged_client_post( + record = logged_client_request( receiver, "get", f"{urls['BASE_URL']}{draft1.json['id']}/draft" ) - delete = logged_client_post( + delete = logged_client_request( receiver, "post", link_api2testclient(record.json["requests"][0]["links"]["actions"]["accept"]), ) ThesisRecord.index.refresh() - lst = logged_client_post(creator, "get", urls["BASE_URL"]) + lst = logged_client_request(creator, "get", urls["BASE_URL"]) assert len(lst.json["hits"]["hits"]) == 1 diff --git a/tests/test_requests/test_delete.py b/tests/test_requests/test_delete.py index 85c473c6..27e5eccf 100644 --- a/tests/test_requests/test_delete.py +++ b/tests/test_requests/test_delete.py @@ -4,7 +4,7 @@ def test_delete( - logged_client_post, + logged_client_request, record_factory, identity_simple, users, @@ -19,28 +19,30 @@ def test_delete( record3 = record_factory() ThesisRecord.index.refresh() ThesisDraft.index.refresh() - lst = logged_client_post(creator, "get", urls["BASE_URL"]) + lst = logged_client_request(creator, "get", urls["BASE_URL"]) assert len(lst.json["hits"]["hits"]) == 3 - resp_request_create = logged_client_post( + resp_request_create = logged_client_request( creator, "post", urls["BASE_URL_REQUESTS"], json=delete_record_data_function(record1["id"]), ) - resp_request_submit = logged_client_post( + resp_request_submit = logged_client_request( creator, "post", link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), ) print() - record = logged_client_post(receiver, "get", f"{urls['BASE_URL']}{record1['id']}") + record = logged_client_request( + receiver, "get", f"{urls['BASE_URL']}{record1['id']}" + ) assert record.json["requests"][0]["links"]["actions"].keys() == { "accept", "decline", } - delete = logged_client_post( + delete = logged_client_request( receiver, "post", link_api2testclient(record.json["requests"][0]["links"]["actions"]["accept"]), @@ -48,50 +50,52 @@ def test_delete( ThesisRecord.index.refresh() ThesisDraft.index.refresh() - lst = logged_client_post(creator, "get", urls["BASE_URL"]) + lst = logged_client_request(creator, "get", urls["BASE_URL"]) assert len(lst.json["hits"]["hits"]) == 2 - resp_request_create = logged_client_post( + resp_request_create = logged_client_request( creator, "post", urls["BASE_URL_REQUESTS"], json=delete_record_data_function(record2["id"]), ) - resp_request_submit = logged_client_post( + resp_request_submit = logged_client_request( creator, "post", link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), ) - record = logged_client_post(receiver, "get", f"{urls['BASE_URL']}{record2['id']}") - decline = logged_client_post( + record = logged_client_request( + receiver, "get", f"{urls['BASE_URL']}{record2['id']}" + ) + decline = logged_client_request( receiver, "post", link_api2testclient(record.json["requests"][0]["links"]["actions"]["decline"]), ) - declined_request = logged_client_post( + declined_request = logged_client_request( creator, "get", f"{urls['BASE_URL_REQUESTS']}{resp_request_create.json['id']}" ) assert declined_request.json["status"] == "declined" - resp_request_create = logged_client_post( + resp_request_create = logged_client_request( creator, "post", urls["BASE_URL_REQUESTS"], json=delete_record_data_function(record3["id"]), ) - resp_request_submit = logged_client_post( + resp_request_submit = logged_client_request( creator, "post", link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), ) - record = logged_client_post(creator, "get", f"{urls['BASE_URL']}{record3['id']}") + record = logged_client_request(creator, "get", f"{urls['BASE_URL']}{record3['id']}") assert record.json["requests"][0]["links"]["actions"].keys() == {"cancel"} - cancel = logged_client_post( + cancel = logged_client_request( creator, "post", link_api2testclient(record.json["requests"][0]["links"]["actions"]["cancel"]), ) - canceled_request = logged_client_post( + canceled_request = logged_client_request( creator, "get", f"{urls['BASE_URL_REQUESTS']}{resp_request_create.json['id']}" ) assert canceled_request.json["status"] == "cancelled" diff --git a/tests/test_requests/test_publish.py b/tests/test_requests/test_publish.py index acd8adc1..ef47f921 100644 --- a/tests/test_requests/test_publish.py +++ b/tests/test_requests/test_publish.py @@ -4,7 +4,7 @@ def test_publish( - logged_client_post, + logged_client_request, identity_simple, users, urls, @@ -14,24 +14,24 @@ def test_publish( creator = users[0] receiver = users[1] - draft1 = logged_client_post(creator, "post", urls["BASE_URL"], json={}) - draft2 = logged_client_post(creator, "post", urls["BASE_URL"], json={}) - draft3 = logged_client_post(creator, "post", urls["BASE_URL"], json={}) + draft1 = logged_client_request(creator, "post", urls["BASE_URL"], json={}) + draft2 = logged_client_request(creator, "post", urls["BASE_URL"], json={}) + draft3 = logged_client_request(creator, "post", urls["BASE_URL"], json={}) ThesisRecord.index.refresh() ThesisDraft.index.refresh() - draft_lst = logged_client_post(creator, "get", f"/user{urls['BASE_URL']}") - lst = logged_client_post(creator, "get", urls["BASE_URL"]) + draft_lst = logged_client_request(creator, "get", f"/user{urls['BASE_URL']}") + lst = logged_client_request(creator, "get", urls["BASE_URL"]) assert len(draft_lst.json["hits"]["hits"]) == 3 assert len(lst.json["hits"]["hits"]) == 0 - resp_request_create = logged_client_post( + resp_request_create = logged_client_request( creator, "post", urls["BASE_URL_REQUESTS"], json=publish_request_data_function(draft1.json["id"]), ) - resp_request_submit = logged_client_post( + resp_request_submit = logged_client_request( creator, "post", link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), @@ -39,78 +39,78 @@ def test_publish( ThesisRecord.index.refresh() ThesisDraft.index.refresh() - record = logged_client_post( + record = logged_client_request( receiver, "get", f"{urls['BASE_URL']}{draft1.json['id']}/draft" ) assert record.json["requests"][0]["links"]["actions"].keys() == { "accept", "decline", } - publish = logged_client_post( + publish = logged_client_request( receiver, "post", link_api2testclient(record.json["requests"][0]["links"]["actions"]["accept"]), ) - record = logged_client_post( + record = logged_client_request( receiver, "get", f"{urls['BASE_URL']}{draft2.json['id']}/draft" ) assert "publish_draft" not in record.json["parent"] ThesisRecord.index.refresh() ThesisDraft.index.refresh() - draft_lst = logged_client_post(creator, "get", f"/user{urls['BASE_URL']}") - lst = logged_client_post(creator, "get", urls["BASE_URL"]) + draft_lst = logged_client_request(creator, "get", f"/user{urls['BASE_URL']}") + lst = logged_client_request(creator, "get", urls["BASE_URL"]) assert len(draft_lst.json["hits"]["hits"]) == 2 assert len(lst.json["hits"]["hits"]) == 1 - resp_request_create = logged_client_post( + resp_request_create = logged_client_request( creator, "post", urls["BASE_URL_REQUESTS"], json=publish_request_data_function(draft2.json["id"]), ) - resp_request_submit = logged_client_post( + resp_request_submit = logged_client_request( creator, "post", link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), ) - record = logged_client_post( + record = logged_client_request( receiver, "get", f"{urls['BASE_URL']}{draft2.json['id']}/draft" ) - decline = logged_client_post( + decline = logged_client_request( receiver, "post", link_api2testclient(record.json["requests"][0]["links"]["actions"]["decline"]), ) - declined_request = logged_client_post( + declined_request = logged_client_request( creator, "get", f"{urls['BASE_URL_REQUESTS']}{resp_request_create.json['id']}" ) assert declined_request.json["status"] == "declined" - record = logged_client_post( + record = logged_client_request( receiver, "get", f"{urls['BASE_URL']}{draft2.json['id']}/draft" ) - resp_request_create = logged_client_post( + resp_request_create = logged_client_request( creator, "post", urls["BASE_URL_REQUESTS"], json=publish_request_data_function(draft3.json["id"]), ) - resp_request_submit = logged_client_post( + resp_request_submit = logged_client_request( creator, "post", link_api2testclient(resp_request_create.json["links"]["actions"]["submit"]), ) - record = logged_client_post( + record = logged_client_request( creator, "get", f"{urls['BASE_URL']}{draft3.json['id']}/draft" ) assert record.json["requests"][0]["links"]["actions"].keys() == {"cancel"} - cancel = logged_client_post( + cancel = logged_client_request( creator, "post", link_api2testclient(record.json["requests"][0]["links"]["actions"]["cancel"]), ) - canceled_request = logged_client_post( + canceled_request = logged_client_request( creator, "get", f"{urls['BASE_URL_REQUESTS']}{resp_request_create.json['id']}" ) assert canceled_request.json["status"] == "cancelled"