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.
@@ -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(MappingSystemFieldMixin):
9
+ class FeaturedFileFieldResult:
10
10
  def __init__(self, record=None):
11
11
  super().__init__()
12
12
  self.record = record
13
13
 
14
- def search_dump(self, data):
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(self.record):
29
+ ) == type(record):
19
30
  file_service = get_file_service_for_record_service(
20
31
  record_service=current_service_registry._services[service],
21
- record=self.record,
32
+ record=record,
22
33
  )
23
34
 
24
- files = file_service.list_files(system_identity, self.record["id"])
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
- self.record["metadata"].update({"featured": file})
34
- self.record.commit()
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(MappingSystemFieldMixin, ICUField):
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(MappingSystemFieldMixin, ICUField):
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(MappingSystemFieldMixin, ICUField):
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(MappingSystemFieldMixin):
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.PERMISSIONS_PRESETS # noqa (omitted here because of the order of mixins)
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: oarepo-runtime
3
- Version: 1.5.7
3
+ Version: 1.5.10
4
4
  Summary: A set of runtime extensions of Invenio repository
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -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=4_SXyGNMxAANeYOGrT4QLJmzVdF4FFeTP_n4T9KZ3M8,1725
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=-vGPbVkEUS53dIm50pEcRlk1T6h002s7fBY4Ic2X75c,5951
60
- oarepo_runtime/records/systemfields/mapping.py,sha256=GJeQUwH-J2Gxtd9cpzGUT0bxirObXkwCZ33_Q6WZTK0,787
61
- oarepo_runtime/records/systemfields/record_status.py,sha256=iXasHCIc-veaOHyiSpxHL8CWNpleh_BDBybkv79iqb0,945
62
- oarepo_runtime/records/systemfields/synthetic.py,sha256=kX_cSz5llbBXMjpK6MTjci1zah641eqV3ivXs5fZpcs,2448
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=Uzo3rJGWljbkLcWd-E1BJOEglJHli8eUSIgFTJt9sXE,1566
72
- oarepo_runtime/services/custom_fields/__init__.py,sha256=HVqgIIoPqg-pJHkP1KY_Phe-9fSD0RsnF02H5OS9wCM,2262
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.7.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
112
- oarepo_runtime-1.5.7.dist-info/METADATA,sha256=SHRsje7uchCfZ6fsSFhN26JCbGrwYexHiQI0DYNgVpg,4786
113
- oarepo_runtime-1.5.7.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
114
- oarepo_runtime-1.5.7.dist-info/entry_points.txt,sha256=QrlXAKuPDVBinaSh_v3yO9_Nb9ZNmJCJ0VFcCW-z0Jg,327
115
- oarepo_runtime-1.5.7.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
116
- oarepo_runtime-1.5.7.dist-info/RECORD,,
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,,