oarepo-runtime 1.5.130__py3-none-any.whl → 1.5.132__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.
@@ -0,0 +1,22 @@
1
+ from invenio_pidstore.models import PersistentIdentifier, PIDStatus
2
+
3
+
4
+ class UniversalPIDMixin:
5
+ unpid_pid_type = "unpid"
6
+ unpid_default_status = PIDStatus.REGISTERED
7
+
8
+ @classmethod
9
+ def create(cls, object_type=None, object_uuid=None, options=None, **kwargs):
10
+ pid = super().create(
11
+ object_type=object_type, object_uuid=object_uuid, options=options, **kwargs
12
+ )
13
+ assert pid.pid.pid_value is not None
14
+ control_pid = PersistentIdentifier.create(
15
+ cls.unpid_pid_type,
16
+ pid.pid.pid_value,
17
+ pid_provider=None,
18
+ object_type=object_type,
19
+ object_uuid=object_uuid,
20
+ status=cls.unpid_default_status,
21
+ )
22
+ return pid
@@ -1,3 +1,5 @@
1
+ import logging
2
+
1
3
  from invenio_records_resources.errors import _iter_errors_dict
2
4
  from invenio_records_resources.services.records.results import (
3
5
  RecordItem as BaseRecordItem,
@@ -6,6 +8,8 @@ from invenio_records_resources.services.records.results import (
6
8
  RecordList as BaseRecordList,
7
9
  )
8
10
 
11
+ log = logging.getLogger(__name__)
12
+
9
13
 
10
14
  class ResultsComponent:
11
15
  def update_data(self, identity, record, projection, expand):
@@ -44,14 +48,12 @@ class RecordItem(BaseRecordItem):
44
48
 
45
49
 
46
50
  def postprocess_error_messages(field_path: str, messages: any):
47
- """Postprocess error messages, looking for those that were not correctly processed by marshmallow/invenio.
48
-
49
- """
51
+ """Postprocess error messages, looking for those that were not correctly processed by marshmallow/invenio."""
50
52
  if not isinstance(messages, list):
51
53
  yield {"field": field_path, "messages": messages}
52
54
  else:
53
- str_messages = [ msg for msg in messages if isinstance(msg, str) ]
54
- non_str_messages = [ msg for msg in messages if not isinstance(msg, str) ]
55
+ str_messages = [msg for msg in messages if isinstance(msg, str)]
56
+ non_str_messages = [msg for msg in messages if not isinstance(msg, str)]
55
57
 
56
58
  if str_messages:
57
59
  yield {"field": field_path, "messages": str_messages}
@@ -65,11 +67,14 @@ def postprocess_errors(errors: list[dict]):
65
67
  converted_errors = []
66
68
  for error in errors:
67
69
  if error.get("messages"):
68
- converted_errors.extend(postprocess_error_messages(error["field"], error["messages"]))
70
+ converted_errors.extend(
71
+ postprocess_error_messages(error["field"], error["messages"])
72
+ )
69
73
  else:
70
74
  converted_errors.append(error)
71
75
  return converted_errors
72
76
 
77
+
73
78
  class RecordList(BaseRecordList):
74
79
  components = []
75
80
 
@@ -101,37 +106,43 @@ class RecordList(BaseRecordList):
101
106
  for hit in self._results:
102
107
  # Load dump
103
108
  hit_dict = hit.to_dict()
104
- if hit_dict.get("record_status") == "draft":
105
- record = self._service.draft_cls.loads(hit_dict)
106
- else:
107
- record = self._service.record_cls.loads(hit_dict)
108
109
 
109
- # Project the record
110
- projection = self._schema.dump(
111
- record,
112
- context=dict(
113
- identity=self._identity,
114
- record=record,
115
- ),
116
- )
117
- if hasattr(self._service.config, "links_search_item"):
118
- links_tpl = self._service.config.search_item_links_template(
119
- self._service.config.links_search_item
120
- )
121
- projection["links"] = links_tpl.expand(self._identity, record)
122
- elif self._links_item_tpl:
123
- projection["links"] = self._links_item_tpl.expand(
124
- self._identity, record
110
+ try:
111
+ # Project the record
112
+ if hit_dict.get("record_status") == "draft":
113
+ record = self._service.draft_cls.loads(hit_dict)
114
+ else:
115
+ record = self._service.record_cls.loads(hit_dict)
116
+
117
+ projection = self._schema.dump(
118
+ record,
119
+ context=dict(
120
+ identity=self._identity,
121
+ record=record,
122
+ ),
125
123
  )
126
- # todo optimization viz FieldsResolver
127
- for c in self.components:
128
- c.update_data(
129
- identity=self._identity,
130
- record=record,
131
- projection=projection,
132
- expand=self._expand,
133
- )
134
- yield projection
124
+ if hasattr(self._service.config, "links_search_item"):
125
+ links_tpl = self._service.config.search_item_links_template(
126
+ self._service.config.links_search_item
127
+ )
128
+ projection["links"] = links_tpl.expand(self._identity, record)
129
+ elif self._links_item_tpl:
130
+ projection["links"] = self._links_item_tpl.expand(
131
+ self._identity, record
132
+ )
133
+ # todo optimization viz FieldsResolver
134
+ for c in self.components:
135
+ c.update_data(
136
+ identity=self._identity,
137
+ record=record,
138
+ projection=projection,
139
+ expand=self._expand,
140
+ )
141
+ yield projection
142
+ except Exception:
143
+ # ignore record with error, put it to log so that it gets to glitchtip
144
+ # but don't break the whole search
145
+ log.exception("Error while dumping record %s", hit_dict)
135
146
 
136
147
 
137
148
  class ArrayRecordItem(RecordItem):
@@ -1,7 +1,8 @@
1
1
  import marshmallow as ma
2
- from oarepo_runtime.services.schema.marshmallow import DictOnlySchema
3
- from oarepo_vocabularies.services.ui_schema import VocabularyI18nStrUIField
4
2
  from idutils import to_url
3
+ from oarepo_vocabularies.services.ui_schema import VocabularyI18nStrUIField
4
+
5
+ from oarepo_runtime.services.schema.marshmallow import DictOnlySchema
5
6
 
6
7
 
7
8
  class RDMIdentifierWithSchemaUISchema(ma.Schema):
@@ -12,12 +13,16 @@ class RDMIdentifierWithSchemaUISchema(ma.Schema):
12
13
 
13
14
  @ma.post_dump
14
15
  def add_url(self, value, **kwargs):
15
- if "identifier" in value and "scheme" in value:
16
- url = to_url(
17
- value["identifier"], value["scheme"].lower(), url_scheme="https"
18
- )
19
- if url:
20
- value["url"] = url
16
+ try:
17
+ # ignore errors here
18
+ if "identifier" in value and "scheme" in value:
19
+ url = to_url(
20
+ value["identifier"], value["scheme"].lower(), url_scheme="https"
21
+ )
22
+ if url:
23
+ value["url"] = url
24
+ except Exception:
25
+ pass
21
26
  return value
22
27
 
23
28
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: oarepo-runtime
3
- Version: 1.5.130
3
+ Version: 1.5.132
4
4
  Summary: A set of runtime extensions of Invenio repository
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -22,6 +22,7 @@ Requires-Dist: oarepo-tools; extra == "dev"
22
22
  Provides-Extra: tests
23
23
  Requires-Dist: pytest>=7.1.2; extra == "tests"
24
24
  Requires-Dist: psutil; extra == "tests"
25
+ Dynamic: license-file
25
26
 
26
27
  # OARepo runtime
27
28
 
@@ -54,6 +54,7 @@ oarepo_runtime/info/permissions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
54
54
  oarepo_runtime/info/permissions/debug.py,sha256=2gak5W64g_AAZoX8cCII2di4G_jBo1ZvnU5ceP_u6z4,6722
55
55
  oarepo_runtime/records/__init__.py,sha256=JUf9_o09_6q4vuG43JzhSeTu7c-m_CVDSmgTQ7epYEo,1776
56
56
  oarepo_runtime/records/drafts.py,sha256=8BRmxXcKyVMBQbMMhVScPS_T7lwvR8kGKYQAxaVaD1k,1371
57
+ oarepo_runtime/records/pid_providers.py,sha256=V9KIeffLoFwjh7PDEBkpmVQb2j7w9pgKr9OlHV5g8S4,736
57
58
  oarepo_runtime/records/dumpers/__init__.py,sha256=OmzNhLdMNKibmCksnj9eTX9xPBG30dziiK3j3bAAp3k,233
58
59
  oarepo_runtime/records/dumpers/edtf_interval.py,sha256=8bE3JlaR7b33rxDc7LW9R8jcwNI66Zb07Jee6YUmlrE,1231
59
60
  oarepo_runtime/records/dumpers/multilingual_dumper.py,sha256=PbNFCLsiH4XV3E1v8xga_fzlcEImHy8OXn_UKh_8VBU,1090
@@ -87,7 +88,7 @@ oarepo_runtime/resources/responses.py,sha256=Pj-K_r-QO9B2n9STcfqsrBQu1e3iYhdEBFS
87
88
  oarepo_runtime/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
89
  oarepo_runtime/services/components.py,sha256=0aqmuNbGCQhfOI22f6mM2DxuKSTqstGOGyisOiqw9KE,15481
89
90
  oarepo_runtime/services/generators.py,sha256=j87HitHA_w2awsz0C5IAAJ0qjg9JMtvdO3dvh6FQyfg,250
90
- oarepo_runtime/services/results.py,sha256=Ap2mUJHl3V4BSduTrBWPuco0inQVq0QsuCbVhez48uY,5705
91
+ oarepo_runtime/services/results.py,sha256=MxkoMkquISMKyP6De_xOF-IzQE9wRYtq3d_OFAqqIVo,6156
91
92
  oarepo_runtime/services/search.py,sha256=t0WEe2VrbCzZ06-Jgz7C9-pc9y27BqAgTEXldEHskfk,9409
92
93
  oarepo_runtime/services/service.py,sha256=TI2ulEVlSR7HZnfPYltLl8Vf4O9fhJ7rHaV6G4HWbrc,1893
93
94
  oarepo_runtime/services/config/__init__.py,sha256=aRxCBLN9pqCgdYlF-KJYtDzt2mwJ66npdceOAZkMfa0,888
@@ -134,7 +135,7 @@ oarepo_runtime/services/schema/marshmallow_to_json_schema.py,sha256=VYLnVWHOoaxW
134
135
  oarepo_runtime/services/schema/oneofschema.py,sha256=GnWH4Or_G5M0NgSmCoqMI6PBrJg5AC9RHrcB5QDKRq0,6661
135
136
  oarepo_runtime/services/schema/polymorphic.py,sha256=bAbUoTIeDBiJPYPhpLEKKZekEdkHlpqkmNxk1hN3PDw,564
136
137
  oarepo_runtime/services/schema/rdm.py,sha256=dBy1KCJ_XYAN_cffoRqLfQVEdZOKwmSpqGdEP4OL64k,1280
137
- oarepo_runtime/services/schema/rdm_ui.py,sha256=KBTPAv4NkTNuhxIbOGzdBUXkwqKb-2q5EjWH2eTzc84,3430
138
+ oarepo_runtime/services/schema/rdm_ui.py,sha256=oXV8wGFChL84Y1xtkhZ89eZ4Ngr6RV8iavf32e4nCVI,3544
138
139
  oarepo_runtime/services/schema/ui.py,sha256=ae75YON8yNGxblywCgqX2OS9ACXHGzcN_adlLKIRUYk,7937
139
140
  oarepo_runtime/services/schema/validation.py,sha256=aRfeR-2D1XXYqI3_U5FHoFvJrYjZlpM8nB35-M_u3Qs,2300
140
141
  oarepo_runtime/translations/default_translations.py,sha256=060GBlA1ghWxfeumo6NqxCCZDb-6OezOuF6pr-_GEOQ,104
@@ -146,13 +147,13 @@ oarepo_runtime/translations/en/LC_MESSAGES/messages.po,sha256=7-5S3iINOSFSI5gVdR
146
147
  oarepo_runtime/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
148
  oarepo_runtime/utils/functools.py,sha256=gKS9YZtlIYcDvdNA9cmYO00yjiXBYV1jg8VpcRUyQyg,1324
148
149
  oarepo_runtime/utils/path.py,sha256=V1NVyk3m12_YLbj7QHYvUpE1wScO78bYsX1LOLeXDkI,3108
150
+ oarepo_runtime-1.5.132.dist-info/licenses/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
149
151
  tests/marshmallow_to_json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
152
  tests/marshmallow_to_json/test_datacite_ui_schema.py,sha256=82iLj8nW45lZOUewpWbLX3mpSkpa9lxo-vK-Qtv_1bU,48552
151
153
  tests/marshmallow_to_json/test_simple_schema.py,sha256=izZN9p0v6kovtSZ6AdxBYmK_c6ZOti2_z_wPT_zXIr0,1500
152
154
  tests/pkg_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
- oarepo_runtime-1.5.130.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
154
- oarepo_runtime-1.5.130.dist-info/METADATA,sha256=z3g1h_tsoffkQAq5whumI2ejrVxXc5uxs_2L5wV0-mo,4721
155
- oarepo_runtime-1.5.130.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
156
- oarepo_runtime-1.5.130.dist-info/entry_points.txt,sha256=k7O5LZUOGsVeSpB7ulU0txBUNp1CVQG7Q7TJIVTPbzU,491
157
- oarepo_runtime-1.5.130.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
158
- oarepo_runtime-1.5.130.dist-info/RECORD,,
155
+ oarepo_runtime-1.5.132.dist-info/METADATA,sha256=N8ZqyVaKnHlbzZMniukRmlW4Jp0U4UlTAEjciSgI7k8,4743
156
+ oarepo_runtime-1.5.132.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
157
+ oarepo_runtime-1.5.132.dist-info/entry_points.txt,sha256=k7O5LZUOGsVeSpB7ulU0txBUNp1CVQG7Q7TJIVTPbzU,491
158
+ oarepo_runtime-1.5.132.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
159
+ oarepo_runtime-1.5.132.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5