oarepo-runtime 2.0.0.dev29__py3-none-any.whl → 2.0.0.dev31__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.
@@ -19,6 +19,6 @@ from .api import Model
19
19
  from .ext import OARepoRuntime
20
20
  from .proxies import current_runtime
21
21
 
22
- __version__ = "2.0.0dev29"
22
+ __version__ = "2.0.0dev31"
23
23
 
24
24
  __all__ = ("Model", "OARepoRuntime", "__version__", "current_runtime")
oarepo_runtime/api.py CHANGED
@@ -24,6 +24,7 @@ if TYPE_CHECKING:
24
24
  from collections.abc import Mapping
25
25
 
26
26
  from flask_babel.speaklater import LazyString
27
+ from flask_resources.deserializers import DeserializerMixin
27
28
  from flask_resources.responses import ResponseHandler
28
29
  from flask_resources.serializers import BaseSerializer
29
30
  from invenio_drafts_resources.records.api import Draft
@@ -92,6 +93,26 @@ class Export:
92
93
  """Description of the export format, human readable."""
93
94
 
94
95
 
96
+ @dataclasses.dataclass
97
+ class Import:
98
+ """Configuration of an import format."""
99
+
100
+ code: str
101
+ """Code of the import format, used to identify the import format in the URL."""
102
+
103
+ name: LazyString
104
+ """Name of the import format, human readable."""
105
+
106
+ mimetype: str
107
+ """MIME type of the import format."""
108
+
109
+ deserializer: DeserializerMixin
110
+ """Deserializer used to deserialize the record into the import format."""
111
+
112
+ description: LazyString | None = None
113
+ """Description of the import format, human readable."""
114
+
115
+
95
116
  class Model[
96
117
  S: RecordService = RecordService,
97
118
  C: RecordServiceConfig = RecordServiceConfig,
@@ -131,6 +152,7 @@ class Model[
131
152
  records_alias_enabled: bool = True,
132
153
  model_metadata: ModelMetadata | None = None,
133
154
  features: Mapping[str, Any] | None = None,
155
+ imports: list[Import] | None = None,
134
156
  ):
135
157
  """Initialize the model configuration.
136
158
 
@@ -155,6 +177,8 @@ class Model[
155
177
  Such models will be searchable via the `/api/records` endpoint.
156
178
  :param model_metadata: Metadata of the model.
157
179
  :param features: Features of the model. Filled by the feature presets themselves during registration.
180
+ :param imports: List of import formats that can be used to import the record.
181
+ If not provided, no imports are available.
158
182
  """
159
183
  self._code = code
160
184
  self._name = name
@@ -176,6 +200,7 @@ class Model[
176
200
  self._resource = resource
177
201
  self._resource_config = resource_config
178
202
  self._exports = exports or []
203
+ self._imports = imports or []
179
204
  self._model_metadata = model_metadata
180
205
  self._features = features
181
206
 
@@ -358,3 +383,8 @@ class Model[
358
383
  def features(self) -> Mapping[str, Any] | None:
359
384
  """Get a mapping of features."""
360
385
  return self._features
386
+
387
+ @property
388
+ def imports(self) -> list[Import]:
389
+ """Get all importable request body parsers."""
390
+ return self._imports
@@ -16,13 +16,12 @@ import logging
16
16
  import os
17
17
  import re
18
18
  from functools import cached_property
19
- from typing import TYPE_CHECKING, Any, ClassVar, cast
19
+ from typing import TYPE_CHECKING, Any, ClassVar, Protocol, cast
20
20
  from urllib.parse import urljoin, urlparse, urlunparse
21
21
 
22
22
  import marshmallow as ma
23
23
  from flask import Blueprint, Flask, current_app, request, url_for
24
24
  from flask_resources import (
25
- Resource,
26
25
  ResourceConfig,
27
26
  from_conf,
28
27
  request_parser,
@@ -30,6 +29,7 @@ from flask_resources import (
30
29
  response_handler,
31
30
  route,
32
31
  )
32
+ from flask_resources.resources import Resource as BaseResource
33
33
  from invenio_base import invenio_url_for
34
34
  from invenio_base.utils import obj_or_import_string
35
35
  from invenio_jsonschemas import current_jsonschemas
@@ -38,16 +38,30 @@ from invenio_records_resources.proxies import (
38
38
  )
39
39
  from werkzeug.routing import BuildError
40
40
 
41
+ from oarepo_runtime.proxies import current_runtime
42
+
41
43
  if TYPE_CHECKING:
42
44
  from invenio_records.systemfields import ConstantField
43
45
  from invenio_records_resources.records.api import Record
44
46
 
45
47
  from oarepo_runtime import Model
46
- from oarepo_runtime.proxies import current_runtime
47
48
 
48
49
  logger = logging.getLogger("oarepo_runtime.info")
49
50
 
50
51
 
52
+ class InfoComponent(Protocol):
53
+ """Info component protocol."""
54
+
55
+ def __init__(self, resource: InfoResource) -> None:
56
+ """Create the component."""
57
+
58
+ def repository(self, data: dict) -> None:
59
+ """Modify repository info endpoint data."""
60
+
61
+ def model(self, data: list[dict]) -> None:
62
+ """Modify model info endpoint data."""
63
+
64
+
51
65
  class InfoConfig(ResourceConfig):
52
66
  """Info resource config."""
53
67
 
@@ -62,16 +76,19 @@ class InfoConfig(ResourceConfig):
62
76
  self.app = app
63
77
 
64
78
  @cached_property
65
- def components(self) -> tuple[object, ...]:
79
+ def components(self) -> tuple[type[InfoComponent], ...]:
66
80
  """Get the components for the info resource from config."""
67
- return tuple(obj_or_import_string(x) for x in self.app.config.get("INFO_ENDPOINT_COMPONENTS", []))
81
+ return tuple(
82
+ cast("type[InfoComponent]", obj_or_import_string(x))
83
+ for x in self.app.config.get("INFO_ENDPOINT_COMPONENTS", [])
84
+ )
68
85
 
69
86
 
70
87
  schema_view_args = request_parser(from_conf("schema_view_args"), location="view_args")
71
88
  model_view_args = request_parser(from_conf("model_view_args"), location="view_args")
72
89
 
73
90
 
74
- class InfoResource(Resource):
91
+ class InfoResource(BaseResource):
75
92
  """Info resource."""
76
93
 
77
94
  def create_url_rules(self) -> list[dict[str, Any]]:
@@ -149,6 +166,7 @@ class InfoResource(Resource):
149
166
  feature_keys.append("files")
150
167
  return feature_keys
151
168
 
169
+ # TODO: this should be done differently - we should add this to the model
152
170
  def _get_model_html_endpoint(self, model: Model) -> Any:
153
171
  base = self._get_model_api_endpoint(model)
154
172
  if not base:
@@ -160,7 +178,7 @@ class InfoResource(Resource):
160
178
  try:
161
179
  alias = model.api_blueprint_name
162
180
  return model.api_url("search", type=alias, _external=True)
163
- except BuildError:
181
+ except BuildError: # pragma: no cover
164
182
  logger.exception("Failed to get model api endpoint")
165
183
  return None
166
184
 
@@ -181,7 +199,7 @@ class InfoResource(Resource):
181
199
  service = model.service
182
200
  service_class = model.service.__class__
183
201
  if not service or not isinstance(service, service_class):
184
- continue
202
+ continue # pragma: no cover - sanity check
185
203
 
186
204
  model_features = self._get_model_features(model)
187
205
 
@@ -13,13 +13,14 @@ from __future__ import annotations
13
13
 
14
14
  from typing import TYPE_CHECKING
15
15
 
16
+ from flask_resources import RequestBodyParser
16
17
  from flask_resources.responses import ResponseHandler
17
18
  from invenio_records_resources.resources.records.headers import etag_headers
18
19
 
19
20
  if TYPE_CHECKING:
20
21
  from collections.abc import Iterable
21
22
 
22
- from oarepo_runtime.api import Export
23
+ from oarepo_runtime.api import Export, Import
23
24
 
24
25
 
25
26
  def exports_to_response_handlers(
@@ -33,3 +34,10 @@ def exports_to_response_handlers(
33
34
  )
34
35
  for export in exports
35
36
  }
37
+
38
+
39
+ def imports_to_request_body_parsers(
40
+ imports: Iterable[Import],
41
+ ) -> dict[str, RequestBodyParser]:
42
+ """Convert imports to a dictionary of mimetype -> request body parsers."""
43
+ return {import_option.mimetype: RequestBodyParser(import_option.deserializer) for import_option in imports}
@@ -12,76 +12,71 @@
12
12
 
13
13
  from __future__ import annotations
14
14
 
15
- from collections.abc import Collection
16
- from typing import ClassVar
17
-
18
15
  from invenio_records_permissions import RecordPermissionPolicy
19
16
  from invenio_records_permissions.generators import AnyUser, Generator, SystemProcess
20
17
 
21
- type GeneratorList = Collection[Generator]
22
-
23
18
 
24
19
  class EveryonePermissionPolicy(RecordPermissionPolicy):
25
20
  """Record policy for read-only repository."""
26
21
 
27
- can_search: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
28
- can_read: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
29
- can_create: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
30
- can_update: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
31
- can_delete: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
32
- can_manage: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
22
+ can_search: tuple[Generator, ...] = (SystemProcess(), AnyUser())
23
+ can_read: tuple[Generator, ...] = (SystemProcess(), AnyUser())
24
+ can_create: tuple[Generator, ...] = (SystemProcess(), AnyUser())
25
+ can_update: tuple[Generator, ...] = (SystemProcess(), AnyUser())
26
+ can_delete: tuple[Generator, ...] = (SystemProcess(), AnyUser())
27
+ can_manage: tuple[Generator, ...] = (SystemProcess(), AnyUser())
33
28
 
34
- can_create_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
35
- can_set_content_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
36
- can_get_content_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
37
- can_commit_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
38
- can_read_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
39
- can_update_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
40
- can_delete_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
41
- can_list_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
42
- can_manage_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
29
+ can_create_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
30
+ can_set_content_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
31
+ can_get_content_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
32
+ can_commit_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
33
+ can_read_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
34
+ can_update_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
35
+ can_delete_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
36
+ can_list_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
37
+ can_manage_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
43
38
 
44
- can_edit: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
45
- can_new_version: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
46
- can_search_drafts: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
47
- can_read_draft: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
48
- can_search_versions: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
49
- can_update_draft: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
50
- can_delete_draft: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
51
- can_publish: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
52
- can_draft_create_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
53
- can_draft_set_content_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
54
- can_draft_get_content_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
55
- can_draft_commit_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
56
- can_draft_read_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
57
- can_draft_update_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
58
- can_draft_delete_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
39
+ can_edit: tuple[Generator, ...] = (SystemProcess(), AnyUser())
40
+ can_new_version: tuple[Generator, ...] = (SystemProcess(), AnyUser())
41
+ can_search_drafts: tuple[Generator, ...] = (SystemProcess(), AnyUser())
42
+ can_read_draft: tuple[Generator, ...] = (SystemProcess(), AnyUser())
43
+ can_search_versions: tuple[Generator, ...] = (SystemProcess(), AnyUser())
44
+ can_update_draft: tuple[Generator, ...] = (SystemProcess(), AnyUser())
45
+ can_delete_draft: tuple[Generator, ...] = (SystemProcess(), AnyUser())
46
+ can_publish: tuple[Generator, ...] = (SystemProcess(), AnyUser())
47
+ can_draft_create_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
48
+ can_draft_set_content_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
49
+ can_draft_get_content_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
50
+ can_draft_commit_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
51
+ can_draft_read_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
52
+ can_draft_update_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
53
+ can_draft_delete_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
59
54
 
60
- can_add_community: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
61
- can_remove_community: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
55
+ can_add_community: tuple[Generator, ...] = (SystemProcess(), AnyUser())
56
+ can_remove_community: tuple[Generator, ...] = (SystemProcess(), AnyUser())
62
57
 
63
- can_read_deleted: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
64
- can_manage_record_access: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
65
- can_lift_embargo: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
58
+ can_read_deleted: tuple[Generator, ...] = (SystemProcess(), AnyUser())
59
+ can_manage_record_access: tuple[Generator, ...] = (SystemProcess(), AnyUser())
60
+ can_lift_embargo: tuple[Generator, ...] = (SystemProcess(), AnyUser())
66
61
 
67
- can_draft_media_create_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
68
- can_draft_media_read_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
69
- can_draft_media_set_content_files: ClassVar[GeneratorList] = (
62
+ can_draft_media_create_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
63
+ can_draft_media_read_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
64
+ can_draft_media_set_content_files: tuple[Generator, ...] = (
70
65
  SystemProcess(),
71
66
  AnyUser(),
72
67
  )
73
- can_draft_media_get_content_files: ClassVar[GeneratorList] = (
68
+ can_draft_media_get_content_files: tuple[Generator, ...] = (
74
69
  SystemProcess(),
75
70
  AnyUser(),
76
71
  )
77
- can_draft_media_commit_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
78
- can_draft_media_update_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
79
- can_draft_media_delete_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
72
+ can_draft_media_commit_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
73
+ can_draft_media_update_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
74
+ can_draft_media_delete_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
80
75
 
81
- can_media_read_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
82
- can_media_get_content_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
83
- can_media_create_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
84
- can_media_set_content_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
85
- can_media_commit_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
86
- can_media_update_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
87
- can_media_delete_files: ClassVar[GeneratorList] = (SystemProcess(), AnyUser())
76
+ can_media_read_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
77
+ can_media_get_content_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
78
+ can_media_create_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
79
+ can_media_set_content_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
80
+ can_media_commit_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
81
+ can_media_update_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
82
+ can_media_delete_files: tuple[Generator, ...] = (SystemProcess(), AnyUser())
@@ -14,6 +14,38 @@ from __future__ import annotations
14
14
  from invenio_records_resources.services.base.links import EndpointLink
15
15
 
16
16
 
17
+ def rdm_pagination_record_endpoint_links(endpoint: str, params: list[str] | None = None) -> dict[str, EndpointLink]:
18
+ """Create pagination links (prev/self/next) from the same endpoint.
19
+
20
+ These links are used on a record instance where we want to have a list of something,
21
+ for example /records/<pid>/versions.
22
+
23
+ Note: using RecordEndpointLink here is fragile as it normally expects
24
+ a record as the first argument to vars, but here we pass pagination
25
+ as the first argument to vars. Because pagination does not have pid_value
26
+ attribute, the vars method will just skip adding pid_value to vars and
27
+ the pid_value must be passed via params. This is done in invenio_rdm_records'
28
+ service but not in invenio_drafts_resources service, where the parameter is
29
+ called "id" instead of "pid_value". That is why this function is called rdm_...
30
+ """
31
+ params = [*(params or []), "pid_value"]
32
+ return {
33
+ "prev": EndpointLink(
34
+ endpoint,
35
+ when=lambda pagination, _ctx: pagination.has_prev,
36
+ vars=lambda pagination, _vars: _vars["args"].update({"page": pagination.prev_page.page}),
37
+ params=params,
38
+ ),
39
+ "self": EndpointLink(endpoint, params=params),
40
+ "next": EndpointLink(
41
+ endpoint,
42
+ when=lambda pagination, _ctx: pagination.has_next,
43
+ vars=lambda pagination, _vars: _vars["args"].update({"page": pagination.next_page.page}),
44
+ params=params,
45
+ ),
46
+ }
47
+
48
+
17
49
  def pagination_endpoint_links_html(endpoint: str, params: list[str] | None = None) -> dict[str, EndpointLink]:
18
50
  """Create pagination links (prev/self/next) from the same endpoint."""
19
51
  return {
@@ -73,7 +73,13 @@ class LocalizedDate(LocalizedMixin, FormatDate):
73
73
  class FormatTimeString(FormatTime):
74
74
  """Time formater."""
75
75
 
76
- def parse(self, value: Any, as_time: bool = False, as_date: bool = False, as_datetime: bool = False) -> Any:
76
+ def parse(
77
+ self,
78
+ value: Any,
79
+ as_time: bool = False,
80
+ as_date: bool = False,
81
+ as_datetime: bool = False,
82
+ ) -> Any:
77
83
  """Parse date value."""
78
84
  if value and isinstance(value, str) and as_time:
79
85
  match = re.match(r"^(\d|0\d|1\d|2[0-3]):(\d|[0-5]\d|60)(:(\d|[0-5]\d|60))?$", value)
@@ -98,7 +104,12 @@ class MultilayerFormatEDTF(BabelFormatField):
98
104
  return format_edtf(value, format=self._format, locale=self.locale)
99
105
 
100
106
  def parse(
101
- self, value: str, as_time: bool = False, as_date: bool = False, as_datetime: bool = False, **kwargs: Any
107
+ self,
108
+ value: str,
109
+ as_time: bool = False,
110
+ as_date: bool = False,
111
+ as_datetime: bool = False,
112
+ **kwargs: Any,
102
113
  ) -> Any:
103
114
  """Parse date value."""
104
115
  _, _, _ = as_time, as_date, as_datetime
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oarepo-runtime
3
- Version: 2.0.0.dev29
3
+ Version: 2.0.0.dev31
4
4
  Summary: A set of runtime extensions of Invenio repository
5
5
  Project-URL: Homepage, https://github.com/oarepo/oarepo-runtime
6
6
  License-Expression: MIT
@@ -1,5 +1,5 @@
1
- oarepo_runtime/__init__.py,sha256=-4q567a5EN2E15vN5XKgWTxD1CQQl2NpfVzsJTG6GzA,686
2
- oarepo_runtime/api.py,sha256=5MjhNwwjbbS7w7aql6pg8haKvqqr8QBmZBqJkWRWEw4,13237
1
+ oarepo_runtime/__init__.py,sha256=kswOtKLkeTENZ1q_4do3W0XvIcgjL7ZEe6rxHa7M5Gg,686
2
+ oarepo_runtime/api.py,sha256=tLPgKv1iao2ZeL0tTJeA85019_sMW_dQAleayOeXjgI,14200
3
3
  oarepo_runtime/config.py,sha256=RUEPFn_5bKp9Wb0OY-Fb3VK30m35vF5IsLjYaQHhP3g,3838
4
4
  oarepo_runtime/ext.py,sha256=NgiRNl_hwTvEWcXnNwVh_XCPJyvwr3dZkdPmkWvN1xo,8785
5
5
  oarepo_runtime/proxies.py,sha256=x8Y1iTP8QIzSI67s90VR0_5fvXuT1xlJXtAHsaoXFwg,903
@@ -8,7 +8,7 @@ oarepo_runtime/typing.py,sha256=vH8UUb4QTJowuvibwHaOOEwxx8i21LcOeplxJl0Yrew,1594
8
8
  oarepo_runtime/cli/__init__.py,sha256=H7GOeOBf0udgKWOdlAQswIMvRrD8BwcEjOVxIqP0Suw,731
9
9
  oarepo_runtime/cli/search.py,sha256=4fHkrjltUUPVUzJiuWaiWxTk62rIYxal3_3jRsZVMmI,1175
10
10
  oarepo_runtime/info/__init__.py,sha256=qRG3mSyoiw7sKm9StiuBJs6l15HrdAQ4sphsAQsJtQc,336
11
- oarepo_runtime/info/views.py,sha256=PRfVaSsrQywE0lDpiLgDkor0xWzzYEQPkgHW7ITtQAc,16339
11
+ oarepo_runtime/info/views.py,sha256=-ZBKkJgzaaYDU5cS7DuG5Cem4M42ohQ-LN6BaCXjo1I,16967
12
12
  oarepo_runtime/records/__init__.py,sha256=AbWzmVCY7MhrpdEeI0e3lKzeugPMUSo8T08-NBVeig4,339
13
13
  oarepo_runtime/records/drafts.py,sha256=b45ROjd9lwy6ratrpAruimcKvQmJradk5JgILoBAHmY,1965
14
14
  oarepo_runtime/records/mapping.py,sha256=fn6M208axxBqHtRV6qKQukwUw1z0hq_KF4qfuB2rr98,2630
@@ -19,14 +19,14 @@ oarepo_runtime/records/systemfields/mapping.py,sha256=HC9QnY6J6Ftw-DwotKUTvnyRif
19
19
  oarepo_runtime/records/systemfields/publication_status.py,sha256=1g3VXNPh0FsiPCpe-7ZuaMEF4x8ffrDrt37Rqnjp0ng,2027
20
20
  oarepo_runtime/records/systemfields/selectors.py,sha256=ijVDwAXaXTV5NtcXsrALkhddgCogLNe2eEscFr23qyg,1656
21
21
  oarepo_runtime/resources/__init__.py,sha256=voynQULXoOEviADkbOpekMphZPTAz4IOTg5BF9xPwTM,453
22
- oarepo_runtime/resources/config.py,sha256=hJewyZ2FlEm4TtYnQS9JsnKnA6hhtSbvo1PC24-7f7Y,980
22
+ oarepo_runtime/resources/config.py,sha256=Lbx1QPWAJ8z1truhYntbnhGGWp2OCcwqKm6BuvPJNT0,1330
23
23
  oarepo_runtime/services/__init__.py,sha256=OGtBgEeaDTyk2RPDNXuKbU9_7egFBZr42SM0gN5FrF4,341
24
24
  oarepo_runtime/services/generators.py,sha256=8Z2QGzob4c2vaaNqhcMZsRybmwtOt30Plgf3EFmcJXw,4622
25
25
  oarepo_runtime/services/results.py,sha256=qzoIQW5-ShL1YJDgPjfTlPnsgfEZhojNehhHNTUxRgI,7120
26
26
  oarepo_runtime/services/config/__init__.py,sha256=SX1kfIGk8HkohdLQrNpRQUTltksEyDcCa-kFXxrX4e8,711
27
27
  oarepo_runtime/services/config/components.py,sha256=cyU-JeMzLuBL-9JkUKbUQuu527WAq0yptGs6806XSho,23039
28
28
  oarepo_runtime/services/config/link_conditions.py,sha256=T1ZZ5SbbvIfujm0oJx73s_ku3WmeFqElAOZJwPFTw2o,4388
29
- oarepo_runtime/services/config/permissions.py,sha256=T4vsymzd3ZMznzYQNXhqv4u72oMfJH1lfOGtK0Vq_gQ,4742
29
+ oarepo_runtime/services/config/permissions.py,sha256=Ynkn9cXyf9wlyTahi6syJuGwvawkRsixLN_OL79WjIc,4532
30
30
  oarepo_runtime/services/facets/__init__.py,sha256=k39ZYt1dMVOW01QRSTgx3CfuTYwvEWmL0VYTR3huVsE,349
31
31
  oarepo_runtime/services/facets/base.py,sha256=EkYrZZzhcHoKZ9Ml6scT2YrIU1h5WeWU7My2EJbTfEE,1018
32
32
  oarepo_runtime/services/facets/date.py,sha256=8LIsNjV7NHjIciStdHV_lNsGO5KF9WOBhuFj_pxhEag,2213
@@ -35,14 +35,14 @@ oarepo_runtime/services/facets/params.py,sha256=8ZFDeTUPDV3d9cdIIECo5F38KQ28h1eG
35
35
  oarepo_runtime/services/facets/utils.py,sha256=z4RcBqM4_QfTSMY-mf8yhL18bhHg5XwzHmqV6mLtzvs,2251
36
36
  oarepo_runtime/services/records/__init__.py,sha256=Mpohx3xEXTmoodTEHbCih6I97JIofgqa_bf_Ysq4e2g,446
37
37
  oarepo_runtime/services/records/custom_fields.py,sha256=Yp3WsLYq1_OPMmJvpxCDtZi9IhuxHsBFPor8q901qn0,1417
38
- oarepo_runtime/services/records/links.py,sha256=APq4yog2rRV3AfnuiTrow-egUTcdB3RSbnGaq5_l60M,1225
38
+ oarepo_runtime/services/records/links.py,sha256=XzO8zEV7GgbkrhX98x9aq4Jn5v5yWAsh2Gy8rjDcCw0,2729
39
39
  oarepo_runtime/services/records/mapping.py,sha256=y3oeToKEnaRYpMV3q2-2cXNzyzyL3XXGvY26BifybpE,1332
40
40
  oarepo_runtime/services/schema/__init__.py,sha256=jgAPI_uKC6Ug4KQWnwQVg3-aNaw-eHja323AUFo5ELo,351
41
41
  oarepo_runtime/services/schema/i18n.py,sha256=9D1zOQaPKAnYzejB0vO-m2BJYnam0N0Lrq4jID7twfE,3174
42
42
  oarepo_runtime/services/schema/i18n_ui.py,sha256=DbusphhGDeaobTt4nuwNgKZ6Houlu4Sv3SuMGkdjRRY,3582
43
- oarepo_runtime/services/schema/ui.py,sha256=6HPRMOytE7UQnGd4Z21kvYTpX5p_g2TmP2_v4pwkU8w,4524
44
- oarepo_runtime-2.0.0.dev29.dist-info/METADATA,sha256=gsUPMUKG3ihVSmVHmWT8N3szgm2f3WpCQfrpbOA4hkI,4723
45
- oarepo_runtime-2.0.0.dev29.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
46
- oarepo_runtime-2.0.0.dev29.dist-info/entry_points.txt,sha256=rOfs8R1oXFN_dLH9zAZ6ydkvr83mDajegc6NBIRsCMQ,318
47
- oarepo_runtime-2.0.0.dev29.dist-info/licenses/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
48
- oarepo_runtime-2.0.0.dev29.dist-info/RECORD,,
43
+ oarepo_runtime/services/schema/ui.py,sha256=Y_jBO-fowkpOgceWz8aqJSJAUiAnKLGSIuNpjNLnp8Q,4612
44
+ oarepo_runtime-2.0.0.dev31.dist-info/METADATA,sha256=P9qthmoamo_Dr8eSQJQ8LYfvxbQgw9mwTO2wDiqQoM0,4723
45
+ oarepo_runtime-2.0.0.dev31.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
46
+ oarepo_runtime-2.0.0.dev31.dist-info/entry_points.txt,sha256=rOfs8R1oXFN_dLH9zAZ6ydkvr83mDajegc6NBIRsCMQ,318
47
+ oarepo_runtime-2.0.0.dev31.dist-info/licenses/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
48
+ oarepo_runtime-2.0.0.dev31.dist-info/RECORD,,