oarepo-runtime 1.5.11__py3-none-any.whl → 1.5.13__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,7 @@
1
1
  from .icu import ICUField, ICUSortField, ICUSuggestField
2
2
  from .mapping import MappingSystemFieldMixin, SystemFieldDumperExt
3
+ from .selectors import FirstItemSelector, PathSelector, Selector
4
+ from .synthetic import SyntheticSystemField
3
5
 
4
6
  __all__ = (
5
7
  "ICUField",
@@ -7,4 +9,8 @@ __all__ = (
7
9
  "ICUSortField",
8
10
  "MappingSystemFieldMixin",
9
11
  "SystemFieldDumperExt",
12
+ "SyntheticSystemField",
13
+ "PathSelector",
14
+ "Selector",
15
+ "FirstItemSelector",
10
16
  )
@@ -19,12 +19,10 @@ class MappingSystemFieldMixin:
19
19
  @classmethod
20
20
  def search_dump(cls, data, record):
21
21
  """Dump custom field."""
22
- pass
23
22
 
24
23
  @classmethod
25
24
  def search_load(cls, data, record_cls):
26
25
  """Load custom field."""
27
- pass
28
26
 
29
27
 
30
28
  class SystemFieldDumperExt(SearchDumperExt):
@@ -0,0 +1,38 @@
1
+ from typing import List
2
+
3
+
4
+ class Selector:
5
+ def select(self, record):
6
+ return []
7
+
8
+
9
+ class PathSelector:
10
+ def __init__(self, *paths):
11
+ self.paths = [x.split(".") for x in paths]
12
+
13
+ def select(self, record):
14
+ ret = []
15
+ for path in self.paths:
16
+ for rec in getter(record, path):
17
+ ret.append(rec)
18
+ return ret
19
+
20
+
21
+ class FirstItemSelector(PathSelector):
22
+ def select(self, record):
23
+ for rec in super().select(record):
24
+ return [rec]
25
+
26
+
27
+ def getter(data, path: List):
28
+ if len(path) == 0:
29
+ if isinstance(data, list):
30
+ yield from data
31
+ else:
32
+ yield data
33
+ elif isinstance(data, dict):
34
+ if path[0] in data:
35
+ yield from getter(data[path[0]], path[1:])
36
+ elif isinstance(data, list):
37
+ for item in data:
38
+ yield from getter(item, path)
@@ -12,20 +12,23 @@ class SyntheticSystemField(MappingSystemFieldMixin, SystemField):
12
12
  the record is being indexed.
13
13
 
14
14
  Usage:
15
-
16
- 1. Create a new class that inherits from SyntheticSystemField
17
- 2. Implement the _value method that returns the value of the field from a data (
18
- either a dictionary or an instance of the record class)
19
- 3. Put the class onto the record. If you use oarepo-model-builder, add it to the model
15
+ 1. Check if any of the provided selectors (oarepo_runtime.records.systemfields.selectors)
16
+ are usable for your use case. If not, create a subclass of Selector class.
17
+ 2. Put this class onto the record. If you use oarepo-model-builder, add it to the model
20
18
  like:
21
19
  ```yaml
22
20
  record:
23
21
  record:
24
- extra-code: |-2
25
- # extra custom fields for facets
26
- faculty = {{common.theses.synthetic_fields.FacultySystemField}}()
27
- department = {{common.theses.synthetic_fields.DepartmentSystemField}}()
28
- defenseYear = {{common.theses.synthetic_fields.DefenseYearSystemField}}()
22
+ imports:
23
+ - oarepo_runtime.records.systemfields.SyntheticSystemField
24
+ - oarepo_vocabularies.records.selectors.LevelSelector
25
+ fields:
26
+ faculty = SyntheticSystemField(selector=LevelSelector("metadata.thesis.degreeGrantors", level=1))
27
+ department = SyntheticSystemField(selector=LevelSelector("metadata.thesis.degreeGrantors", level=2))
28
+ defenseYear = |
29
+ SyntheticSystemField(selector=PathSelector("metadata.thesis.dateDefended"),
30
+ transformer=lambda x: x[:4]
31
+ )
29
32
  ```
30
33
 
31
34
  4. Add the extra fields to the mapping and facets. If using oarepo-model-builder, add it to the
@@ -62,13 +65,32 @@ class SyntheticSystemField(MappingSystemFieldMixin, SystemField):
62
65
  ```
63
66
  """
64
67
 
68
+ def __init__(self, selector=None, filter=None, map=None, key=None, **kwargs):
69
+ self.selector = selector
70
+ self.map = map
71
+ self.filter = filter
72
+ super().__init__(key=key, **kwargs)
73
+
65
74
  def search_dump(self, data, record):
66
75
  dt = self._value(data)
67
76
  if dt:
68
- data[self.key] = dt
77
+ key = self.key.split(".")
78
+ d = data
79
+ for k in key[:-1]:
80
+ d = d.setdefault(k, {})
81
+ d[key[-1]] = dt
69
82
 
70
83
  def search_load(self, data, record_cls):
71
- data.pop(self.key, None)
84
+ def remove_key(d, key):
85
+ if len(key) == 1:
86
+ d.pop(key[0], None)
87
+ else:
88
+ if not isinstance(d, dict) or key[0] not in d:
89
+ return
90
+ remove_key(d[key[0]], key[1:])
91
+ if not d[key[0]]:
92
+ d.pop(key[0])
93
+ remove_key(data, self.key.split("."))
72
94
 
73
95
  def __get__(self, record, owner=None):
74
96
  if record is None:
@@ -76,4 +98,14 @@ class SyntheticSystemField(MappingSystemFieldMixin, SystemField):
76
98
  return self._value(record)
77
99
 
78
100
  def _value(self, data):
79
- raise NotImplementedError("You must implement the _value method")
101
+ if self.selector:
102
+ value = list(self.selector.select(data))
103
+ if self.filter:
104
+ value = [x for x in value if self.filter(x)]
105
+ if self.map:
106
+ value = [self.map(x) for x in value]
107
+ value = [x for x in value if x is not None]
108
+ return value
109
+ raise ValueError(
110
+ "Please either provide a selector or subclass this class and implement a _value method"
111
+ )
@@ -54,8 +54,7 @@ class PermissionsPresetsConfigMixin:
54
54
  """
55
55
  registered_preset_classes = current_app.config["OAREPO_PERMISSIONS_PRESETS"]
56
56
  preset_classes = [
57
- registered_preset_classes[x]
58
- for x in cls._get_permissions_presets()
57
+ registered_preset_classes[x] for x in cls._get_permissions_presets()
59
58
  ]
60
59
  if hasattr(cls, "base_permission_policy_cls"):
61
60
  preset_classes.insert(0, cls.base_permission_policy_cls)
@@ -72,7 +71,9 @@ class PermissionsPresetsConfigMixin:
72
71
  config_key = cls._get_presents_config_key()
73
72
  if config_key in current_app.config:
74
73
  return current_app.config[config_key]
75
- return cls.PERMISSIONS_PRESETS # noqa (omitted here because of the order of mixins)
74
+ return (
75
+ cls.PERMISSIONS_PRESETS
76
+ ) # noqa (omitted here because of the order of mixins)
76
77
 
77
78
  @classmethod
78
79
  def _get_presents_config_key(cls):
@@ -93,5 +94,5 @@ class PermissionsPresetsConfigMixin:
93
94
  name = cls.__name__
94
95
  if name.endswith("Config"):
95
96
  name = name[:-6]
96
- name = re.sub(r'(?<!^)(?=[A-Z])', '_', name).upper()
97
+ name = re.sub(r"(?<!^)(?=[A-Z])", "_", name).upper()
97
98
  return f"{name}_PERMISSIONS_PRESETS"
@@ -1,4 +1,3 @@
1
-
2
1
  from invenio_records_resources.services.records.results import (
3
2
  RecordItem as BaseRecordItem,
4
3
  )
@@ -24,9 +24,9 @@ class class_property:
24
24
  self.__name__ = info.__name__
25
25
  self.__module__ = info.__module__
26
26
 
27
- def __get__(self, obj, type=None): # NOSONAR - this is a descriptor
27
+ def __get__(self, obj, type=None): # NOSONAR - this is a descriptor
28
28
  if obj and type is None:
29
- type = obj.__class__ # NOSONAR - this is a descriptor
29
+ type = obj.__class__ # NOSONAR - this is a descriptor
30
30
  return self.__get.__get__(obj, type)()
31
31
 
32
32
  def __set__(self, obj, value):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: oarepo-runtime
3
- Version: 1.5.11
3
+ Version: 1.5.13
4
4
  Summary: A set of runtime extensions of Invenio repository
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -53,22 +53,23 @@ oarepo_runtime/records/relations/base.py,sha256=XQpRt6-MfIKIClZ0IoGJr0GGl2Ru3Rcq
53
53
  oarepo_runtime/records/relations/internal.py,sha256=OTp8iJqyl80sWDk0Q0AK42l6UsxZDABspVU_GwWza9o,1556
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
- oarepo_runtime/records/systemfields/__init__.py,sha256=JpDSVry8TWvUNGlR7AXd_D9NDLiVN2xg9qxjNit96Sw,257
56
+ oarepo_runtime/records/systemfields/__init__.py,sha256=SPaMWM6t-azz6gZLUKvvXbOyE2_-LW6i_szQk8nhbAc,455
57
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
59
  oarepo_runtime/records/systemfields/icu.py,sha256=tAwplzy9y7C9Dm7HqcGZsDu2AKqVGXhCbKLsFlgVWg8,5921
60
- oarepo_runtime/records/systemfields/mapping.py,sha256=VYnexDmo1p3Vc3Hp34V_h8-OHzAh4129UZFE6T-FXbM,1043
60
+ oarepo_runtime/records/systemfields/mapping.py,sha256=tXOK_jkdY1pOUO7_VfChfDNB8UTi21GUXaidpugTnO8,1017
61
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
62
+ oarepo_runtime/records/systemfields/selectors.py,sha256=bgH6oalv9rPPC-EVwt8-DdkUl7EX0UOgfynN51DZauI,882
63
+ oarepo_runtime/records/systemfields/synthetic.py,sha256=hXBDEcyqWtytPhwypC5ZKDhF4Gr3kVoq3lhpBsUNvrY,3729
63
64
  oarepo_runtime/resources/__init__.py,sha256=v8BGrOTu_FjKzd0eozV7Q4GoGxyfybsL2cI-tbP5Pys,185
64
65
  oarepo_runtime/resources/file_resource.py,sha256=Ta3bFce7l0xwqkkOMOEu9mxbB8BbKj5HUHRHmidhnl8,414
65
66
  oarepo_runtime/resources/localized_ui_json_serializer.py,sha256=4Kle34k-_uu3Y9JJ2vAXcQ9DqYRxXgy-_iZhiFuukmE,1684
66
67
  oarepo_runtime/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
- oarepo_runtime/services/results.py,sha256=DsBPniwhNvOkYucS8Z0v3EC28LemY7JuZNVhl_17PhA,1500
68
+ oarepo_runtime/services/results.py,sha256=F3A0U3MRUOYlxNglJPQeGMKdD8QNq1il106jQZ0c9gQ,1499
68
69
  oarepo_runtime/services/search.py,sha256=ywfwGH7oAM44WeOSjlIsY_qoCMZJ1TlTLd_NgE2ow3Y,5296
69
70
  oarepo_runtime/services/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
71
  oarepo_runtime/services/config/permissions_presets.py,sha256=zApeA-2DYAlD--SzVz3vq_OFjq48Ko0pe08e4o2vxr4,6114
71
- oarepo_runtime/services/config/service.py,sha256=4ox1M4fhZ5PWvYn4NoC4Gq4ORQOiih-TVjMuB4t3Weo,3868
72
+ oarepo_runtime/services/config/service.py,sha256=8qFLIqDi2zPby4Y-vgGlf1iJIBJOsEEsaw1t8ml96H8,3880
72
73
  oarepo_runtime/services/custom_fields/__init__.py,sha256=xJ7XEyMJHPfIgX5JKpgpwh7SYc9Zee2dC5oC8cm99Qc,2282
73
74
  oarepo_runtime/services/custom_fields/mappings.py,sha256=1mb8nYeUlQxbBolsKURGKUIpIV1NDb-7Mcur32jjIjg,4433
74
75
  oarepo_runtime/services/expansions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -105,12 +106,12 @@ oarepo_runtime/translations/cs/LC_MESSAGES/messages.po,sha256=vGZQo5NlTtj_qsJuDw
105
106
  oarepo_runtime/translations/en/LC_MESSAGES/messages.mo,sha256=FKAl1wlg2NhtQ1-9U2dkUwcotR959j5GuUKJygCYpwI,445
106
107
  oarepo_runtime/translations/en/LC_MESSAGES/messages.po,sha256=rZ2PGvkcJbmuwrWeFX5edk0zJIzZnL83M9HSAceDP_U,1193
107
108
  oarepo_runtime/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
- oarepo_runtime/utils/functools.py,sha256=36XnrIiVCtL35FFLp1_UmNdgQT60cZu2C4IyNMVoads,1339
109
+ oarepo_runtime/utils/functools.py,sha256=7V-aMkAscc5qyGawGS8jmwqfdW2Wpjxe-u8DKgB8meI,1325
109
110
  oarepo_runtime/utils/path.py,sha256=V1NVyk3m12_YLbj7QHYvUpE1wScO78bYsX1LOLeXDkI,3108
110
111
  tests/pkg_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
- oarepo_runtime-1.5.11.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
112
- oarepo_runtime-1.5.11.dist-info/METADATA,sha256=bQsW_ZE6ze4cMzc-CRqkHf3m-wAnbgr0ZFAs95kXJe4,4787
113
- oarepo_runtime-1.5.11.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
114
- oarepo_runtime-1.5.11.dist-info/entry_points.txt,sha256=QrlXAKuPDVBinaSh_v3yO9_Nb9ZNmJCJ0VFcCW-z0Jg,327
115
- oarepo_runtime-1.5.11.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
116
- oarepo_runtime-1.5.11.dist-info/RECORD,,
112
+ oarepo_runtime-1.5.13.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
113
+ oarepo_runtime-1.5.13.dist-info/METADATA,sha256=JHKX3me9P-WP93ItF4WVIfeIgB0wFFug0MYiV3cJBoA,4787
114
+ oarepo_runtime-1.5.13.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
115
+ oarepo_runtime-1.5.13.dist-info/entry_points.txt,sha256=QrlXAKuPDVBinaSh_v3yO9_Nb9ZNmJCJ0VFcCW-z0Jg,327
116
+ oarepo_runtime-1.5.13.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
117
+ oarepo_runtime-1.5.13.dist-info/RECORD,,