oarepo-runtime 1.5.7__py3-none-any.whl → 1.5.10__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.
- oarepo_runtime/records/systemfields/featured_file.py +18 -18
- oarepo_runtime/records/systemfields/icu.py +6 -6
- oarepo_runtime/records/systemfields/mapping.py +13 -3
- oarepo_runtime/records/systemfields/record_status.py +8 -8
- oarepo_runtime/records/systemfields/synthetic.py +3 -3
- oarepo_runtime/services/config/service.py +49 -2
- oarepo_runtime/services/custom_fields/__init__.py +2 -2
- {oarepo_runtime-1.5.7.dist-info → oarepo_runtime-1.5.10.dist-info}/METADATA +1 -1
- {oarepo_runtime-1.5.7.dist-info → oarepo_runtime-1.5.10.dist-info}/RECORD +13 -13
- {oarepo_runtime-1.5.7.dist-info → oarepo_runtime-1.5.10.dist-info}/LICENSE +0 -0
- {oarepo_runtime-1.5.7.dist-info → oarepo_runtime-1.5.10.dist-info}/WHEEL +0 -0
- {oarepo_runtime-1.5.7.dist-info → oarepo_runtime-1.5.10.dist-info}/entry_points.txt +0 -0
- {oarepo_runtime-1.5.7.dist-info → oarepo_runtime-1.5.10.dist-info}/top_level.txt +0 -0
@@ -6,22 +6,33 @@ from oarepo_runtime.datastreams.utils import get_file_service_for_record_service
|
|
6
6
|
from oarepo_runtime.records.systemfields.mapping import MappingSystemFieldMixin
|
7
7
|
|
8
8
|
|
9
|
-
class FeaturedFileFieldResult
|
9
|
+
class FeaturedFileFieldResult:
|
10
10
|
def __init__(self, record=None):
|
11
11
|
super().__init__()
|
12
12
|
self.record = record
|
13
13
|
|
14
|
-
|
14
|
+
|
15
|
+
class FeaturedFileField(MappingSystemFieldMixin, SystemField):
|
16
|
+
def __init__(self, source_field):
|
17
|
+
super(FeaturedFileField, self).__init__(source_field)
|
18
|
+
|
19
|
+
def __get__(self, instance, owner):
|
20
|
+
if instance is None:
|
21
|
+
return self
|
22
|
+
result = FeaturedFileFieldResult(record=instance)
|
23
|
+
return result
|
24
|
+
|
25
|
+
def search_dump(self, data, record):
|
15
26
|
for service in current_service_registry._services:
|
16
27
|
if getattr(
|
17
28
|
current_service_registry._services[service], "record_cls"
|
18
|
-
) == type(
|
29
|
+
) == type(record):
|
19
30
|
file_service = get_file_service_for_record_service(
|
20
31
|
record_service=current_service_registry._services[service],
|
21
|
-
record=
|
32
|
+
record=record,
|
22
33
|
)
|
23
34
|
|
24
|
-
files = file_service.list_files(system_identity,
|
35
|
+
files = file_service.list_files(system_identity, record["id"])
|
25
36
|
file_list = list(files.entries)
|
26
37
|
|
27
38
|
for file in file_list:
|
@@ -30,16 +41,5 @@ class FeaturedFileFieldResult(MappingSystemFieldMixin):
|
|
30
41
|
and "featured" in file["metadata"]
|
31
42
|
and file["metadata"]["featured"]
|
32
43
|
):
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
class FeaturedFileField(SystemField):
|
38
|
-
def __init__(self, source_field):
|
39
|
-
super(FeaturedFileField, self).__init__()
|
40
|
-
|
41
|
-
def __get__(self, instance, owner):
|
42
|
-
if instance is None:
|
43
|
-
return None
|
44
|
-
result = FeaturedFileFieldResult(record=instance)
|
45
|
-
return result
|
44
|
+
record["metadata"].update({"featured": file})
|
45
|
+
record.commit()
|
@@ -8,7 +8,7 @@ from oarepo_runtime.records.relations.lookup import lookup_key
|
|
8
8
|
from oarepo_runtime.records.systemfields.mapping import MappingSystemFieldMixin
|
9
9
|
|
10
10
|
|
11
|
-
class ICUField(SystemField):
|
11
|
+
class ICUField(MappingSystemFieldMixin, SystemField):
|
12
12
|
"""
|
13
13
|
A system field that acts as an opensearch "proxy" to another field.
|
14
14
|
It creates a top-level mapping field with the same name and copies
|
@@ -44,20 +44,20 @@ class ICUField(SystemField):
|
|
44
44
|
ret.append(val)
|
45
45
|
return ret
|
46
46
|
|
47
|
-
def search_dump(self, data):
|
47
|
+
def search_dump(self, data, record):
|
48
48
|
ret = {}
|
49
49
|
for lang in self.languages:
|
50
50
|
ret[lang] = self.get_values(data, lang)
|
51
51
|
data[self.attr_name] = ret
|
52
52
|
|
53
|
-
def search_load(self, data):
|
53
|
+
def search_load(self, data, record_cls):
|
54
54
|
data.pop(self.attr_name, None)
|
55
55
|
|
56
56
|
def __get__(self, instance, owner):
|
57
57
|
return self
|
58
58
|
|
59
59
|
|
60
|
-
class ICUSortField(
|
60
|
+
class ICUSortField(ICUField):
|
61
61
|
"""
|
62
62
|
A field that adds icu sorting field
|
63
63
|
"""
|
@@ -83,7 +83,7 @@ class ICUSortField(MappingSystemFieldMixin, ICUField):
|
|
83
83
|
}
|
84
84
|
|
85
85
|
|
86
|
-
class ICUSuggestField(
|
86
|
+
class ICUSuggestField(ICUField):
|
87
87
|
"""
|
88
88
|
A field that adds icu-aware suggestion field
|
89
89
|
"""
|
@@ -132,7 +132,7 @@ class ICUSuggestField(MappingSystemFieldMixin, ICUField):
|
|
132
132
|
}
|
133
133
|
|
134
134
|
|
135
|
-
class ICUSearchField(
|
135
|
+
class ICUSearchField(ICUField):
|
136
136
|
"""
|
137
137
|
A field that adds stemming-aware search field
|
138
138
|
"""
|
@@ -16,18 +16,28 @@ class MappingSystemFieldMixin:
|
|
16
16
|
def dynamic_templates(self):
|
17
17
|
return []
|
18
18
|
|
19
|
+
@classmethod
|
20
|
+
def search_dump(cls, data, record):
|
21
|
+
"""Dump custom field."""
|
22
|
+
pass
|
23
|
+
|
24
|
+
@classmethod
|
25
|
+
def search_load(cls, data, record_cls):
|
26
|
+
"""Load custom field."""
|
27
|
+
pass
|
28
|
+
|
19
29
|
|
20
30
|
class SystemFieldDumperExt(SearchDumperExt):
|
21
31
|
def dump(self, record, data):
|
22
32
|
"""Dump custom fields."""
|
23
33
|
for cf in inspect.getmembers(
|
24
|
-
record, lambda x: isinstance(x, MappingSystemFieldMixin)
|
34
|
+
type(record), lambda x: isinstance(x, MappingSystemFieldMixin)
|
25
35
|
):
|
26
|
-
cf[1].search_dump(data)
|
36
|
+
cf[1].search_dump(data, record=record)
|
27
37
|
|
28
38
|
def load(self, data, record_cls):
|
29
39
|
"""Load custom fields."""
|
30
40
|
for cf in inspect.getmembers(
|
31
41
|
record_cls, lambda x: isinstance(x, MappingSystemFieldMixin)
|
32
42
|
):
|
33
|
-
cf[1].search_load(data)
|
43
|
+
cf[1].search_load(data, record_cls=record_cls)
|
@@ -3,17 +3,11 @@ from invenio_records.systemfields import SystemField
|
|
3
3
|
from .mapping import MappingSystemFieldMixin
|
4
4
|
|
5
5
|
|
6
|
-
class RecordStatusResult
|
6
|
+
class RecordStatusResult:
|
7
7
|
def __init__(self, record, attr_name):
|
8
8
|
self.record = record
|
9
9
|
self.attr_name = attr_name
|
10
10
|
|
11
|
-
def search_dump(self, data):
|
12
|
-
if getattr(self.record, "is_draft"):
|
13
|
-
data[self.attr_name] = "draft"
|
14
|
-
else:
|
15
|
-
data[self.attr_name] = "published"
|
16
|
-
|
17
11
|
|
18
12
|
class RecordStatusSystemField(MappingSystemFieldMixin, SystemField):
|
19
13
|
@property
|
@@ -24,9 +18,15 @@ class RecordStatusSystemField(MappingSystemFieldMixin, SystemField):
|
|
24
18
|
},
|
25
19
|
}
|
26
20
|
|
27
|
-
def search_load(self, data):
|
21
|
+
def search_load(self, data, record_cls):
|
28
22
|
data.pop(self.attr_name, None)
|
29
23
|
|
24
|
+
def search_dump(self, data, record):
|
25
|
+
if getattr(record, "is_draft"):
|
26
|
+
data[self.attr_name] = "draft"
|
27
|
+
else:
|
28
|
+
data[self.attr_name] = "published"
|
29
|
+
|
30
30
|
def __get__(self, record, owner=None):
|
31
31
|
"""Accessing the attribute."""
|
32
32
|
# Class access
|
@@ -62,13 +62,13 @@ class SyntheticSystemField(MappingSystemFieldMixin, SystemField):
|
|
62
62
|
```
|
63
63
|
"""
|
64
64
|
|
65
|
-
def search_dump(self, data):
|
65
|
+
def search_dump(self, data, record):
|
66
66
|
dt = self._value(data)
|
67
67
|
if dt:
|
68
68
|
data[self.key] = dt
|
69
69
|
|
70
|
-
def search_load(self, data):
|
71
|
-
data.pop(self.key)
|
70
|
+
def search_load(self, data, record_cls):
|
71
|
+
data.pop(self.key, None)
|
72
72
|
|
73
73
|
def __get__(self, record, owner=None):
|
74
74
|
if record is None:
|
@@ -1,14 +1,22 @@
|
|
1
1
|
import inspect
|
2
|
+
import re
|
2
3
|
from functools import cached_property
|
4
|
+
from typing import List, Type
|
3
5
|
|
4
6
|
from flask import current_app
|
7
|
+
from invenio_records_permissions import BasePermissionPolicy
|
5
8
|
|
6
9
|
|
7
10
|
class PermissionsPresetsConfigMixin:
|
8
11
|
components = tuple()
|
12
|
+
PERMISSIONS_PRESETS_CONFIG_KEY = None
|
13
|
+
# PERMISSIONS_PRESETS = [] # noqa (omitted here because of the order of mixins)
|
9
14
|
|
10
15
|
@cached_property
|
11
16
|
def permission_policy_cls(self):
|
17
|
+
"""
|
18
|
+
Returns a class that contains all permissions from the presets.
|
19
|
+
"""
|
12
20
|
presets = self._get_preset_classes()
|
13
21
|
|
14
22
|
permissions = {}
|
@@ -32,12 +40,51 @@ class PermissionsPresetsConfigMixin:
|
|
32
40
|
continue
|
33
41
|
yield permission_name, permission_needs
|
34
42
|
|
35
|
-
def _get_preset_classes(self):
|
43
|
+
def _get_preset_classes(self) -> List[Type[BasePermissionPolicy]]:
|
44
|
+
"""
|
45
|
+
Returns a list of permission presets classes to be used for this service.
|
46
|
+
|
47
|
+
The list is read from the configuration, if it exists, otherwise it returns
|
48
|
+
the default value from the class attribute PERMISSIONS_PRESETS.
|
49
|
+
"""
|
36
50
|
registered_preset_classes = current_app.config["OAREPO_PERMISSIONS_PRESETS"]
|
37
51
|
preset_classes = [
|
38
52
|
registered_preset_classes[x]
|
39
|
-
for x in self.
|
53
|
+
for x in self._get_permissions_presets()
|
40
54
|
]
|
41
55
|
if hasattr(self, "base_permission_policy_cls"):
|
42
56
|
preset_classes.insert(0, self.base_permission_policy_cls)
|
43
57
|
return preset_classes
|
58
|
+
|
59
|
+
def _get_permissions_presets(self):
|
60
|
+
"""
|
61
|
+
Returns a list of names of permissions presets to be used for this service.
|
62
|
+
|
63
|
+
The list is read from the configuration, if it exists, otherwise it returns
|
64
|
+
the default value from the class attribute PERMISSIONS_PRESETS.
|
65
|
+
"""
|
66
|
+
config_key = self._get_presents_config_key()
|
67
|
+
if config_key in current_app.config:
|
68
|
+
return current_app.config[config_key]
|
69
|
+
return self.PERMISSIONS_PRESETS # noqa (omitted here because of the order of mixins)
|
70
|
+
|
71
|
+
def _get_presents_config_key(self):
|
72
|
+
"""
|
73
|
+
Returns the name of the configuration key that contains the list of
|
74
|
+
permissions presets to be used for this service.
|
75
|
+
|
76
|
+
The key is read from the class attribute PERMISSIONS_PRESETS_CONFIG_KEY.
|
77
|
+
If it is not set, the key is generated from the name of the service
|
78
|
+
configuration class (MyServiceConfig becomes MY_SERVICE_PERMISSIONS_PRESETS).
|
79
|
+
"""
|
80
|
+
if self.PERMISSIONS_PRESETS_CONFIG_KEY:
|
81
|
+
return self.PERMISSIONS_PRESETS_CONFIG_KEY
|
82
|
+
|
83
|
+
# use the base class of the service config file (e.g. MyServiceConfig),
|
84
|
+
# remove the "Config" part and convert it to snake uppercase.
|
85
|
+
# add "_PERMISSIONS_PRESETS" at the end.
|
86
|
+
name = type(self).__name__
|
87
|
+
if name.endswith("Config"):
|
88
|
+
name = name[:-6]
|
89
|
+
name = re.sub(r'(?<!^)(?=[A-Z])', '_', name).upper()
|
90
|
+
return f"{name}_PERMISSIONS_PRESETS"
|
@@ -21,14 +21,14 @@ class CustomFieldsMixin(MappingSystemFieldMixin):
|
|
21
21
|
def mapping_settings(self):
|
22
22
|
return {}
|
23
23
|
|
24
|
-
def search_dump(self, data):
|
24
|
+
def search_dump(self, data, record):
|
25
25
|
custom_fields = current_app.config.get(self.config_key, {})
|
26
26
|
|
27
27
|
for cf in custom_fields:
|
28
28
|
cf.dump(data, cf_key=self.key)
|
29
29
|
return data
|
30
30
|
|
31
|
-
def search_load(self, data):
|
31
|
+
def search_load(self, data, record_cls):
|
32
32
|
custom_fields = current_app.config.get(self.config_key, {})
|
33
33
|
|
34
34
|
for cf in custom_fields:
|
@@ -54,12 +54,12 @@ oarepo_runtime/records/relations/internal.py,sha256=OTp8iJqyl80sWDk0Q0AK42l6UsxZ
|
|
54
54
|
oarepo_runtime/records/relations/lookup.py,sha256=wi3jPfOedazOmhOMrgu50PUETc1jfSdpmjK0wvOFsEM,848
|
55
55
|
oarepo_runtime/records/relations/pid_relation.py,sha256=zJjSf_ocFBViYsOuMMZLbQZpNZeKiOK33dPD4tk74Qo,2786
|
56
56
|
oarepo_runtime/records/systemfields/__init__.py,sha256=JpDSVry8TWvUNGlR7AXd_D9NDLiVN2xg9qxjNit96Sw,257
|
57
|
-
oarepo_runtime/records/systemfields/featured_file.py,sha256=
|
57
|
+
oarepo_runtime/records/systemfields/featured_file.py,sha256=MbSaYR130_o5S9gEOblnChq-PVK4xGPGpSCrzwG3cwc,1720
|
58
58
|
oarepo_runtime/records/systemfields/has_draftcheck.py,sha256=3XLRsZJWRpT4BFF1HTg6C27ECVmIcZ4RrdGzYC8S7v0,1518
|
59
|
-
oarepo_runtime/records/systemfields/icu.py,sha256
|
60
|
-
oarepo_runtime/records/systemfields/mapping.py,sha256=
|
61
|
-
oarepo_runtime/records/systemfields/record_status.py,sha256=
|
62
|
-
oarepo_runtime/records/systemfields/synthetic.py,sha256=
|
59
|
+
oarepo_runtime/records/systemfields/icu.py,sha256=tAwplzy9y7C9Dm7HqcGZsDu2AKqVGXhCbKLsFlgVWg8,5921
|
60
|
+
oarepo_runtime/records/systemfields/mapping.py,sha256=VYnexDmo1p3Vc3Hp34V_h8-OHzAh4129UZFE6T-FXbM,1043
|
61
|
+
oarepo_runtime/records/systemfields/record_status.py,sha256=U3kem4-JkNsT17e0iAl3HIAZ2MvO5lY_0U757aZvTKE,935
|
62
|
+
oarepo_runtime/records/systemfields/synthetic.py,sha256=6dKPNSXDYv-iNKtgZB7_GDm0Y7ESZB3jb0aDRKPK2YA,2474
|
63
63
|
oarepo_runtime/resources/__init__.py,sha256=v8BGrOTu_FjKzd0eozV7Q4GoGxyfybsL2cI-tbP5Pys,185
|
64
64
|
oarepo_runtime/resources/file_resource.py,sha256=Ta3bFce7l0xwqkkOMOEu9mxbB8BbKj5HUHRHmidhnl8,414
|
65
65
|
oarepo_runtime/resources/localized_ui_json_serializer.py,sha256=4Kle34k-_uu3Y9JJ2vAXcQ9DqYRxXgy-_iZhiFuukmE,1684
|
@@ -68,8 +68,8 @@ oarepo_runtime/services/results.py,sha256=DsBPniwhNvOkYucS8Z0v3EC28LemY7JuZNVhl_
|
|
68
68
|
oarepo_runtime/services/search.py,sha256=ywfwGH7oAM44WeOSjlIsY_qoCMZJ1TlTLd_NgE2ow3Y,5296
|
69
69
|
oarepo_runtime/services/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
70
70
|
oarepo_runtime/services/config/permissions_presets.py,sha256=zApeA-2DYAlD--SzVz3vq_OFjq48Ko0pe08e4o2vxr4,6114
|
71
|
-
oarepo_runtime/services/config/service.py,sha256=
|
72
|
-
oarepo_runtime/services/custom_fields/__init__.py,sha256=
|
71
|
+
oarepo_runtime/services/config/service.py,sha256=7U-iC5Or51-T2tvWkB6WHQJ0tNVcyEKQutT1Ldl2I7w,3648
|
72
|
+
oarepo_runtime/services/custom_fields/__init__.py,sha256=xJ7XEyMJHPfIgX5JKpgpwh7SYc9Zee2dC5oC8cm99Qc,2282
|
73
73
|
oarepo_runtime/services/custom_fields/mappings.py,sha256=1mb8nYeUlQxbBolsKURGKUIpIV1NDb-7Mcur32jjIjg,4433
|
74
74
|
oarepo_runtime/services/expansions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
75
75
|
oarepo_runtime/services/expansions/expandable_fields.py,sha256=7DWKFL6ml8J7zGI6wm9LO7Xd6R0LSylsuq4lyRumNHQ,745
|
@@ -108,9 +108,9 @@ oarepo_runtime/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
108
108
|
oarepo_runtime/utils/functools.py,sha256=eueB-4MRv9wrOARs70ey21JvBb63gGeJV6m1fdGcnPQ,319
|
109
109
|
oarepo_runtime/utils/path.py,sha256=V1NVyk3m12_YLbj7QHYvUpE1wScO78bYsX1LOLeXDkI,3108
|
110
110
|
tests/pkg_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
111
|
-
oarepo_runtime-1.5.
|
112
|
-
oarepo_runtime-1.5.
|
113
|
-
oarepo_runtime-1.5.
|
114
|
-
oarepo_runtime-1.5.
|
115
|
-
oarepo_runtime-1.5.
|
116
|
-
oarepo_runtime-1.5.
|
111
|
+
oarepo_runtime-1.5.10.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
|
112
|
+
oarepo_runtime-1.5.10.dist-info/METADATA,sha256=Bf_H3Lyi-01D9RxW8qUm0mLmt55_hLdoD26igXVsl4o,4787
|
113
|
+
oarepo_runtime-1.5.10.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
114
|
+
oarepo_runtime-1.5.10.dist-info/entry_points.txt,sha256=QrlXAKuPDVBinaSh_v3yO9_Nb9ZNmJCJ0VFcCW-z0Jg,327
|
115
|
+
oarepo_runtime-1.5.10.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
|
116
|
+
oarepo_runtime-1.5.10.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|