oarepo-runtime 1.5.92__tar.gz → 1.5.94__tar.gz

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.
Files changed (154) hide show
  1. {oarepo_runtime-1.5.92/oarepo_runtime.egg-info → oarepo_runtime-1.5.94}/PKG-INFO +1 -1
  2. oarepo_runtime-1.5.94/oarepo_runtime/services/permissions/__init__.py +3 -0
  3. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/permissions/generators.py +58 -4
  4. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/marshmallow.py +9 -1
  5. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/ui.py +49 -0
  6. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/search.py +67 -8
  7. oarepo_runtime-1.5.94/oarepo_runtime/translations/cs/LC_MESSAGES/messages.mo +0 -0
  8. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/translations/cs/LC_MESSAGES/messages.po +16 -0
  9. oarepo_runtime-1.5.94/oarepo_runtime/translations/en/LC_MESSAGES/messages.mo +0 -0
  10. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/translations/en/LC_MESSAGES/messages.po +16 -0
  11. oarepo_runtime-1.5.94/oarepo_runtime/translations/messages.pot +72 -0
  12. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94/oarepo_runtime.egg-info}/PKG-INFO +1 -1
  13. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/setup.cfg +1 -1
  14. oarepo_runtime-1.5.92/oarepo_runtime/services/permissions/__init__.py +0 -3
  15. oarepo_runtime-1.5.92/oarepo_runtime/translations/cs/LC_MESSAGES/messages.mo +0 -0
  16. oarepo_runtime-1.5.92/oarepo_runtime/translations/en/LC_MESSAGES/messages.mo +0 -0
  17. oarepo_runtime-1.5.92/oarepo_runtime/translations/messages.pot +0 -56
  18. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/LICENSE +0 -0
  19. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/MANIFEST.in +0 -0
  20. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/README.md +0 -0
  21. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/__init__.py +0 -0
  22. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/cli/__init__.py +0 -0
  23. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/cli/assets.py +0 -0
  24. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/cli/base.py +0 -0
  25. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/cli/cf.py +0 -0
  26. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/cli/check.py +0 -0
  27. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/cli/configuration.py +0 -0
  28. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/cli/fixtures.py +0 -0
  29. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/cli/index.py +0 -0
  30. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/cli/validate.py +0 -0
  31. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/__init__.py +0 -0
  32. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/asynchronous.py +0 -0
  33. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/catalogue.py +0 -0
  34. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/datastreams.py +0 -0
  35. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/errors.py +0 -0
  36. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/ext.py +0 -0
  37. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/fixtures.py +0 -0
  38. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/json.py +0 -0
  39. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/readers/__init__.py +0 -0
  40. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/readers/attachments.py +0 -0
  41. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/readers/excel.py +0 -0
  42. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/readers/json.py +0 -0
  43. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/readers/service.py +0 -0
  44. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/readers/yaml.py +0 -0
  45. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/semi_asynchronous.py +0 -0
  46. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/synchronous.py +0 -0
  47. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/transformers.py +0 -0
  48. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/types.py +0 -0
  49. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/utils.py +0 -0
  50. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/writers/__init__.py +0 -0
  51. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/writers/attachments_file.py +0 -0
  52. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/writers/attachments_service.py +0 -0
  53. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/writers/service.py +0 -0
  54. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/writers/utils.py +0 -0
  55. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/writers/validation_errors.py +0 -0
  56. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/datastreams/writers/yaml.py +0 -0
  57. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/ext.py +0 -0
  58. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/ext_config.py +0 -0
  59. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/i18n/__init__.py +0 -0
  60. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/info/__init__.py +0 -0
  61. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/info/check.py +0 -0
  62. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/info/views.py +0 -0
  63. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/profile.py +0 -0
  64. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/proxies.py +0 -0
  65. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/__init__.py +0 -0
  66. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/dumpers/__init__.py +0 -0
  67. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/dumpers/edtf_interval.py +0 -0
  68. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/dumpers/multilingual_dumper.py +0 -0
  69. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/entity_resolvers/__init__.py +0 -0
  70. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/entity_resolvers/proxies.py +0 -0
  71. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/mappings/__init__.py +0 -0
  72. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/mappings/rdm_parent_mapping.json +0 -0
  73. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/owners/__init__.py +0 -0
  74. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/owners/registry.py +0 -0
  75. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/relations/__init__.py +0 -0
  76. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/relations/base.py +0 -0
  77. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/relations/internal.py +0 -0
  78. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/relations/lookup.py +0 -0
  79. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/relations/pid_relation.py +0 -0
  80. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/systemfields/__init__.py +0 -0
  81. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/systemfields/featured_file.py +0 -0
  82. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/systemfields/has_draftcheck.py +0 -0
  83. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/systemfields/icu.py +0 -0
  84. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/systemfields/mapping.py +0 -0
  85. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/systemfields/owner.py +0 -0
  86. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/systemfields/record_status.py +0 -0
  87. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/systemfields/selectors.py +0 -0
  88. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/records/systemfields/synthetic.py +0 -0
  89. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/resources/__init__.py +0 -0
  90. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/resources/file_resource.py +0 -0
  91. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/resources/json_serializer.py +0 -0
  92. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/resources/localized_ui_json_serializer.py +0 -0
  93. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/__init__.py +0 -0
  94. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/components.py +0 -0
  95. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/config/__init__.py +0 -0
  96. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/config/link_conditions.py +0 -0
  97. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/config/permissions_presets.py +0 -0
  98. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/config/service.py +0 -0
  99. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/custom_fields/__init__.py +0 -0
  100. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/custom_fields/mappings.py +0 -0
  101. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/entity/__init__.py +0 -0
  102. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/entity/config.py +0 -0
  103. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/entity/schema.py +0 -0
  104. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/entity/service.py +0 -0
  105. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/expansions/__init__.py +0 -0
  106. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/expansions/expandable_fields.py +0 -0
  107. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/expansions/service.py +0 -0
  108. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/facets/__init__.py +0 -0
  109. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/facets/base.py +0 -0
  110. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/facets/date.py +0 -0
  111. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/facets/enum.py +0 -0
  112. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/facets/facet_groups_names.py +0 -0
  113. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/facets/max_facet.py +0 -0
  114. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/facets/nested_facet.py +0 -0
  115. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/facets/params.py +0 -0
  116. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/facets/year_histogram.py +0 -0
  117. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/files/__init__.py +0 -0
  118. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/files/components.py +0 -0
  119. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/files/service.py +0 -0
  120. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/generators.py +0 -0
  121. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/records/__init__.py +0 -0
  122. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/records/links.py +0 -0
  123. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/relations/__init__.py +0 -0
  124. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/relations/components.py +0 -0
  125. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/relations/errors.py +0 -0
  126. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/relations/mapping.py +0 -0
  127. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/results.py +0 -0
  128. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/__init__.py +0 -0
  129. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/cf.py +0 -0
  130. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/i18n.py +0 -0
  131. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/i18n_ui.py +0 -0
  132. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/i18n_validation.py +0 -0
  133. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/marshmallow_to_json_schema.py +0 -0
  134. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/oneofschema.py +0 -0
  135. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/polymorphic.py +0 -0
  136. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/rdm.py +0 -0
  137. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/services/schema/validation.py +0 -0
  138. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/tasks.py +0 -0
  139. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/translations/default_translations.py +0 -0
  140. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/uow.py +0 -0
  141. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/utils/__init__.py +0 -0
  142. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/utils/functools.py +0 -0
  143. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime/utils/path.py +0 -0
  144. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime.egg-info/SOURCES.txt +0 -0
  145. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime.egg-info/dependency_links.txt +0 -0
  146. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime.egg-info/entry_points.txt +0 -0
  147. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime.egg-info/requires.txt +0 -0
  148. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/oarepo_runtime.egg-info/top_level.txt +0 -0
  149. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/pyproject.toml +0 -0
  150. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/setup.py +0 -0
  151. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/tests/marshmallow_to_json/__init__.py +0 -0
  152. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/tests/marshmallow_to_json/test_datacite_ui_schema.py +0 -0
  153. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/tests/marshmallow_to_json/test_simple_schema.py +0 -0
  154. {oarepo_runtime-1.5.92 → oarepo_runtime-1.5.94}/tests/pkg_data/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: oarepo-runtime
