oarepo-runtime 1.5.116__py3-none-any.whl → 1.5.117__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- from typing import List, Mapping, Union
1
+ from typing import Union
2
2
 
3
- JSON = Union[str, int, float, bool, None, Mapping[str, "JSON"], List["JSON"]]
4
- JSONObject = Mapping[str, "JSON"]
3
+ JSON = Union[str, int, float, bool, None, dict[str, "JSON"], list["JSON"]]
4
+ JSONObject = dict[str, "JSON"]
@@ -8,7 +8,13 @@ from oarepo_runtime.datastreams.writers.utils import record_invenio_exceptions
8
8
 
9
9
  class PublishWriter(BaseWriter):
10
10
  def __init__(
11
- self, *, service, request_name="publish_draft", identity=None, **kwargs
11
+ self,
12
+ *,
13
+ service,
14
+ request_name="publish_draft",
15
+ identity=None,
16
+ direct_call=False,
17
+ **kwargs
12
18
  ):
13
19
  if isinstance(service, str):
14
20
  service = current_service_registry.get(service)
@@ -16,6 +22,7 @@ class PublishWriter(BaseWriter):
16
22
  self._service = service
17
23
  self._identity = identity or system_identity
18
24
  self._request_name = request_name
25
+ self._direct_call = direct_call
19
26
 
20
27
  def write(self, batch: StreamBatch) -> StreamBatch:
21
28
  for entry in batch.ok_entries:
@@ -26,24 +33,27 @@ class PublishWriter(BaseWriter):
26
33
  self._write_entry(entry)
27
34
 
28
35
  def _write_entry(self, entry: StreamEntry):
29
- from invenio_requests.proxies import (
30
- current_requests_service as current_invenio_requests_service,
31
- )
32
- from oarepo_requests.proxies import current_oarepo_requests_service
33
-
34
- draft = self._service.read_draft(self._identity, entry.id)
35
- request = current_oarepo_requests_service.create(
36
- identity=self._identity,
37
- data=None,
38
- request_type=self._request_name,
39
- topic=draft._record,
40
- )
41
-
42
- submit_result = current_invenio_requests_service.execute_action(
43
- self._identity, request.id, "submit"
44
- )
45
- accept_result = current_invenio_requests_service.execute_action(
46
- self._identity, request.id, "accept"
47
- )
48
-
49
- self._service.read(self._identity, draft["id"])
36
+ if self._direct_call:
37
+ self._service.publish(self._identity, entry.id)
38
+ else:
39
+ from invenio_requests.proxies import (
40
+ current_requests_service as current_invenio_requests_service,
41
+ )
42
+ from oarepo_requests.proxies import current_oarepo_requests_service
43
+
44
+ draft = self._service.read_draft(self._identity, entry.id)
45
+ request = current_oarepo_requests_service.create(
46
+ identity=self._identity,
47
+ data=None,
48
+ request_type=self._request_name,
49
+ topic=draft._record,
50
+ )
51
+
52
+ submit_result = current_invenio_requests_service.execute_action(
53
+ self._identity, request.id, "submit"
54
+ )
55
+ accept_result = current_invenio_requests_service.execute_action(
56
+ self._identity, request.id, "accept"
57
+ )
58
+
59
+ self._service.read(self._identity, draft["id"])
@@ -4,7 +4,7 @@ from invenio_records_resources.proxies import current_service_registry
4
4
  from invenio_records_resources.services.uow import UnitOfWork
5
5
 
6
6
  from ...uow import BulkUnitOfWork
7
- from ..types import StreamBatch, StreamEntry
7
+ from ..types import StreamBatch, StreamEntry, StreamEntryError
8
8
  from . import BaseWriter
9
9
  from .utils import record_invenio_exceptions
10
10
 
@@ -38,10 +38,26 @@ class ServiceWriter(BaseWriter):
38
38
  self._update = update
39
39
 
40
40
  def _resolve(self, id_):
