oarepo-runtime 1.5.7__py3-none-any.whl → 1.5.10__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,,