oarepo-runtime 1.5.92__py3-none-any.whl → 1.5.93__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,3 +1,3 @@
1
- from .generators import RecordOwners, UserWithRole
1
+ from .generators import IfDraftType, RecordOwners, UserWithRole
2
2
 
3
- __all__ = ("RecordOwners", "UserWithRole")
3
+ __all__ = ("RecordOwners", "UserWithRole", "IfDraftType")
@@ -1,7 +1,14 @@
1
+ from typing import Literal
2
+
3
+ from flask import current_app
1
4
  from flask_principal import RoleNeed, UserNeed
2
- from invenio_records_permissions.generators import Generator
5
+ from invenio_records_permissions.generators import (
6
+ ConditionalGenerator,
7
+ Disable,
8
+ Generator,
9
+ )
3
10
  from invenio_search.engine import dsl
4
- from flask import current_app
11
+
5
12
 
6
13
  class RecordOwners(Generator):
7
14
  """Allows record owners."""
@@ -12,7 +19,7 @@ class RecordOwners(Generator):
12
19
  # 'record' is required, so if not passed we default to empty array,
13
20
  # i.e. superuser-access.
14
21
  return []
15
- if current_app.config.get('INVENIO_RDM_ENABLED', False):
22
+ if current_app.config.get("INVENIO_RDM_ENABLED", False):
16
23
  owners = getattr(record.parent.access, "owned_by", None)
17
24
  if owners is not None:
18
25
  owners_list = owners if isinstance(owners, list) else [owners]
@@ -27,11 +34,12 @@ class RecordOwners(Generator):
27
34
  """Filters for current identity as owner."""
28
35
  users = [n.value for n in identity.provides if n.method == "id"]
29
36
  if users:
30
- if current_app.config.get('INVENIO_RDM_ENABLED', False):
37
+ if current_app.config.get("INVENIO_RDM_ENABLED", False):
31
38
  return dsl.Q("terms", **{"parent.access.owned_by.user": users})
32
39
  else:
33
40
  return dsl.Q("terms", **{"parent.owners.user": users})
34
41
 
42
+
35
43
  class UserWithRole(Generator):
36
44
  def __init__(self, *roles):
37
45
  self.roles = roles
@@ -46,3 +54,49 @@ class UserWithRole(Generator):
46
54
  if provide.method == "role" and provide.value in self.roles:
47
55
  return dsl.Q("match_all")
48
56
  return dsl.Q("match_none")
57
+
58
+
59
+ class IfDraftType(ConditionalGenerator):
60
+ def __init__(
61
+ self,
62
+ draft_types: list[
63
+ Literal["initial"] | Literal["metadata"] | Literal["new_version"]
64
+ ]
65
+ | Literal["initial"]
66
+ | Literal["metadata"]
67
+ | Literal["new_version"],
68
+ then_=None,
69
+ else_=None,
70
+ ):
71
+ if not isinstance(draft_types, (list, tuple)):
72
+ draft_types = [draft_types]
73
+ self._draft_types = draft_types
74
+ if not then_:
75
+ then_ = [Disable()]
76
+ if not else_:
77
+ else_ = [Disable()]
78
+ if not isinstance(then_, (list, tuple)):
79
+ then_ = [then_]
80
+ if not isinstance(else_, (list, tuple)):
81
+ else_ = [else_]
82
+ super().__init__(then_, else_)
83
+
84
+ def _condition(self, record=None, **kwargs):
85
+ if not record:
86
+ return False
87
+
88
+ index = record.versions.index
89
+ is_latest = record.versions.is_latest
90
+ is_draft = record.is_draft
91
+
92
+ if not is_draft:
93
+ return False
94
+
95
+ if index == 1 and not is_latest:
96
+ draft_type = "initial"
97
+ elif index > 1 and not is_latest:
98
+ draft_type = "new_version"
99
+ else:
100
+ draft_type = "metadata"
101
+
102
+ return draft_type in self._draft_types
@@ -1,10 +1,12 @@
1
1
  import typing
2
2
 
