invenio-vocabularies 4.2.0__tar.gz → 4.4.0__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.

Potentially problematic release.


This version of invenio-vocabularies might be problematic. Click here for more details.

Files changed (405) hide show
  1. invenio-vocabularies-4.4.0/.github/workflows/tests.yml +40 -0
  2. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/CHANGES.rst +10 -0
  3. {invenio-vocabularies-4.2.0/invenio_vocabularies.egg-info → invenio-vocabularies-4.4.0}/PKG-INFO +12 -1
  4. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/__init__.py +1 -1
  5. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/cli.py +12 -3
  6. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/config.py +13 -0
  7. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/affiliations.py +10 -0
  8. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/datastreams.py +1 -1
  9. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/datastreams.py +1 -1
  10. invenio-vocabularies-4.4.0/invenio_vocabularies/contrib/names/datastreams.py +288 -0
  11. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/names.py +10 -0
  12. invenio-vocabularies-4.4.0/invenio_vocabularies/contrib/names/s3client.py +44 -0
  13. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/subjects.py +10 -0
  14. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/datastreams/datastreams.py +61 -13
  15. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/datastreams/readers.py +8 -2
  16. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/datastreams/tasks.py +14 -2
  17. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/datastreams/writers.py +53 -2
  18. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/custom_fields/subject.py +1 -1
  19. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/subjects.html +1 -1
  20. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0/invenio_vocabularies.egg-info}/PKG-INFO +12 -1
  21. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies.egg-info/SOURCES.txt +1 -0
  22. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies.egg-info/requires.txt +4 -0
  23. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/setup.cfg +3 -0
  24. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/names/test_names_datastreams.py +38 -3
  25. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/datastreams/conftest.py +8 -0
  26. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/datastreams/test_datastreams.py +10 -9
  27. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/datastreams/test_datastreams_tasks.py +14 -2
  28. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/resources/test_tasks_resources.py +5 -1
  29. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/test_cli.py +1 -2
  30. invenio-vocabularies-4.2.0/.github/workflows/tests.yml +0 -89
  31. invenio-vocabularies-4.2.0/invenio_vocabularies/contrib/names/datastreams.py +0 -130
  32. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/.dockerignore +0 -0
  33. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/.editorconfig +0 -0
  34. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/.git-blame-ignore-revs +0 -0
  35. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/.github/workflows/i18n-pull.yml +0 -0
  36. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/.github/workflows/i18n-push.yml +0 -0
  37. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/.github/workflows/pypi-publish.yml +0 -0
  38. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/.tx/config +0 -0
  39. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/AUTHORS.rst +0 -0
  40. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/CONTRIBUTING.rst +0 -0
  41. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/INSTALL.rst +0 -0
  42. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/LICENSE +0 -0
  43. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/MANIFEST.in +0 -0
  44. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/README.rst +0 -0
  45. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/babel.ini +0 -0
  46. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/Makefile +0 -0
  47. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/api.rst +0 -0
  48. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/authors.rst +0 -0
  49. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/changes.rst +0 -0
  50. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/conf.py +0 -0
  51. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/configuration.rst +0 -0
  52. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/contributing.rst +0 -0
  53. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/index.rst +0 -0
  54. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/installation.rst +0 -0
  55. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/license.rst +0 -0
  56. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/make.bat +0 -0
  57. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/requirements.txt +0 -0
  58. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/docs/usage.rst +0 -0
  59. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/gen-migration.sh +0 -0
  60. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/administration/__init__.py +0 -0
  61. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/administration/views/__init__.py +0 -0
  62. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/administration/views/vocabularies.py +0 -0
  63. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/alembic/17c703ce1eb7_create_names_table.py +0 -0
  64. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/alembic/4a9a4fd235f8_create_vocabulary_schemes.py +0 -0
  65. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/alembic/4f365fced43f_create_vocabularies_tables.py +0 -0
  66. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/alembic/55a700f897b6_add_names_and_afiliations_pid_column.py +0 -0
  67. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/alembic/6312f33645c1_create_affiliations_table.py +0 -0
  68. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/alembic/676dd587542d_create_funders_vocabulary_table.py +0 -0
  69. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/alembic/8ff82dfb0be8_create_vocabularies_branch.py +0 -0
  70. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/alembic/__init__.py +0 -0
  71. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/alembic/e1146238edd3_create_awards_table.py +0 -0
  72. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/.eslintrc.yml +0 -0
  73. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/.prettierrc +0 -0
  74. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/index.js +0 -0
  75. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/package.json +0 -0
  76. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/AwardResults.js +0 -0
  77. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/CustomAwardForm.js +0 -0
  78. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FunderDropdown.js +0 -0
  79. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FundingField.js +0 -0
  80. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FundingField.test.js +0 -0
  81. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FundingFieldItem.js +0 -0
  82. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FundingModal.js +0 -0
  83. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/NoAwardResults.js +0 -0
  84. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/index.js +0 -0
  85. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/index.js +0 -0
  86. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/index.js +0 -0
  87. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/index.js +0 -0
  88. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/i18next-scanner.config.js +0 -0
  89. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/i18next.js +0 -0
  90. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/messages/index.js +0 -0
  91. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/package.json +0 -0
  92. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/scripts/compileCatalog.js +0 -0
  93. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/scripts/initCatalog.js +0 -0
  94. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/__init__.py +0 -0
  95. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/__init__.py +0 -0
  96. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/api.py +0 -0
  97. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/config.py +0 -0
  98. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/facets.py +0 -0
  99. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/jsonschemas/__init__.py +0 -0
  100. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/jsonschemas/affiliations/affiliation-v1.0.0.json +0 -0
  101. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/mappings/__init__.py +0 -0
  102. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v1/__init__.py +0 -0
  103. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v1/affiliations/affiliation-v1.0.0.json +0 -0
  104. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v2/__init__.py +0 -0
  105. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v2/affiliations/affiliation-v1.0.0.json +0 -0
  106. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/mappings/v7/__init__.py +0 -0
  107. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/mappings/v7/affiliations/affiliation-v1.0.0.json +0 -0
  108. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/models.py +0 -0
  109. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/resources.py +0 -0
  110. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/schema.py +0 -0
  111. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/affiliations/services.py +0 -0
  112. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/__init__.py +0 -0
  113. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/api.py +0 -0
  114. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/awards.py +0 -0
  115. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/config.py +0 -0
  116. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/datastreams.py +0 -0
  117. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/jsonschemas/__init__.py +0 -0
  118. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/jsonschemas/awards/award-v1.0.0.json +0 -0
  119. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/mappings/__init__.py +0 -0
  120. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/mappings/os-v1/__init__.py +0 -0
  121. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/mappings/os-v1/awards/award-v1.0.0.json +0 -0
  122. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/mappings/os-v2/__init__.py +0 -0
  123. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/mappings/os-v2/awards/award-v1.0.0.json +0 -0
  124. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/mappings/v7/__init__.py +0 -0
  125. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/mappings/v7/awards/award-v1.0.0.json +0 -0
  126. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/models.py +0 -0
  127. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/resources.py +0 -0
  128. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/schema.py +0 -0
  129. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/serializer.py +0 -0
  130. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/awards/services.py +0 -0
  131. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/common/__init__.py +0 -0
  132. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/common/ror/__init__.py +0 -0
  133. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/common/ror/datastreams.py +0 -0
  134. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/__init__.py +0 -0
  135. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/api.py +0 -0
  136. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/config.py +0 -0
  137. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/facets.py +0 -0
  138. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/funders.py +0 -0
  139. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/jsonschemas/__init__.py +0 -0
  140. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/jsonschemas/funders/funder-v1.0.0.json +0 -0
  141. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/mappings/__init__.py +0 -0
  142. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/mappings/os-v1/__init__.py +0 -0
  143. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/mappings/os-v1/funders/funder-v1.0.0.json +0 -0
  144. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/mappings/os-v2/__init__.py +0 -0
  145. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/mappings/os-v2/funders/funder-v1.0.0.json +0 -0
  146. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/mappings/v7/__init__.py +0 -0
  147. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/mappings/v7/funders/funder-v1.0.0.json +0 -0
  148. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/models.py +0 -0
  149. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/resources.py +0 -0
  150. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/schema.py +0 -0
  151. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/serializer.py +0 -0
  152. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/funders/services.py +0 -0
  153. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/__init__.py +0 -0
  154. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/api.py +0 -0
  155. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/config.py +0 -0
  156. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/jsonschemas/__init__.py +0 -0
  157. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/jsonschemas/names/name-v1.0.0.json +0 -0
  158. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/mappings/__init__.py +0 -0
  159. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/mappings/os-v1/__init__.py +0 -0
  160. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/mappings/os-v1/names/name-v1.0.0.json +0 -0
  161. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/mappings/os-v2/__init__.py +0 -0
  162. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/mappings/os-v2/names/name-v1.0.0.json +0 -0
  163. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/mappings/v7/__init__.py +0 -0
  164. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/mappings/v7/names/name-v1.0.0.json +0 -0
  165. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/models.py +0 -0
  166. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/resources.py +0 -0
  167. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/schema.py +0 -0
  168. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/names/services.py +0 -0
  169. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/__init__.py +0 -0
  170. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/api.py +0 -0
  171. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/config.py +0 -0
  172. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/facets.py +0 -0
  173. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/jsonschemas/__init__.py +0 -0
  174. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/jsonschemas/subjects/subject-v1.0.0.json +0 -0
  175. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/mappings/__init__.py +0 -0
  176. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/mappings/os-v1/__init__.py +0 -0
  177. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/mappings/os-v1/subjects/subject-v1.0.0.json +0 -0
  178. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/mappings/os-v2/__init__.py +0 -0
  179. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/mappings/os-v2/subjects/subject-v1.0.0.json +0 -0
  180. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/mappings/v7/__init__.py +0 -0
  181. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/mappings/v7/subjects/subject-v1.0.0.json +0 -0
  182. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/models.py +0 -0
  183. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/resources.py +0 -0
  184. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/schema.py +0 -0
  185. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/contrib/subjects/services.py +0 -0
  186. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/datastreams/__init__.py +0 -0
  187. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/datastreams/errors.py +0 -0
  188. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/datastreams/factories.py +0 -0
  189. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/datastreams/transformers.py +0 -0
  190. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/datastreams/xml.py +0 -0
  191. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/ext.py +0 -0
  192. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/factories.py +0 -0
  193. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/fixtures.py +0 -0
  194. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/proxies.py +0 -0
  195. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/__init__.py +0 -0
  196. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/api.py +0 -0
  197. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/jsonschemas/__init__.py +0 -0
  198. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/jsonschemas/vocabularies/definitions-v1.0.0.json +0 -0
  199. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/jsonschemas/vocabularies/vocabulary-v1.0.0.json +0 -0
  200. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/mappings/__init__.py +0 -0
  201. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/mappings/os-v1/__init__.py +0 -0
  202. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/mappings/os-v1/vocabularies/vocabulary-v1.0.0.json +0 -0
  203. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/mappings/os-v2/__init__.py +0 -0
  204. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/mappings/os-v2/vocabularies/vocabulary-v1.0.0.json +0 -0
  205. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/mappings/v7/__init__.py +0 -0
  206. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/mappings/v7/vocabularies/vocabulary-v1.0.0.json +0 -0
  207. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/models.py +0 -0
  208. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/pidprovider.py +0 -0
  209. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/systemfields/__init__.py +0 -0
  210. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/systemfields/pid.py +0 -0
  211. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/records/systemfields/relations.py +0 -0
  212. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/resources/__init__.py +0 -0
  213. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/resources/config.py +0 -0
  214. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/resources/resource.py +0 -0
  215. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/resources/schema.py +0 -0
  216. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/resources/serializer.py +0 -0
  217. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/__init__.py +0 -0
  218. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/components.py +0 -0
  219. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/config.py +0 -0
  220. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/custom_fields/__init__.py +0 -0
  221. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/custom_fields/vocabulary.py +0 -0
  222. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/facets.py +0 -0
  223. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/permissions.py +0 -0
  224. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/querystr.py +0 -0
  225. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/results.py +0 -0
  226. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/schema.py +0 -0
  227. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/service.py +0 -0
  228. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/services/tasks.py +0 -0
  229. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/vocabularies-list.html +0 -0
  230. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/vocabulary-details.html +0 -0
  231. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/af/LC_MESSAGES/messages.mo +0 -0
  232. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/af/LC_MESSAGES/messages.po +0 -0
  233. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ar/LC_MESSAGES/messages.mo +0 -0
  234. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ar/LC_MESSAGES/messages.po +0 -0
  235. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/bg/LC_MESSAGES/messages.mo +0 -0
  236. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/bg/LC_MESSAGES/messages.po +0 -0
  237. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ca/LC_MESSAGES/messages.mo +0 -0
  238. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ca/LC_MESSAGES/messages.po +0 -0
  239. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/cs/LC_MESSAGES/messages.mo +0 -0
  240. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/cs/LC_MESSAGES/messages.po +0 -0
  241. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/da/LC_MESSAGES/messages.mo +0 -0
  242. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/da/LC_MESSAGES/messages.po +0 -0
  243. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/de/LC_MESSAGES/messages.mo +0 -0
  244. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/de/LC_MESSAGES/messages.po +0 -0
  245. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/de_AT/LC_MESSAGES/messages.mo +0 -0
  246. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/de_AT/LC_MESSAGES/messages.po +0 -0
  247. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/de_DE/LC_MESSAGES/messages.mo +0 -0
  248. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/de_DE/LC_MESSAGES/messages.po +0 -0
  249. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/el/LC_MESSAGES/messages.mo +0 -0
  250. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/el/LC_MESSAGES/messages.po +0 -0
  251. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/en/LC_MESSAGES/messages.mo +0 -0
  252. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/en/LC_MESSAGES/messages.po +0 -0
  253. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/en_AT/LC_MESSAGES/messages.mo +0 -0
  254. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/en_AT/LC_MESSAGES/messages.po +0 -0
  255. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/en_HU/LC_MESSAGES/messages.mo +0 -0
  256. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/en_HU/LC_MESSAGES/messages.po +0 -0
  257. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/es/LC_MESSAGES/messages.mo +0 -0
  258. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/es/LC_MESSAGES/messages.po +0 -0
  259. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/es_CU/LC_MESSAGES/messages.mo +0 -0
  260. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/es_CU/LC_MESSAGES/messages.po +0 -0
  261. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/es_MX/LC_MESSAGES/messages.mo +0 -0
  262. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/es_MX/LC_MESSAGES/messages.po +0 -0
  263. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/et/LC_MESSAGES/messages.mo +0 -0
  264. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/et/LC_MESSAGES/messages.po +0 -0
  265. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/et_EE/LC_MESSAGES/messages.mo +0 -0
  266. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/et_EE/LC_MESSAGES/messages.po +0 -0
  267. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fa/LC_MESSAGES/messages.mo +0 -0
  268. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fa/LC_MESSAGES/messages.po +0 -0
  269. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fa_IR/LC_MESSAGES/messages.mo +0 -0
  270. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fa_IR/LC_MESSAGES/messages.po +0 -0
  271. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fr/LC_MESSAGES/messages.mo +0 -0
  272. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fr/LC_MESSAGES/messages.po +0 -0
  273. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fr_CI/LC_MESSAGES/messages.mo +0 -0
  274. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fr_CI/LC_MESSAGES/messages.po +0 -0
  275. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fr_FR/LC_MESSAGES/messages.mo +0 -0
  276. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/fr_FR/LC_MESSAGES/messages.po +0 -0
  277. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/gl/LC_MESSAGES/messages.mo +0 -0
  278. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/gl/LC_MESSAGES/messages.po +0 -0
  279. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/hi_IN/LC_MESSAGES/messages.mo +0 -0
  280. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/hi_IN/LC_MESSAGES/messages.po +0 -0
  281. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/hr/LC_MESSAGES/messages.mo +0 -0
  282. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/hr/LC_MESSAGES/messages.po +0 -0
  283. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/hu/LC_MESSAGES/messages.mo +0 -0
  284. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/hu/LC_MESSAGES/messages.po +0 -0
  285. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/hu_HU/LC_MESSAGES/messages.mo +0 -0
  286. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/hu_HU/LC_MESSAGES/messages.po +0 -0
  287. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/it/LC_MESSAGES/messages.mo +0 -0
  288. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/it/LC_MESSAGES/messages.po +0 -0
  289. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ja/LC_MESSAGES/messages.mo +0 -0
  290. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ja/LC_MESSAGES/messages.po +0 -0
  291. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ka/LC_MESSAGES/messages.mo +0 -0
  292. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ka/LC_MESSAGES/messages.po +0 -0
  293. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/lt/LC_MESSAGES/messages.mo +0 -0
  294. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/lt/LC_MESSAGES/messages.po +0 -0
  295. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/messages.pot +0 -0
  296. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ne/LC_MESSAGES/messages.mo +0 -0
  297. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ne/LC_MESSAGES/messages.po +0 -0
  298. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/no/LC_MESSAGES/messages.mo +0 -0
  299. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/no/LC_MESSAGES/messages.po +0 -0
  300. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/pl/LC_MESSAGES/messages.mo +0 -0
  301. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/pl/LC_MESSAGES/messages.po +0 -0
  302. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/pt/LC_MESSAGES/messages.mo +0 -0
  303. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/pt/LC_MESSAGES/messages.po +0 -0
  304. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ro/LC_MESSAGES/messages.mo +0 -0
  305. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ro/LC_MESSAGES/messages.po +0 -0
  306. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ru/LC_MESSAGES/messages.mo +0 -0
  307. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/ru/LC_MESSAGES/messages.po +0 -0
  308. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/rw/LC_MESSAGES/messages.mo +0 -0
  309. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/rw/LC_MESSAGES/messages.po +0 -0
  310. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/sk/LC_MESSAGES/messages.mo +0 -0
  311. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/sk/LC_MESSAGES/messages.po +0 -0
  312. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/sv/LC_MESSAGES/messages.mo +0 -0
  313. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/sv/LC_MESSAGES/messages.po +0 -0
  314. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/sv_SE/LC_MESSAGES/messages.mo +0 -0
  315. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/sv_SE/LC_MESSAGES/messages.po +0 -0
  316. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/tr/LC_MESSAGES/messages.mo +0 -0
  317. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/tr/LC_MESSAGES/messages.po +0 -0
  318. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/uk/LC_MESSAGES/messages.mo +0 -0
  319. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/uk/LC_MESSAGES/messages.po +0 -0
  320. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/uk_UA/LC_MESSAGES/messages.mo +0 -0
  321. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/uk_UA/LC_MESSAGES/messages.po +0 -0
  322. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  323. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
  324. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.mo +0 -0
  325. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.po +0 -0
  326. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/views.py +0 -0
  327. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies/webpack.py +0 -0
  328. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies.egg-info/dependency_links.txt +0 -0
  329. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies.egg-info/entry_points.txt +0 -0
  330. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies.egg-info/not-zip-safe +0 -0
  331. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/invenio_vocabularies.egg-info/top_level.txt +0 -0
  332. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/pyproject.toml +0 -0
  333. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/requirements-feature.txt +0 -0
  334. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/run-js-linter.sh +0 -0
  335. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/run-tests.sh +0 -0
  336. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/setup.py +0 -0
  337. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/conftest.py +0 -0
  338. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/affiliations/conftest.py +0 -0
  339. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/affiliations/test_affiliations_api.py +0 -0
  340. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/affiliations/test_affiliations_datastreams.py +0 -0
  341. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/affiliations/test_affiliations_jsonschema.py +0 -0
  342. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/affiliations/test_affiliations_resource.py +0 -0
  343. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/affiliations/test_affiliations_schema.py +0 -0
  344. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/affiliations/test_affiliations_service.py +0 -0
  345. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/awards/conftest.py +0 -0
  346. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/awards/test_awards_api.py +0 -0
  347. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/awards/test_awards_datastreams.py +0 -0
  348. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/awards/test_awards_jsonschema.py +0 -0
  349. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/awards/test_awards_resource.py +0 -0
  350. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/awards/test_awards_schema.py +0 -0
  351. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/awards/test_awards_service.py +0 -0
  352. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/common/ror/test_ror_datastreams.py +0 -0
  353. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/funders/conftest.py +0 -0
  354. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/funders/test_funders_api.py +0 -0
  355. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/funders/test_funders_datastreams.py +0 -0
  356. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/funders/test_funders_jsonschema.py +0 -0
  357. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/funders/test_funders_resource.py +0 -0
  358. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/funders/test_funders_schema.py +0 -0
  359. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/funders/test_funders_service.py +0 -0
  360. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/names/conftest.py +0 -0
  361. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/names/test_names_api.py +0 -0
  362. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/names/test_names_jsonschema.py +0 -0
  363. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/names/test_names_resource.py +0 -0
  364. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/names/test_names_schema.py +0 -0
  365. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/names/test_names_service.py +0 -0
  366. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/subjects/conftest.py +0 -0
  367. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/subjects/test_subjects_api.py +0 -0
  368. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/subjects/test_subjects_facets.py +0 -0
  369. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/subjects/test_subjects_jsonschema.py +0 -0
  370. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/subjects/test_subjects_resource.py +0 -0
  371. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/subjects/test_subjects_schema.py +0 -0
  372. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/contrib/subjects/test_subjects_service.py +0 -0
  373. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/custom_fields/test_custom_fields.py +0 -0
  374. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/datastreams/test_fixtures.py +0 -0
  375. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/datastreams/test_readers.py +0 -0
  376. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/datastreams/test_transformers.py +0 -0
  377. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/datastreams/test_writers.py +0 -0
  378. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/datastreams/vocabularies.yaml +0 -0
  379. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/__init__.py +0 -0
  380. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/api.py +0 -0
  381. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/jsonschemas/__init__.py +0 -0
  382. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/jsonschemas/records/record-v1.0.0.json +0 -0
  383. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/mappings/__init__.py +0 -0
  384. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/mappings/v6/__init__.py +0 -0
  385. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/mappings/v6/records/record-v1.0.0.json +0 -0
  386. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/mappings/v7/__init__.py +0 -0
  387. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/mappings/v7/records/record-v1.0.0.json +0 -0
  388. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/mock_module/models.py +0 -0
  389. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/records/conftest.py +0 -0
  390. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/records/test_api.py +0 -0
  391. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/records/test_jsonschema.py +0 -0
  392. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/records/test_models.py +0 -0
  393. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/records/test_relationship.py +0 -0
  394. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/resources/conftest.py +0 -0
  395. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/resources/test_resources_get.py +0 -0
  396. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/resources/test_resources_l10n.py +0 -0
  397. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/resources/test_resources_search.py +0 -0
  398. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/services/conftest.py +0 -0
  399. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/services/test_labels.py +0 -0
  400. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/services/test_permissions.py +0 -0
  401. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/services/test_schema.py +0 -0
  402. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/services/test_service.py +0 -0
  403. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/test_alembic.py +0 -0
  404. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/test_factory.py +0 -0
  405. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.4.0}/tests/test_invenio_vocabularies.py +0 -0
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # This file is part of Invenio.
4
+ # Copyright (C) 2020-2024 CERN.
5
+ # Copyright (C) 2022 Graz University of Technology.
6
+ #
7
+ # Invenio is free software; you can redistribute it and/or modify it
8
+ # under the terms of the MIT License; see LICENSE file for more details.
9
+
10
+ name: CI
11
+
12
+ on:
13
+ push:
14
+ branches:
15
+ - master
16
+ pull_request:
17
+ branches:
18
+ - master
19
+ - "maint-**"
20
+ schedule:
21
+ # * is a special character in YAML so you have to quote this string
22
+ - cron: "0 3 * * 6"
23
+ workflow_dispatch:
24
+ inputs:
25
+ reason:
26
+ description: "Reason"
27
+ required: false
28
+ default: "Manual trigger"
29
+
30
+ jobs:
31
+ Python:
32
+ uses: inveniosoftware/workflows/.github/workflows/tests-python.yml@master
33
+ with:
34
+ extras: "tests,oaipmh"
35
+
36
+ JS:
37
+ uses: inveniosoftware/workflows/.github/workflows/tests-js.yml@master
38
+ with:
39
+ js-working-directory: ./invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies
40
+ translations-working-directory: ./invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies
@@ -8,6 +8,16 @@
8
8
  Changes
