Skip to content

Commit

Permalink
onmodel create url in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
Ronald Krist committed Mar 14, 2024
1 parent 1b43724 commit e8bef80
Show file tree
Hide file tree
Showing 12 changed files with 179 additions and 124 deletions.
2 changes: 2 additions & 0 deletions oarepo_requests/resources/draft/config.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from oarepo_requests.resources.record.config import RecordRequestsResourceConfig



class DraftRecordRequestsResourceConfig(RecordRequestsResourceConfig):
""""""

routes = {
**RecordRequestsResourceConfig.routes,
"list-drafts": "/<pid_value>/draft/requests",
"type-draft": "/<pid_value>/draft/requests/<request_type>"
}
23 changes: 22 additions & 1 deletion oarepo_requests/resources/draft/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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

Expand All @@ -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

7 changes: 2 additions & 5 deletions oarepo_requests/resources/oarepo/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
)
from invenio_requests.resources import RequestsResource

from oarepo_requests.utils import stringify_first_val


class OARepoRequestsResource(RequestsResource, ErrorHandlersMixin):
"""
Expand Down Expand Up @@ -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,
Expand Down
7 changes: 5 additions & 2 deletions oarepo_requests/resources/record/config.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
from invenio_records_resources.resources import RecordResourceConfig
import marshmallow as ma


class RecordRequestsResourceConfig(RecordResourceConfig):
routes = {"list": "/<pid_value>/requests"}
class RecordRequestsResourceConfig:
routes = {"list": "/<pid_value>/requests",
"type": "/<pid_value>/requests/<request_type>",}
request_view_args = RecordResourceConfig.request_view_args | {"request_type": ma.fields.Str()}
"""
@property
def response_handlers(self):
Expand Down
31 changes: 27 additions & 4 deletions oarepo_requests/resources/record/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,25 @@
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:
:param record_requests_config: config specific for the record request serivce
"""
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):
Expand All @@ -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

Expand All @@ -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
28 changes: 27 additions & 1 deletion oarepo_requests/services/draft/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
)
30 changes: 29 additions & 1 deletion oarepo_requests/services/record/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
)
6 changes: 2 additions & 4 deletions oarepo_requests/services/results.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
16 changes: 14 additions & 2 deletions oarepo_requests/services/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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


Expand Down
7 changes: 7 additions & 0 deletions oarepo_requests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
42 changes: 42 additions & 0 deletions tests/test_requests/test_create_inmodel.py
Original file line number Diff line number Diff line change
@@ -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()

Loading

0 comments on commit e8bef80

Please sign in to comment.