3
- import marshmallow as ma
3
+ from invenio_rdm_records.services.schemas.record import RDMRecordSchema
4
4
  from invenio_records_resources.services.records.schema import (
5
5
  BaseRecordSchema as InvenioBaseRecordSchema,
6
6
  )
7
7
 
8
+ import marshmallow as ma
9
+
8
10
 
9
11
  class BaseRecordSchema(InvenioBaseRecordSchema):
10
12
  """Base record schema - in addition to invenio exposes $schema as well."""
@@ -12,6 +14,12 @@ class BaseRecordSchema(InvenioBaseRecordSchema):
12
14
  _schema = ma.fields.Str(attribute="$schema", data_key="$schema")
13
15
 
14
16
 
17
+ class RDMBaseRecordSchema(RDMRecordSchema):
18
+ """Base record schema - in addition to invenio exposes $schema as well."""
19
+
20
+ _schema = ma.fields.Str(attribute="$schema", data_key="$schema")
21
+
22
+
15
23
  class DictOnlySchema(ma.Schema):
16
24
  def get_attribute(self, obj: typing.Any, attr: str, default: typing.Any):
17
25
  if not isinstance(attr, int) and "." in attr:
@@ -2,11 +2,18 @@ import dataclasses
2
2
  import inspect
3
3
  from typing import List
4
4
 
5
+ from invenio_rdm_records.services.config import (
6
+ RDMSearchDraftsOptions as BaseRDMSearchDraftsOptions,
7
+ )
8
+ from invenio_rdm_records.services.config import (
9
+ RDMSearchOptions as BaseRDMSearchOptions,
10
+ )
5
11
  from invenio_records_resources.proxies import current_service_registry
6
12
  from invenio_records_resources.services.records import (
7
13
  SearchOptions as InvenioSearchOptions,
8
14
  )