9
9
  =======
10
10
 
11
+ Version v4.4.0 (released 2024-08-09)
12
+
13
+ - services: use and adjust vnd.inveniordm.v1+json http accept header
14
+
15
+ Version v4.3.0 (released 2024-08-05)
16
+
17
+ - names: make names_exclude_regex configurable
18
+ - names: validate entry full names
19
+ - names: add orcid public data sync
20
+
11
21
  Version v4.2.0 (released 2024-07-24)
12
22
 
13
23
  - ror: check last update; use ld+json for metadata (#367)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: invenio-vocabularies
3
- Version: 4.2.0
3
+ Version: 4.4.0
4
4
  Summary: "Invenio module for managing vocabularies."
5
5
  Home-page: https://github.com/inveniosoftware/invenio-vocabularies
6
6
  Author: CERN
@@ -50,6 +50,16 @@ Description: ..
50
50
  Changes
51
51
  =======
52
52
 
53
+ Version v4.4.0 (released 2024-08-09)
54
+
55
+ - services: use and adjust vnd.inveniordm.v1+json http accept header
56
+
57
+ Version v4.3.0 (released 2024-08-05)
58
+
59
+ - names: make names_exclude_regex configurable
60
+ - names: validate entry full names
61
+ - names: add orcid public data sync
62
+
53
63
  Version v4.2.0 (released 2024-07-24)
54
64
 
55
65
  - ror: check last update; use ld+json for metadata (#367)
@@ -250,6 +260,7 @@ Keywords: invenio vocabulary management
250
260
  Platform: any
251
261
  Classifier: Development Status :: 5 - Production/Stable
252
262
  Requires-Python: >=3.7
263
+ Provides-Extra: s3fs
253
264
  Provides-Extra: oaipmh
254
265
  Provides-Extra: tests
255
266
  Provides-Extra: elasticsearch7
@@ -10,6 +10,6 @@
10
10
 
11
11
  from .ext import InvenioVocabularies
12
12
 
13
- __version__ = "4.2.0"
13
+ __version__ = "4.4.0"
14
14
 
15
15
  __all__ = ("__version__", "InvenioVocabularies")
@@ -142,18 +142,27 @@ def convert(vocabulary, filepath=None, origin=None, target=None, num_samples=Non
142
142
  type=click.STRING,
143
143
  help="Identifier of the vocabulary item to delete.",
144
144
  )
145
- @click.option("--all", is_flag=True, default=False, help="Not supported yet.")
145
+ @click.option("--all", is_flag=True, default=False)
146
146
  @with_appcontext
147
147
  def delete(vocabulary, identifier, all):
148
148
  """Delete all items or a specific one of the vocabulary."""
149
- if not id and not all:
149
+ if not identifier and not all:
150
150
  click.secho("An identifier or the --all flag must be present.", fg="red")
151
151
  exit(1)
152
+
152
153
  vc = get_vocabulary_config(vocabulary)
153
154
  service = vc.get_service()
154
155
  if identifier:
155
156
  try:
156
- if service.delete(identifier, system_identity):
157
+ if service.delete(system_identity, identifier):
157
158
  click.secho(f"{identifier} deleted from {vocabulary}.", fg="green")
158
159
  except (PIDDeletedError, PIDDoesNotExistError):
159
160
  click.secho(f"PID {identifier} not found.")
161
+ elif all:
162
+ items = service.scan(system_identity)
163
+ for item in items.hits:
164
+ try:
165
+ if service.delete(system_identity, item["id"]):
166
+ click.secho(f"{item['id']} deleted from {vocabulary}.", fg="green")
167
+ except (PIDDeletedError, PIDDoesNotExistError):
168
+ click.secho(f"PID {item['id']} not found.")
@@ -155,3 +155,16 @@ VOCABULARIES_TYPES_SEARCH = {
155
155
  "sort": ["name", "count"],
156
156
  }
157
157
  """Vocabulary type search configuration."""
158
+
159
+ VOCABULARIES_ORCID_ACCESS_KEY = "TODO"
160
+ """ORCID access key to access the s3 bucket."""
161
+ VOCABULARIES_ORCID_SECRET_KEY = "TODO"
162
+ """ORCID secret key to access the s3 bucket."""
163
+ VOCABULARIES_ORCID_SUMMARIES_BUCKET = "v3.0-summaries"
164
+ """ORCID summaries bucket name."""
165
+ VOCABULARIES_ORCID_SYNC_MAX_WORKERS = 32
166
+ """ORCID max number of simultaneous workers/connections."""
167
+ VOCABULARIES_ORCID_SYNC_SINCE = {
168
+ "days": 1,
169
+ }
170
+ """ORCID time shift to sync. Parameters accepted are the ones passed to 'datetime.timedelta'."""
@@ -8,11 +8,13 @@
8
8
 
9
9
  """Vocabulary affiliations."""
10
10
 
11
+ from flask_resources import JSONSerializer, ResponseHandler
11
12
  from invenio_db import db
12
13
  from invenio_records.dumpers import SearchDumper
13
14
  from invenio_records.dumpers.indexedat import IndexedAtDumperExt
14
15
  from invenio_records_resources.factories.factory import RecordTypeFactory
15
16
  from invenio_records_resources.records.systemfields import ModelPIDField
17
+ from invenio_records_resources.resources.records.headers import etag_headers
16
18
 
17
19
  from ...services.permissions import PermissionPolicy
18
20
  from .config import AffiliationsSearchOptions, service_components
@@ -46,4 +48,12 @@ record_type = RecordTypeFactory(
46
48
  permission_policy_cls=PermissionPolicy,
47
49
  # Resource layer
48
50
  endpoint_route="/affiliations",
51
+ resource_cls_attrs={
52
+ "response_handlers": {
53
+ "application/json": ResponseHandler(JSONSerializer(), headers=etag_headers),
54
+ "application/vnd.inveniordm.v1+json": ResponseHandler(
55
+ JSONSerializer(), headers=etag_headers
56
+ ),
57
+ }
58
+ },
49
59
  )
@@ -42,7 +42,7 @@ class AffiliationsRORTransformer(RORTransformer):
42
42
  *args,
43
43
  vocab_schemes=vocab_schemes,
44
44
  funder_fundref_doi_prefix=funder_fundref_doi_prefix,
45
- **kwargs
45
+ **kwargs,
46
46
  )
47
47
 
48
48
 
@@ -46,7 +46,7 @@ class FundersRORTransformer(RORTransformer):
46
46
  *args,
47
47
  vocab_schemes=vocab_schemes,
48
48
  funder_fundref_doi_prefix=funder_fundref_doi_prefix,
49
- **kwargs
49
+ **kwargs,
50
50
  )