3
- Version: 1.5.92
3
+ Version: 1.5.94
4
4
  Summary: A set of runtime extensions of Invenio repository
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -0,0 +1,3 @@
1
+ from .generators import IfDraftType, RecordOwners, UserWithRole
2
+
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:
@@ -5,6 +5,12 @@ import marshmallow as ma
5
5
  from babel.dates import format_date
6
6
  from babel_edtf import format_edtf
7
7
  from flask import current_app
8
+ from invenio_rdm_records.records.systemfields.access.field.record import (
9
+ AccessStatusEnum,
10
+ )
11
+ from invenio_rdm_records.resources.serializers.ui.fields import (
12
+ UIObjectAccessStatus as InvenioUIObjectAccessStatus,
13
+ )
8
14
  from marshmallow_utils.fields import (
9
15
  BabelGettextDictField,
10
16
  FormatDate,
@@ -15,6 +21,9 @@ from marshmallow_utils.fields import (
15
21
  from marshmallow_utils.fields.babel import BabelFormatField
16
22
 
17
23
  from oarepo_runtime.i18n import gettext
24
+ from oarepo_runtime.i18n import lazy_gettext as _
25
+
26
+ from .marshmallow import RDMBaseRecordSchema
18
27
 
19
28
 
20
29
  def current_default_locale():
@@ -131,3 +140,43 @@ class InvenioUISchema(ma.Schema):
131
140
  links = ma.fields.Raw(dump_only=True)
132
141
  revision_id = ma.fields.Integer(dump_only=True)
133
142
  expanded = ma.fields.Raw(dump_only=True)
143
+
144
+
145
+ # seems not possible to avoid, as they have this hardcoded in their object,
146
+ # and translation keys are i.e. open, which gets translated to otevret
147
+ class UIObjectAccessStatus(InvenioUIObjectAccessStatus):
148
+ @property
149
+ def title(self):
150
+ """Access status title."""
151
+ return {
152
+ AccessStatusEnum.OPEN: _("access.status.open"),
153
+ AccessStatusEnum.EMBARGOED: _("access.status.embargoed"),
154
+ AccessStatusEnum.RESTRICTED: _("access.status.restricted"),
155
+ AccessStatusEnum.METADATA_ONLY: _("access.status.metadata-only"),
156
+ }.get(self.access_status)
157
+
158
+
159
+ class AccessStatusField(ma.fields.Field):
160
+ """Record access status."""
161
+
162
+ def _serialize(self, value, attr, obj, **kwargs):
163
+ """Serialise access status."""
164
+ record_access_dict = obj.get("access")
165
+ _files = obj.get("files", {})
166
+ has_files = _files is not None and _files.get("enabled", False)
167
+ if record_access_dict:
168
+ record_access_status_ui = UIObjectAccessStatus(
169
+ record_access_dict, has_files
170
+ )
171
+ return {
172
+ "id": record_access_status_ui.id,
173
+ "title_l10n": record_access_status_ui.title,
174
+ "description_l10n": record_access_status_ui.description,
175
+ "icon": record_access_status_ui.icon,
176
+ "embargo_date_l10n": record_access_status_ui.embargo_date,
177
+ "message_class": record_access_status_ui.message_class,
178
+ }
179
+
180
+
181
+ class InvenioRDMUISchema(InvenioUISchema, RDMBaseRecordSchema):
182
+ is_draft = ma.fields.Boolean(dump_only=True)
@@ -2,11 +2,16 @@ 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 RDMSearchOptions as BaseRDMSearchOptions
5
9
  from invenio_records_resources.proxies import current_service_registry
6
10
  from invenio_records_resources.services.records import (
7
11
  SearchOptions as InvenioSearchOptions,
8
12
  )
9
13
  from invenio_records_resources.services.records.params import (
14
+ FacetsParam,
10
15
  PaginationParam,
11
16
  QueryStrParam,
12
17
  SortParam,
@@ -17,9 +22,10 @@ from invenio_search.engine import dsl
17
22
  # TODO: integrate this to invenio_records_resources.services.records and remove SearchOptions class
18
23
  from oarepo_runtime.i18n import lazy_gettext as _
19
24
  from oarepo_runtime.records.systemfields.icu import ICUSuggestField
25
+ from oarepo_runtime.utils.functools import class_property
20
26
 
21
27
  from .facets.params import GroupedFacetsParam
22
- from invenio_rdm_records.services.config import RDMSearchOptions, RDMSearchDraftsOptions
28
+
23
29
  try:
24
30
  from invenio_i18n import get_locale
25
31
  except ImportError:
@@ -47,13 +53,16 @@ class FuzzySuggestQueryParser(SuggestQueryParser):
47
53
  return dsl.Q("bool", should=[multi_match_with_bool_prefix, multi_match_fuzzy])
48
54
 
49
55
 
50
- class SearchOptions(InvenioSearchOptions):
51
- params_interpreters_cls = [
52
- QueryStrParam,
53
- PaginationParam,
54
- SortParam,
55
- GroupedFacetsParam,
56
- ]
56
+ class SearchOptionsMixin:
57
+ @class_property
58
+ def params_interpreters_cls(cls):
59
+ """Replaces FacetsParam with GroupedFacetsParam."""
60
+ param_interpreters = [*super(SearchOptionsMixin, cls).params_interpreters_cls]
61
+ # replace FacetsParam with GroupedFacetsParam
62
+ for idx, interpreter in enumerate(param_interpreters):
63
+ if interpreter == FacetsParam:
64
+ param_interpreters[idx] = GroupedFacetsParam
65
+ return param_interpreters
57
66
 
58
67
  sort_options = {
59
68
  "title": dict(
@@ -75,6 +84,53 @@ class SearchOptions(InvenioSearchOptions):
75
84
  }
76
85
 
77
86
 
87
+ class SearchOptionsDraftMixin(SearchOptionsMixin):
88
+ sort_options = {
89
+ "bestmatch": dict(
90
+ title=_("Best match"),
91
+ fields=["_score"], # search defaults to desc on `_score` field
92
+ ),
93
+ "updated-desc": dict(
94
+ title=_("Recently updated"),
95
+ fields=["-updated"],
96
+ ),
97
+ "updated-asc": dict(
98
+ title=_("Least recently updated"),
99
+ fields=["updated"],
100
+ ),
101
+ "newest": dict(
102
+ title=_("Newest"),
103
+ fields=["-created"],
104
+ ),
105
+ "oldest": dict(
106
+ title=_("Oldest"),
107
+ fields=["created"],
108
+ ),
109
+ "version": dict(
110
+ title=_("Version"),
111
+ fields=["-versions.index"],
112
+ ),
113
+ }
114
+
115
+
116
+ class SearchOptions(SearchOptionsMixin, InvenioSearchOptions):
117
+ # TODO: should be changed
118
+ params_interpreters_cls = [
119
+ QueryStrParam,
120
+ PaginationParam,
121
+ SortParam,
122
+ GroupedFacetsParam,
123
+ ]
124
+
125
+
126
+ class RDMSearchOptions(SearchOptionsMixin, BaseRDMSearchOptions):
127
+ pass
128
+
129
+
130
+ class RDMSearchDraftsOptions(SearchOptionsDraftMixin, BaseRDMSearchDraftsOptions):
131
+ pass
132
+
133
+
78
134
  @dataclasses.dataclass
79
135
  class SuggestField:
80
136
  field: str
@@ -188,14 +244,17 @@ class ICUSortOptions:
188
244
  }
189
245
  return ret
190
246
 
247
+
191
248
  class I18nSearchOptions(SearchOptions):
192
249
  extra_sort_options = {}
193
250
  record_cls = None
194
251
 
252
+
195
253
  class I18nRDMSearchOptions(RDMSearchOptions):
196
254
  extra_sort_options = {}
197
255
  record_cls = None
198
256
 
257
+
199
258
  class I18nRDMDraftsSearchOptions(RDMSearchDraftsOptions):
200
259
  extra_sort_options = {}
201
260
  record_cls = None
@@ -51,3 +51,19 @@ msgstr "Ne"
51
51
  #, python-format
52
52
  msgid "Invalid value %(identifier)s of identifier type %(type)s"
53
53
  msgstr "%(type)s: Neplatná hodnota '%(identifier)s'"
54
+
55
+ #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:152
56
+ msgid "access.status.open"
57
+ msgstr "otevřený přístup"
58
+
59
+ #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:153
60
+ msgid "access.status.embargoed"
61
+ msgstr "odložené zpřístupnění"
62
+
63
+ #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:154
64
+ msgid "access.status.restricted"
65
+ msgstr "omezený přístup"
66
+
67
+ #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:155
68
+ msgid "access.status.metadata-only"
69
+ msgstr "pouze metadata"
@@ -50,3 +50,19 @@ msgstr ""
50
50
  #, python-format
51
51
  msgid "Invalid value %(identifier)s of identifier type %(type)s"
52
52
  msgstr ""
53
+
54
+ #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:152
55
+ msgid "access.status.open"
56
+ msgstr "open access"
57
+
58
+ #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:153
59
+ msgid "access.status.embargoed"
60
+ msgstr "embargoed access"
61
+
62
+ #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:154
63
+ msgid "access.status.restricted"
64
+ msgstr "restricted access"
65
+
66
+ #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:155
67
+ msgid "access.status.metadata-only"
68
+ msgstr "metadata only access"
@@ -0,0 +1,72 @@
1
+ # Translations template for PROJECT.
2
+ # Copyright (C) 2025 ORGANIZATION
3
+ # This file is distributed under the same license as the PROJECT project.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, 2025.
5
+ #
6
+ #, fuzzy
7
+ msgid ""
8
+ msgstr ""
9
+ "Project-Id-Version: PROJECT VERSION\n"
10
+ "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11
+ "POT-Creation-Date: 2025-02-17 10:27+0100\n"
12
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=utf-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+ "Generated-By: Babel 2.17.0\n"
19
+
20
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/search.py:71
21
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/search.py:175
22
+ msgid "By Title"
23
+ msgstr ""
24
+
25
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/search.py:75
26
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/translations/default_translations.py:5
27
+ msgid "Best match"
28
+ msgstr ""
29
+
30
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/search.py:79
31
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/translations/default_translations.py:3
32
+ msgid "Newest"
33
+ msgstr ""
34
+
35
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/search.py:83
36
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/translations/default_translations.py:4
37
+ msgid "Oldest"
38
+ msgstr ""
39
+
40
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/schema/ui.py:132
41
+ msgid "True"
42
+ msgstr ""
43
+
44
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/schema/ui.py:132
45
+ msgid "False"
46
+ msgstr ""
47
+
48
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/schema/ui.py:152
49
+ msgid "access.status.open"
50
+ msgstr ""
51
+
52
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/schema/ui.py:153
53
+ msgid "access.status.embargoed"
54
+ msgstr ""
55
+
56
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/schema/ui.py:154
57
+ msgid "access.status.restricted"
58
+ msgstr ""
59
+
60
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/schema/ui.py:155
61
+ msgid "access.status.metadata-only"
62
+ msgstr ""
63
+
64
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/services/schema/validation.py:31
65
+ #, python-format
66
+ msgid "Invalid value %(identifier)s of identifier type %(type)s"
67
+ msgstr ""
68
+
69
+ #: /home/dusanst/Projects/oarepo-runtime/oarepo_runtime/translations/default_translations.py:6
70
+ msgid "Contact"
71
+ msgstr ""
72
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: oarepo-runtime
3
- Version: 1.5.92
3
+ Version: 1.5.94
4
4
  Summary: A set of runtime extensions of Invenio repository
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = oarepo-runtime
3
- version = 1.5.92
3
+ version = 1.5.94
4
4
  description = A set of runtime extensions of Invenio repository
5
5
  authors = Alzbeta Pokorna
6
6
  readme = README.md
@@ -1,3 +0,0 @@
1
- from .generators import RecordOwners, UserWithRole
2
-
3
- __all__ = ("RecordOwners", "UserWithRole")
@@ -1,56 +0,0 @@
1
- # Translations template for PROJECT.
2
- # Copyright (C) 2024 ORGANIZATION
3
- # This file is distributed under the same license as the PROJECT project.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
5
- #
6
- #, fuzzy
7
- msgid ""
8
- msgstr ""
9
- "Project-Id-Version: PROJECT VERSION\n"
10
- "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11
- "POT-Creation-Date: 2024-11-28 10:16+0100\n"
12
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
- "Language-Team: LANGUAGE <LL@li.org>\n"
15
- "MIME-Version: 1.0\n"
16
- "Content-Type: text/plain; charset=utf-8\n"
17
- "Content-Transfer-Encoding: 8bit\n"
18
- "Generated-By: Babel 2.15.0\n"
19
-
20
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/search.py:60
21
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/search.py:146
22
- msgid "By Title"
23
- msgstr ""
24
-
25
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/search.py:64
26
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/translations/default_translations.py:5
27
- msgid "Best match"
28
- msgstr ""
29
-
30
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/search.py:68
31
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/translations/default_translations.py:3
32
- msgid "Newest"
33
- msgstr ""
34
-
35
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/search.py:72
36
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/translations/default_translations.py:4
37
- msgid "Oldest"
38
- msgstr ""
39
-
40
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:123
41
- msgid "True"
42
- msgstr ""
43
-
44
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/ui.py:123
45
- msgid "False"
46
- msgstr ""
47
-
48
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/services/schema/validation.py:19
49
- #, python-format
50
- msgid "Invalid value %(identifier)s of identifier type %(type)s"
51
- msgstr ""
52
-
53
- #: /Users/m/w/cesnet/oarepo-runtime/oarepo_runtime/translations/default_translations.py:6
54
- msgid "Contact"
55
- msgstr ""
56
-
File without changes