9
15
  from invenio_records_resources.services.records.params import (
16
+ FacetsParam,
10
17
  PaginationParam,
11
18
  QueryStrParam,
12
19
  SortParam,
@@ -17,9 +24,10 @@ from invenio_search.engine import dsl
17
24
  # TODO: integrate this to invenio_records_resources.services.records and remove SearchOptions class
18
25
  from oarepo_runtime.i18n import lazy_gettext as _
19
26
  from oarepo_runtime.records.systemfields.icu import ICUSuggestField
27
+ from oarepo_runtime.utils.functools import class_property
20
28
 
21
29
  from .facets.params import GroupedFacetsParam
22
- from invenio_rdm_records.services.config import RDMSearchOptions, RDMSearchDraftsOptions
30
+
23
31
  try:
24
32
  from invenio_i18n import get_locale
25
33
  except ImportError:
@@ -47,13 +55,16 @@ class FuzzySuggestQueryParser(SuggestQueryParser):
47
55
  return dsl.Q("bool", should=[multi_match_with_bool_prefix, multi_match_fuzzy])
48
56
 
49
57
 
50
- class SearchOptions(InvenioSearchOptions):
51
- params_interpreters_cls = [
52
- QueryStrParam,
53
- PaginationParam,
54
- SortParam,
55
- GroupedFacetsParam,
56
- ]
58
+ class SearchOptionsMixin:
59
+ @class_property
60
+ def params_interpreters_cls(cls):
61
+ """Replaces FacetsParam with GroupedFacetsParam."""
62
+ param_interpreters = [*super(SearchOptionsMixin, cls).params_interpreters_cls]
63
+ # replace FacetsParam with GroupedFacetsParam
64
+ for idx, interpreter in enumerate(param_interpreters):
65
+ if interpreter == FacetsParam:
66
+ param_interpreters[idx] = GroupedFacetsParam
67
+ return param_interpreters
57
68
 
58
69
  sort_options = {
59
70
  "title": dict(
@@ -75,6 +86,24 @@ class SearchOptions(InvenioSearchOptions):
75
86
  }
76
87
 
77
88
 
89
+ class SearchOptions(SearchOptionsMixin, InvenioSearchOptions):
90
+ # TODO: should be changed
91
+ params_interpreters_cls = [
92
+ QueryStrParam,
93
+ PaginationParam,
94
+ SortParam,
95
+ GroupedFacetsParam,
96
+ ]
97
+
98
+
99
+ class RDMSearchOptions(SearchOptionsMixin, BaseRDMSearchOptions):
100
+ pass
101
+
102
+
103
+ class RDMSearchDraftsOptions(SearchOptionsMixin, BaseRDMSearchDraftsOptions):
104
+ pass
105
+
106
+
78
107
  @dataclasses.dataclass
79
108
  class SuggestField:
80
109
  field: str
@@ -188,14 +217,17 @@ class ICUSortOptions:
188
217
  }
189
218
  return ret
190
219
 
220
+
191
221
  class I18nSearchOptions(SearchOptions):
192
222
  extra_sort_options = {}
193
223
  record_cls = None
194
224
 
225
+
195
226
  class I18nRDMSearchOptions(RDMSearchOptions):
196
227
  extra_sort_options = {}
197
228
  record_cls = None
198
229
 
230
+
199
231
  class I18nRDMDraftsSearchOptions(RDMSearchDraftsOptions):
200
232
  extra_sort_options = {}
201
233
  record_cls = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: oarepo-runtime
3
- Version: 1.5.92
3
+ Version: 1.5.93
4
4
  Summary: A set of runtime extensions of Invenio repository
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -76,7 +76,7 @@ oarepo_runtime/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
76
76
  oarepo_runtime/services/components.py,sha256=h7oQNPueuPqBD6mCRCIr7ZuNvzeliXinHjOyVV3FBvw,10775
77
77
  oarepo_runtime/services/generators.py,sha256=j87HitHA_w2awsz0C5IAAJ0qjg9JMtvdO3dvh6FQyfg,250
78
78
  oarepo_runtime/services/results.py,sha256=Ap2mUJHl3V4BSduTrBWPuco0inQVq0QsuCbVhez48uY,5705
79
- oarepo_runtime/services/search.py,sha256=39HR4LB4Q-UiodoOMA4syQTt-q7NvceiL6sGQeIHVfc,6520
79
+ oarepo_runtime/services/search.py,sha256=exCEfRAWlajVfQBZ1Qf1usYEF7Fwp5H8Lb_usOiLRS8,7422
80
80
  oarepo_runtime/services/config/__init__.py,sha256=559w4vphVAipa420OwTsxGUP-b7idoqSIX13FSJyVz0,783
81
81
  oarepo_runtime/services/config/link_conditions.py,sha256=evPRd5XU76Ok4J-08bBfplbHZ019rl74FpJmO8iM5yg,3298
82
82
  oarepo_runtime/services/config/permissions_presets.py,sha256=YF99Vjh1fGqSEXNw7qIfcUQFvzpE54_BafqkO6wlYHk,6668
@@ -102,8 +102,8 @@ oarepo_runtime/services/facets/year_histogram.py,sha256=kdfwx1lgw4UmfjdaqqeElJCB
102
102
  oarepo_runtime/services/files/__init__.py,sha256=K8MStrEQf_BUhvzhwPTF93Hkhwrd1dtv35LDo7iZeTM,268
103
103
  oarepo_runtime/services/files/components.py,sha256=x6Wd-vvkqTqB1phj2a6h42DNQksN8PuR2XKaOGoNHfw,2400
104
104
  oarepo_runtime/services/files/service.py,sha256=8DH0Pefr9kilM2JnOb-UYsnqerE8Z1Mu4p6DOJ4j_ZU,608
105
- oarepo_runtime/services/permissions/__init__.py,sha256=Cgin2Zr1fpaYr-aZcUotdmv0hsrPTUJVQt8ouvU8tuU,95
106
- oarepo_runtime/services/permissions/generators.py,sha256=y_jptL-pHDU91xJsLMR0Bfva5EXcZv6JDLZ1x7XxzKQ,1919
105
+ oarepo_runtime/services/permissions/__init__.py,sha256=33zqKGgRQmRfNZI8kAhue1bFoT1deYiVVNinP8Bvv0I,123
106
+ oarepo_runtime/services/permissions/generators.py,sha256=fuG0zp940l5AcAQmjGnOcF8vnCPmGUGKHsPYMOpGsYY,3288
107
107
  oarepo_runtime/services/records/__init__.py,sha256=hIoa2fx1AkDr6c-MgY561U2oN9LFeUCtfbVnetpBUOg,78
108
108
  oarepo_runtime/services/records/links.py,sha256=gVe-_hGkLtX7pd6sS6jTbRIhBby2FTn9PXyYPy3yxzs,737
109
109
  oarepo_runtime/services/relations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -115,7 +115,7 @@ oarepo_runtime/services/schema/cf.py,sha256=-m9seIH5VYUdxDsJlPVXS0-8f7xkpN7YfW1q
115
115
  oarepo_runtime/services/schema/i18n.py,sha256=NACu0SqXWuuwKVpBZdz4K8tVfBaCEI9YpcCtC1l1YGI,1669
116
116
  oarepo_runtime/services/schema/i18n_ui.py,sha256=MnEDW0gcZPvEODbJ6XzldxNCJ2suhfmdHQ4wkcAG6zA,2179
117
117
  oarepo_runtime/services/schema/i18n_validation.py,sha256=fyMTi2Rw-KiHv7c7HN61zGxRVa9sAjAEEkAL5wUyKNo,236
118
- oarepo_runtime/services/schema/marshmallow.py,sha256=LmcSxvbZ9jIhkNHCqqxt1SA2UNijoDmIzqli1MkoTrE,1153
118
+ oarepo_runtime/services/schema/marshmallow.py,sha256=iAMMH5MlYs59qetXAHOROvERNScfVqY9TrEIJejHCuw,1421
119
119
  oarepo_runtime/services/schema/marshmallow_to_json_schema.py,sha256=VYLnVWHOoaxWCD_gqJO8-8u1SbaPEFBjDZ5HGgGr0Ow,2027
120
120
  oarepo_runtime/services/schema/oneofschema.py,sha256=GnWH4Or_G5M0NgSmCoqMI6PBrJg5AC9RHrcB5QDKRq0,6661
121
121
  oarepo_runtime/services/schema/polymorphic.py,sha256=bAbUoTIeDBiJPYPhpLEKKZekEdkHlpqkmNxk1hN3PDw,564
@@ -135,9 +135,9 @@ tests/marshmallow_to_json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
135
135
  tests/marshmallow_to_json/test_datacite_ui_schema.py,sha256=82iLj8nW45lZOUewpWbLX3mpSkpa9lxo-vK-Qtv_1bU,48552
136
136
  tests/marshmallow_to_json/test_simple_schema.py,sha256=izZN9p0v6kovtSZ6AdxBYmK_c6ZOti2_z_wPT_zXIr0,1500
137
137
  tests/pkg_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
- oarepo_runtime-1.5.92.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
139
- oarepo_runtime-1.5.92.dist-info/METADATA,sha256=bDlBvtRuH1R-r1HPvL9teVUE_Z6a8grlHYKHLc4YaB8,4720
140
- oarepo_runtime-1.5.92.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
141
- oarepo_runtime-1.5.92.dist-info/entry_points.txt,sha256=k7O5LZUOGsVeSpB7ulU0txBUNp1CVQG7Q7TJIVTPbzU,491
142
- oarepo_runtime-1.5.92.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
143
- oarepo_runtime-1.5.92.dist-info/RECORD,,
138
+ oarepo_runtime-1.5.93.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
139
+ oarepo_runtime-1.5.93.dist-info/METADATA,sha256=utgiMZHHRhAFIpjCSNUAgZYwr2lwKD_BqHQfvKt7jJo,4720
140
+ oarepo_runtime-1.5.93.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
141
+ oarepo_runtime-1.5.93.dist-info/entry_points.txt,sha256=k7O5LZUOGsVeSpB7ulU0txBUNp1CVQG7Q7TJIVTPbzU,491
142
+ oarepo_runtime-1.5.93.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
143
+ oarepo_runtime-1.5.93.dist-info/RECORD,,