51
51
 
52
52
 
@@ -0,0 +1,288 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2021-2024 CERN.
4
+ #
5
+ # Invenio-Vocabularies is free software; you can redistribute it and/or
6
+ # modify it under the terms of the MIT License; see LICENSE file for more
7
+ # details.
8
+
9
+ """Names datastreams, transformers, writers and readers."""
10
+
11
+ import csv
12
+ import io
13
+ import tarfile
14
+ from concurrent.futures import ThreadPoolExecutor, as_completed
15
+ from datetime import timedelta
16
+
17
+ import arrow
18
+ import regex as re
19
+ from flask import current_app
20
+ from invenio_access.permissions import system_identity
21
+ from invenio_records.dictutils import dict_lookup
22
+
23
+ from invenio_vocabularies.contrib.names.s3client import S3OrcidClient
24
+
25
+ from ...datastreams.errors import TransformerError
26
+ from ...datastreams.readers import BaseReader, SimpleHTTPReader
27
+ from ...datastreams.transformers import BaseTransformer
28
+ from ...datastreams.writers import ServiceWriter
29
+
30
+
31
+ class OrcidDataSyncReader(BaseReader):
32
+ """ORCiD Data Sync Reader."""
33
+
34
+ def __init__(self, origin=None, mode="r", since=None, *args, **kwargs):
35
+ """Constructor.
36
+
37
+ :param origin: Data source (e.g. filepath).
38
+ Can be none in case of piped readers.
39
+ """
40
+ super().__init__(origin=origin, mode=mode, *args, **kwargs)
41
+ self.s3_client = S3OrcidClient()
42
+ self.since = since
43
+
44
+ def _fetch_orcid_data(self, orcid_to_sync, bucket):
45
+ """Fetches a single ORCiD record from S3."""
46
+ # The ORCiD file key is located in a folder which name corresponds to the last three digits of the ORCiD
47
+ suffix = orcid_to_sync[-3:]
48
+ key = f"{suffix}/{orcid_to_sync}.xml"
49
+ try:
50
+ return self.s3_client.read_file(f"s3://{bucket}/{key}")
51
+ except Exception as e:
52
+ # TODO: log
53
+ return None
54
+
55
+ def _process_lambda_file(self, fileobj):
56
+ """Process the ORCiD lambda file and returns a list of ORCiDs to sync.
57
+
58
+ The decoded fileobj looks like the following:
59
+ orcid, path, date_created, last_modified
60
+ 0000-0001-5109-3700, http://orcid.org/0000-0001-5109-3700, 2014-08-02 15:00:00.000,2021-08-02 15:00:00.000
61
+
62
+ Yield ORCiDs to sync until the last sync date is reached.
63
+ """
64
+ date_format = "YYYY-MM-DD HH:mm:ss.SSSSSS"
65
+ date_format_no_millis = "YYYY-MM-DD HH:mm:ss"
66
+ time_shift = current_app.config["VOCABULARIES_ORCID_SYNC_SINCE"]
67
+ if self.since:
68
+ time_shift = self.since
69
+ last_sync = arrow.now() - timedelta(**time_shift)
70
+
71
+ file_content = fileobj.read().decode("utf-8")
72
+
73
+ csv_reader = csv.DictReader(file_content.splitlines())
74
+
75
+ for row in csv_reader: # Skip the header line
76
+ orcid = row["orcid"]
77
+
78
+ # Lambda file is ordered by last modified date
79
+ last_modified_str = row["last_modified"]
80
+ try:
81
+ last_modified_date = arrow.get(last_modified_str, date_format)
82
+ except arrow.parser.ParserError:
83
+ last_modified_date = arrow.get(last_modified_str, date_format_no_millis)
84
+
85
+ if last_modified_date < last_sync:
86
+ break
87
+ yield orcid
88
+
89
+ def _iter(self, orcids):
90
+ """Iterates over the ORCiD records yielding each one."""
91
+ with ThreadPoolExecutor(
92
+ max_workers=current_app.config["VOCABULARIES_ORCID_SYNC_MAX_WORKERS"]
93
+ ) as executor:
94
+ futures = [
95
+ executor.submit(
96
+ self._fetch_orcid_data,
97
+ orcid,
98
+ current_app.config["VOCABULARIES_ORCID_SUMMARIES_BUCKET"],
99
+ )
100
+ for orcid in orcids
101
+ ]
102
+ for future in as_completed(futures):
103
+ result = future.result()
104
+ if result is not None:
105
+ yield result
106
+
107
+ def read(self, item=None, *args, **kwargs):
108
+ """Streams the ORCiD lambda file, process it to get the ORCiDS to sync and yields it's data."""
109
+ # Read the file from S3
110
+ tar_content = self.s3_client.read_file(
111
+ "s3://orcid-lambda-file/last_modified.csv.tar"
112
+ )
113
+
114
+ orcids_to_sync = []
115
+ # Opens tar file and process it
116
+ with tarfile.open(fileobj=io.BytesIO(tar_content)) as tar:
117
+ # Iterate over each member (file or directory) in the tar file
118
+ for member in tar.getmembers():
119
+ # Extract the file
120
+ extracted_file = tar.extractfile(member)
121
+ if extracted_file:
122
+ # Process the file and get the ORCiDs to sync
123
+ orcids_to_sync.extend(self._process_lambda_file(extracted_file))
124
+
125
+ yield from self._iter(orcids_to_sync)
126
+
127
+
128
+ class OrcidHTTPReader(SimpleHTTPReader):
129
+ """ORCiD HTTP Reader."""
130
+
131
+ def __init__(self, *args, test_mode=True, **kwargs):
132
+ """Constructor."""
133
+ if test_mode:
134
+ origin = "https://sandbox.orcid.org/{id}"
135
+ else:
136
+ origin = "https://orcid.org/{id}"
137
+
138
+ super().__init__(origin, *args, **kwargs)
139
+
140
+
141
+ DEFAULT_NAMES_EXCLUDE_REGEX = r"[\p{P}\p{S}\p{Nd}\p{No}\p{Emoji}--,.()\-']"
142
+ """Regex to filter out names with punctuations, symbols, decimal numbers and emojis."""
143
+
144
+
145
+ class OrcidTransformer(BaseTransformer):
146
+ """Transforms an ORCiD record into a names record."""
147
+
148
+ def __init__(
149
+ self, *args, names_exclude_regex=DEFAULT_NAMES_EXCLUDE_REGEX, **kwargs
150
+ ) -> None:
151
+ """Constructor."""
152
+ self._names_exclude_regex = names_exclude_regex
153
+ super().__init__()
154
+
155
+ def _is_valid_name(self, name):
156
+ """Check whether the name passes the regex."""
157
+ if not self._names_exclude_regex:
158
+ return True
159
+ return not bool(re.search(self._names_exclude_regex, name, re.UNICODE | re.V1))
160
+
161
+ def apply(self, stream_entry, **kwargs):
162
+ """Applies the transformation to the stream entry."""
163
+ record = stream_entry.entry
164
+ person = record["person"]
165
+ orcid_id = record["orcid-identifier"]["path"]
166
+
167
+ name = person.get("name")
168
+ if name is None:
169
+ raise TransformerError(f"Name not found in ORCiD entry.")
170
+ if name.get("family-name") is None:
171
+ raise TransformerError(f"Family name not found in ORCiD entry.")
172
+
173
+ if not self._is_valid_name(name["given-names"] + name["family-name"]):
174
+ raise TransformerError(f"Invalid characters in name.")
175
+
176
+ entry = {
177
+ "id": orcid_id,
178
+ "given_name": name.get("given-names"),
179
+ "family_name": name.get("family-name"),
180
+ "identifiers": [{"scheme": "orcid", "identifier": orcid_id}],
181
+ "affiliations": [],
182
+ }
183
+
184
+ try:
185
+ employments = dict_lookup(
186
+ record, "activities-summary.employments.affiliation-group"
187
+ )
188
+ if isinstance(employments, dict):
189
+ employments = [employments]
190
+ history = set()
191
+ for employment in employments:
192
+ terminated = employment["employment-summary"].get("end-date")
193
+ affiliation = dict_lookup(
194
+ employment,
195
+ "employment-summary.organization.name",
196
+ )
197
+ if affiliation not in history and not terminated:
198
+ history.add(affiliation)
199
+ entry["affiliations"].append({"name": affiliation})
200
+ except Exception:
201
+ pass
202
+
203
+ stream_entry.entry = entry
204
+ return stream_entry
205
+
206
+
207
+ class NamesServiceWriter(ServiceWriter):
208
+ """Names service writer."""
209
+
210
+ def __init__(self, *args, **kwargs):
211
+ """Constructor."""
212
+ service_or_name = kwargs.pop("service_or_name", "names")
213
+ super().__init__(service_or_name=service_or_name, *args, **kwargs)
214
+
215
+ def _entry_id(self, entry):
216
+ """Get the id from an entry."""
217
+ return entry["id"]
218
+
219
+
220
+ VOCABULARIES_DATASTREAM_READERS = {
221
+ "orcid-http": OrcidHTTPReader,
222
+ "orcid-data-sync": OrcidDataSyncReader,
223
+ }
224
+
225
+
226
+ VOCABULARIES_DATASTREAM_TRANSFORMERS = {
227
+ "orcid": OrcidTransformer,
228
+ }
229
+ """ORCiD Data Streams transformers."""
230
+
231
+
232
+ VOCABULARIES_DATASTREAM_WRITERS = {
233
+ "names-service": NamesServiceWriter,
234
+ }
235
+ """ORCiD Data Streams transformers."""
236
+
237
+
238
+ DATASTREAM_CONFIG = {
239
+ "readers": [
240
+ {
241
+ "type": "tar",
242
+ "args": {
243
+ "regex": "\\.xml$",
244
+ },
245
+ },
246
+ {"type": "xml"},
247
+ ],
248
+ "transformers": [{"type": "orcid"}],
249
+ "writers": [
250
+ {
251
+ "type": "names-service",
252
+ "args": {
253
+ "identity": system_identity,
254
+ },
255
+ }
256
+ ],
257
+ }
258
+ """ORCiD Data Stream configuration.
259
+
260
+ An origin is required for the reader.
261
+ """
262
+
263
+ # TODO: Used on the jobs and should be set as a "PRESET" (naming to be defined)
264
+ ORCID_PRESET_DATASTREAM_CONFIG = {
265
+ "readers": [
266
+ {
267
+ "type": "orcid-data-sync",
268
+ },
269
+ {"type": "xml"},
270
+ ],
271
+ "transformers": [{"type": "orcid"}],
272
+ "writers": [
273
+ {
274
+ "type": "async",
275
+ "args": {
276
+ "writer": {
277
+ "type": "names-service",
278
+ }
279
+ },
280
+ }
281
+ ],
282
+ "batch_size": 1000,
283
+ "write_many": True,
284
+ }
285
+ """ORCiD Data Stream configuration.
286
+
287
+ An origin is required for the reader.
288
+ """
@@ -8,6 +8,7 @@
8
8
 