41
- try:
42
- return self._service.read(self._identity, id_)
43
- except PIDDoesNotExistError:
44
- return None
41
+ if hasattr(self._service, "read_draft"):
42
+ try:
43
+ # try to read the draft first
44
+ return self._service.read_draft(self._identity, id_)
45
+ except PIDDoesNotExistError:
46
+ pass
47
+ try:
48
+ # if the draft does not exist, read the published record
49
+ # and create a draft for it
50
+ rec = self._service.read(self._identity, id_)
51
+ return self._service.edit(self._identity, id_)
52
+ except PIDDoesNotExistError:
53
+ pass
54
+
55
+ else:
56
+ try:
57
+ return self._service.read(self._identity, id_)
58
+ except PIDDoesNotExistError:
59
+ pass
60
+ return None
45
61
 
46
62
  def _get_stream_entry_id(self, entry: StreamEntry):
47
63
  return entry.id
@@ -92,6 +108,16 @@ class ServiceWriter(BaseWriter):
92
108
  stream_entry.id = repository_entry.id
93
109
 
94
110
  stream_entry.context["revision_id"] = repository_entry._record.revision_id
111
+ if repository_entry.errors:
112
+ for err in repository_entry.errors:
113
+ field = err.get("field")
114
+ messages = err.get("messages")
115
+ for message in messages:
116
+ stream_entry.errors.append(
117
+ StreamEntryError(
118
+ code="validation", message=message, location=field
119
+ )
120
+ )
95
121
 
96
122
  def try_update(self, entry_id, entry, **service_kwargs):
97
123
  current = self._resolve(entry_id)
@@ -99,9 +125,15 @@ class ServiceWriter(BaseWriter):
99
125
  updated = dict(current.to_dict(), **entry)
100
126
  # might raise exception here but that's ok - we know that the entry
101
127
  # exists in db as it was _resolved
102
- return self._service.update(
103
- self._identity, entry_id, updated, **service_kwargs
104
- )
128
+ if hasattr(self._service, "update_draft"):
129
+ # try to update draft first
130
+ return self._service.update_draft(
131
+ self._identity, entry_id, updated, **service_kwargs
132
+ )
133
+ else:
134
+ return self._service.update(
135
+ self._identity, entry_id, updated, **service_kwargs
136
+ )
105
137
 
106
138
  def _delete_entry(self, stream_entry: StreamEntry, uow=None):
107
139
  entry_id = self._get_stream_entry_id(stream_entry)
@@ -110,4 +142,25 @@ class ServiceWriter(BaseWriter):
110
142
  service_kwargs = {}
111
143
  if uow:
112
144
  service_kwargs["uow"] = uow
113
- self._service.delete(self._identity, entry_id, **service_kwargs)
145
+ deletion_exceptions = []
146
+ deletion_tries = 0
147
+
148
+ # if the service has drafts, try to delete it first
149
+ if hasattr(self._service, "delete_draft"):
150
+ # delete draft
151
+ deletion_tries += 1
152
+ try:
153
+ self._service.delete_draft(self._identity, entry_id, **service_kwargs)
154
+ except Exception as e:
155
+ deletion_exceptions.append(e)
156
+
157
+ # delete the record if it was published
158
+ deletion_tries += 1
159
+ try:
160
+ self._service.delete(self._identity, entry_id, **service_kwargs)
161
+ except Exception as e:
162
+ deletion_exceptions.append(e)
163
+
164
+ if len(deletion_exceptions) == deletion_tries:
165
+ # all deletion attempts failed
166
+ raise deletion_exceptions[-1]
@@ -38,6 +38,7 @@ class RecordOwners(Generator):
38
38
  return dsl.Q("terms", **{"parent.access.owned_by.user": users})
39
39
  else:
40
40
  return dsl.Q("terms", **{"parent.owners.user": users})
41
+ return dsl.Q("match_none")
41
42
 
42
43
 
43
44
  class UserWithRole(Generator):