9
9
  """Vocabulary names."""
10
10
 
11
+ from flask_resources import JSONSerializer, ResponseHandler
11
12
  from invenio_db import db
12
13
  from invenio_records.dumpers import SearchDumper
13
14
  from invenio_records.dumpers.indexedat import IndexedAtDumperExt
@@ -18,6 +19,7 @@ from invenio_records_resources.records.systemfields import (
18
19
  ModelPIDField,
19
20
  PIDListRelation,
20
21
  )
22
+ from invenio_records_resources.resources.records.headers import etag_headers
21
23
 
22
24
  from ...services.permissions import PermissionPolicy
23
25
  from ..affiliations.api import Affiliation
@@ -63,4 +65,12 @@ record_type = RecordTypeFactory(
63
65
  permission_policy_cls=PermissionPolicy,
64
66
  # Resource layer
65
67
  endpoint_route="/names",
68
+ resource_cls_attrs={
69
+ "response_handlers": {
70
+ "application/json": ResponseHandler(JSONSerializer(), headers=etag_headers),
71
+ "application/vnd.inveniordm.v1+json": ResponseHandler(
72
+ JSONSerializer(), headers=etag_headers
73
+ ),
74
+ }
75
+ },
66
76
  )
@@ -0,0 +1,44 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # This file is part of Invenio.
4
+ # Copyright (C) 2024 CERN.
5
+ #
6
+ # Invenio-Vocabularies is free software; you can redistribute it and/or
7
+ # modify it under the terms of the MIT License; see LICENSE file for more
8
+ # details.
9
+
10
+ """S3 client."""
11
+
12
+ from flask import current_app
13
+
14
+ try:
15
+ import s3fs
16
+ except ImportError:
17
+ s3fs = None
18
+
19
+
20
+ class S3Client:
21
+ """S3 client."""
22
+
23
+ def __init__(self, access_key, secret_key):
24
+ """Constructor."""
25
+ if s3fs is None:
26
+ raise Exception("s3fs is not installed.")
27
+
28
+ self.fs = s3fs.S3FileSystem(key=access_key, secret=secret_key)
29
+
30
+ def read_file(self, s3_path):
31
+ """Reads a file from S3."""
32
+ with self.fs.open(s3_path, "rb") as f:
33
+ return f.read()
34
+
35
+
36
+ class S3OrcidClient(S3Client):
37
+ """S3 ORCiD client."""
38
+
39
+ def __init__(self):
40
+ """Constructor."""
41
+ super().__init__(
42
+ access_key=current_app.config["VOCABULARIES_ORCID_ACCESS_KEY"],
43
+ secret_key=current_app.config["VOCABULARIES_ORCID_SECRET_KEY"],
44
+ )
@@ -9,9 +9,11 @@
9
9
 
10
10
  """Vocabulary subjects."""
11
11
 
12
+ from flask_resources import JSONSerializer, ResponseHandler
12
13
  from invenio_records.dumpers import SearchDumper
13
14
  from invenio_records.dumpers.indexedat import IndexedAtDumperExt
14
15
  from invenio_records_resources.factories.factory import RecordTypeFactory
16
+ from invenio_records_resources.resources.records.headers import etag_headers
15
17
 
16
18
  from ...records.pidprovider import PIDProviderFactory
17
19
  from ...records.systemfields import BaseVocabularyPIDFieldContext
@@ -42,4 +44,12 @@ record_type = RecordTypeFactory(
42
44
  permission_policy_cls=PermissionPolicy,
43
45
  # Resource layer
44
46
  endpoint_route="/subjects",
47
+ resource_cls_attrs={
48
+ "response_handlers": {
49
+ "application/json": ResponseHandler(JSONSerializer(), headers=etag_headers),
50
+ "application/vnd.inveniordm.v1+json": ResponseHandler(
51
+ JSONSerializer(), headers=etag_headers
52
+ ),
53
+ }
54
+ },
45
55
  )