@@ -59,12 +60,12 @@ class UserWithRole(Generator):
59
60
  class IfDraftType(ConditionalGenerator):
60
61
  def __init__(
61
62
  self,
62
- draft_types: list[
63
- Literal["initial"] | Literal["metadata"] | Literal["new_version"]
64
- ]
65
- | Literal["initial"]
66
- | Literal["metadata"]
67
- | Literal["new_version"],
63
+ draft_types: (
64
+ list[Literal["initial"] | Literal["metadata"] | Literal["new_version"]]
65
+ | Literal["initial"]
66
+ | Literal["metadata"]
67
+ | Literal["new_version"]
68
+ ),
68
69
  then_=None,
69
70
  else_=None,
70
71
  ):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: oarepo-runtime
3
- Version: 1.5.116
3
+ Version: 1.5.117
4
4
  Summary: A set of runtime extensions of Invenio repository
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -26,7 +26,7 @@ oarepo_runtime/datastreams/datastreams.py,sha256=N9XXwIaBTADkPhE-XG6uotMwd-8Kn0v
26
26
  oarepo_runtime/datastreams/errors.py,sha256=WyZLU53EdFJTLv6K2ooM_M6ISjLS-U1dDw6B7guOLSc,1540
27
27
  oarepo_runtime/datastreams/ext.py,sha256=ivugdVMCqwugK-5SeX14a-dMq6VaTt7DM2wFU357tR4,1406
28
28
  oarepo_runtime/datastreams/fixtures.py,sha256=LTzRLoS3hkdP7a7wX3fCNWplaxh0DQQjxGto3p1_Luk,8691
29
- oarepo_runtime/datastreams/json.py,sha256=OAiaH93eqpH5qNQSPKKc8K-hXKAn5lB0PUKwwZFqJSw,153
29
+ oarepo_runtime/datastreams/json.py,sha256=OkIkGKUawtYoGelyS5V92DVk7Ei7SlkMMny2Ue2dDWc,132
30
30
  oarepo_runtime/datastreams/semi_asynchronous.py,sha256=kNc6BBnV6oFoY9kHgf5l8fd1wibRfI0dwyzLtu4fmUA,2940
31
31
  oarepo_runtime/datastreams/synchronous.py,sha256=t5lfnMkLqy3jK5zMl-nIuA0HlMPiHGjwCqZ8XQP-3GM,2595
32
32
  oarepo_runtime/datastreams/transformers.py,sha256=q5KzHPl2kJg7HP1BtKJ7F_UMqg_7L1ZGDX0O7s8D6UI,521
@@ -41,8 +41,8 @@ oarepo_runtime/datastreams/readers/yaml.py,sha256=U4nyJQ8ocM_ohp-eUN1RjVoNzYV9z7
41
41
  oarepo_runtime/datastreams/writers/__init__.py,sha256=PWufWNrixFhXv5wSv3_pzmrimroqVB2DVgTxVtY5FCg,526
42
42
  oarepo_runtime/datastreams/writers/attachments_file.py,sha256=kV_IPAWawJ9PX-IfoncmLQXpdTbzRMsJie8uKX1vNp0,3161
43
43
  oarepo_runtime/datastreams/writers/attachments_service.py,sha256=g_tbjUA3YnTE5gP21zlG2kIxneZsn0q95EVjlxB8s1M,4152
44
- oarepo_runtime/datastreams/writers/publish.py,sha256=rU1HgIR2OO1CyA_QBe1MGHiZmcfKthrLYYlw6Laj9Gk,1795
45
- oarepo_runtime/datastreams/writers/service.py,sha256=PvCxYASDxOqT6iyL6cjw0aH41LaC1vwob4W3vnE9XmA,3920
44
+ oarepo_runtime/datastreams/writers/publish.py,sha256=Fq2GJ6-We_CMzft_kegQYt7bEYCN-2knMCX_B8Z6McI,2078
45
+ oarepo_runtime/datastreams/writers/service.py,sha256=GUnXVuRlJaBo19s7oeSG-vpFenah-NTursrX08UP-B4,6010
46
46
  oarepo_runtime/datastreams/writers/utils.py,sha256=Lk_ZLNeXTLuFEn04lw1-6bJ7duG6kwA8X4wf9c_GiL4,1067
47
47
  oarepo_runtime/datastreams/writers/validation_errors.py,sha256=wOCXdniR6so_4ExpdFYYgBRyENp7_6kVFZM2L-Hy3G8,661
48
48
  oarepo_runtime/datastreams/writers/yaml.py,sha256=XchUJHQ58E2Mfgs8elImXbL38jFtI8Hfoye6yaR0gKI,1482
@@ -115,7 +115,7 @@ oarepo_runtime/services/files/__init__.py,sha256=K8MStrEQf_BUhvzhwPTF93Hkhwrd1dt
115
115
  oarepo_runtime/services/files/components.py,sha256=x6Wd-vvkqTqB1phj2a6h42DNQksN8PuR2XKaOGoNHfw,2400
116
116
  oarepo_runtime/services/files/service.py,sha256=8DH0Pefr9kilM2JnOb-UYsnqerE8Z1Mu4p6DOJ4j_ZU,608
117
117
  oarepo_runtime/services/permissions/__init__.py,sha256=33zqKGgRQmRfNZI8kAhue1bFoT1deYiVVNinP8Bvv0I,123
118
- oarepo_runtime/services/permissions/generators.py,sha256=fuG0zp940l5AcAQmjGnOcF8vnCPmGUGKHsPYMOpGsYY,3288
118
+ oarepo_runtime/services/permissions/generators.py,sha256=XjirYTCk2dNZTf5wrRdKaCxYNj9GVYBPiMPR0pkt_Eo,3337
119
119
  oarepo_runtime/services/records/__init__.py,sha256=hIoa2fx1AkDr6c-MgY561U2oN9LFeUCtfbVnetpBUOg,78
120
120
  oarepo_runtime/services/records/links.py,sha256=gVe-_hGkLtX7pd6sS6jTbRIhBby2FTn9PXyYPy3yxzs,737
121
121
  oarepo_runtime/services/relations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -148,9 +148,9 @@ tests/marshmallow_to_json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
148
148
  tests/marshmallow_to_json/test_datacite_ui_schema.py,sha256=82iLj8nW45lZOUewpWbLX3mpSkpa9lxo-vK-Qtv_1bU,48552
149
149
  tests/marshmallow_to_json/test_simple_schema.py,sha256=izZN9p0v6kovtSZ6AdxBYmK_c6ZOti2_z_wPT_zXIr0,1500
150
150
  tests/pkg_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
- oarepo_runtime-1.5.116.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
152
- oarepo_runtime-1.5.116.dist-info/METADATA,sha256=LNOfs1J6JK78j9wPKZqLc1lH1Ggm2hTQK3sP4ST-Dpo,4721
153
- oarepo_runtime-1.5.116.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
154
- oarepo_runtime-1.5.116.dist-info/entry_points.txt,sha256=k7O5LZUOGsVeSpB7ulU0txBUNp1CVQG7Q7TJIVTPbzU,491
155
- oarepo_runtime-1.5.116.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
156
- oarepo_runtime-1.5.116.dist-info/RECORD,,
151
+ oarepo_runtime-1.5.117.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
152
+ oarepo_runtime-1.5.117.dist-info/METADATA,sha256=-s_-K_vzg58ylIqaV1IsY4lRLFCOonbvEU5sfHlt4wI,4721
153
+ oarepo_runtime-1.5.117.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
154
+ oarepo_runtime-1.5.117.dist-info/entry_points.txt,sha256=k7O5LZUOGsVeSpB7ulU0txBUNp1CVQG7Q7TJIVTPbzU,491
155
+ oarepo_runtime-1.5.117.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
156
+ oarepo_runtime-1.5.117.dist-info/RECORD,,