invenio-vocabularies 5.1.0__py2.py3-none-any.whl → 6.1.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (39) hide show
  1. invenio_vocabularies/__init__.py +1 -1
  2. invenio_vocabularies/cli.py +7 -2
  3. invenio_vocabularies/config.py +13 -0
  4. invenio_vocabularies/contrib/affiliations/datastreams.py +95 -1
  5. invenio_vocabularies/contrib/awards/awards.py +15 -4
  6. invenio_vocabularies/contrib/awards/datastreams.py +156 -60
  7. invenio_vocabularies/contrib/awards/jsonschemas/awards/award-v1.0.0.json +35 -0
  8. invenio_vocabularies/contrib/awards/mappings/os-v1/awards/award-v1.0.0.json +44 -1
  9. invenio_vocabularies/contrib/awards/mappings/os-v2/awards/award-v1.0.0.json +44 -1
  10. invenio_vocabularies/contrib/awards/mappings/v7/awards/award-v1.0.0.json +44 -1
  11. invenio_vocabularies/contrib/awards/schema.py +16 -1
  12. invenio_vocabularies/contrib/awards/serializer.py +8 -1
  13. invenio_vocabularies/contrib/common/openaire/__init__.py +9 -0
  14. invenio_vocabularies/contrib/common/openaire/datastreams.py +84 -0
  15. invenio_vocabularies/contrib/common/ror/datastreams.py +20 -7
  16. invenio_vocabularies/contrib/names/datastreams.py +12 -2
  17. invenio_vocabularies/contrib/names/names.py +4 -3
  18. invenio_vocabularies/contrib/names/permissions.py +20 -0
  19. invenio_vocabularies/contrib/subjects/datastreams.py +12 -6
  20. invenio_vocabularies/contrib/subjects/euroscivoc/__init__.py +9 -0
  21. invenio_vocabularies/contrib/subjects/euroscivoc/datastreams.py +171 -0
  22. invenio_vocabularies/contrib/subjects/jsonschemas/subjects/subject-v1.0.0.json +16 -0
  23. invenio_vocabularies/contrib/subjects/mappings/os-v1/subjects/subject-v1.0.0.json +14 -0
  24. invenio_vocabularies/contrib/subjects/mappings/os-v2/subjects/subject-v1.0.0.json +14 -0
  25. invenio_vocabularies/contrib/subjects/mappings/v7/subjects/subject-v1.0.0.json +14 -0
  26. invenio_vocabularies/contrib/subjects/mesh/__init__.py +9 -0
  27. invenio_vocabularies/contrib/subjects/schema.py +30 -6
  28. invenio_vocabularies/datastreams/readers.py +15 -4
  29. invenio_vocabularies/datastreams/transformers.py +15 -4
  30. invenio_vocabularies/datastreams/writers.py +44 -12
  31. invenio_vocabularies/factories.py +30 -0
  32. invenio_vocabularies/jobs.py +88 -0
  33. {invenio_vocabularies-5.1.0.dist-info → invenio_vocabularies-6.1.0.dist-info}/METADATA +16 -1
  34. {invenio_vocabularies-5.1.0.dist-info → invenio_vocabularies-6.1.0.dist-info}/RECORD +39 -32
  35. {invenio_vocabularies-5.1.0.dist-info → invenio_vocabularies-6.1.0.dist-info}/entry_points.txt +3 -0
  36. {invenio_vocabularies-5.1.0.dist-info → invenio_vocabularies-6.1.0.dist-info}/AUTHORS.rst +0 -0
  37. {invenio_vocabularies-5.1.0.dist-info → invenio_vocabularies-6.1.0.dist-info}/LICENSE +0 -0
  38. {invenio_vocabularies-5.1.0.dist-info → invenio_vocabularies-6.1.0.dist-info}/WHEEL +0 -0
  39. {invenio_vocabularies-5.1.0.dist-info → invenio_vocabularies-6.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 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
+ """MeSH Subjects module."""
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  # Copyright (C) 2021 Northwestern University.
4
- # Copyright (C) 2021-2022 CERN.
4
+ # Copyright (C) 2021-2024 CERN.
5
5
  # Copyright (C) 2024 University of Münster.
6
6
  #
7
7
  # Invenio-Vocabularies is free software; you can redistribute it and/or
@@ -10,15 +10,19 @@
10
10
 
11
11
  """Subjects schema."""
12
12
 
13
+ from functools import partial
14
+
13
15
  from invenio_i18n import get_locale
14
- from marshmallow import fields, pre_load
15
- from marshmallow_utils.fields import SanitizedUnicode
16
+ from marshmallow import Schema, fields, pre_load
17
+ from marshmallow_utils.fields import IdentifierSet, SanitizedUnicode
18
+ from marshmallow_utils.schemas import IdentifierSchema
16
19
 
17
20
  from ...services.schema import (
18
21
  BaseVocabularySchema,
19
22
  ContribVocabularyRelationSchema,
20
23
  i18n_strings,
21
24
  )
25
+ from .config import subject_schemes
22
26
 
23
27
 
24
28
  class SubjectSchema(BaseVocabularySchema):
@@ -31,6 +35,16 @@ class SubjectSchema(BaseVocabularySchema):
31
35
  scheme = SanitizedUnicode(required=True)
32
36
  subject = SanitizedUnicode(required=True)
33
37
  title = i18n_strings
38
+ props = fields.Dict(keys=SanitizedUnicode(), values=SanitizedUnicode())
39
+ identifiers = IdentifierSet(
40
+ fields.Nested(
41
+ partial(
42
+ IdentifierSchema,
43
+ allowed_schemes=subject_schemes,
44
+ identifier_required=False,
45
+ )
46
+ )
47
+ )
34
48
  synonyms = fields.List(SanitizedUnicode())
35
49
 
36
50
  @pre_load
@@ -48,6 +62,16 @@ class SubjectRelationSchema(ContribVocabularyRelationSchema):
48
62
  ftf_name = "subject"
49
63
  parent_field_name = "subjects"
50
64
  subject = SanitizedUnicode()
51
- scheme = SanitizedUnicode()
52
- title = i18n_strings
53
- synonyms = fields.List(SanitizedUnicode())
65
+ scheme = SanitizedUnicode(dump_only=True)
66
+ title = fields.Dict(dump_only=True)
67
+ props = fields.Dict(dump_only=True)
68
+ identifiers = IdentifierSet(
69
+ fields.Nested(
70
+ partial(
71
+ IdentifierSchema,
72
+ allowed_schemes=subject_schemes,
73
+ identifier_required=False,
74
+ )
75
+ )
76
+ )
77
+ synonyms = fields.List(SanitizedUnicode(), dump_only=True)
@@ -224,19 +224,30 @@ class CSVReader(BaseReader):
224
224
  class XMLReader(BaseReader):
225
225
  """XML reader."""
226
226
 
227
+ def __init__(self, root_element=None, *args, **kwargs):
228
+ """Constructor."""
229
+ self.root_element = root_element
230
+ super().__init__(*args, **kwargs)
231
+
227
232
  def _iter(self, fp, *args, **kwargs):
228
233
  """Read and parse an XML file to dict."""
229
234
  # NOTE: We parse HTML, to skip XML validation and strip XML namespaces
230
235
  record = None
231
236
  try:
232
237
  xml_tree = fromstring(fp)
233
- record = etree_to_dict(xml_tree).get("record")
238
+ xml_dict = etree_to_dict(xml_tree)
234
239
  except Exception as e:
235
240
  xml_tree = html_parse(fp).getroot()
236
- record = etree_to_dict(xml_tree)["html"]["body"].get("record")
241
+ xml_dict = etree_to_dict(xml_tree)["html"]["body"]
237
242
 
238
- if not record:
239
- raise ReaderError(f"Record not found in XML entry.")
243
+ if self.root_element:
244
+ record = xml_dict.get(self.root_element)
245
+ if not record:
246
+ raise ReaderError(
247
+ f"Root element '{self.root_element}' not found in XML entry."
248
+ )
249
+ else:
250
+ record = xml_dict
240
251
 
241
252
  yield record
242
253
 
@@ -32,6 +32,11 @@ class BaseTransformer(ABC):
32
32
  class XMLTransformer(BaseTransformer):
33
33
  """XML transformer."""
34
34
 
35
+ def __init__(self, root_element=None, *args, **kwargs):
36
+ """Initializes the transformer."""
37
+ self.root_element = root_element
38
+ super().__init__(*args, **kwargs)
39
+
35
40
  @classmethod
36
41
  def _xml_to_etree(cls, xml):
37
42
  """Converts XML to a lxml etree."""
@@ -43,10 +48,16 @@ class XMLTransformer(BaseTransformer):
43
48
  Requires the root element to be named "record".
44
49
  """
45
50
  xml_tree = self._xml_to_etree(stream_entry.entry)
46
- record = etree_to_dict(xml_tree)["html"]["body"].get("record")
47
-
48
- if not record:
49
- raise TransformerError(f"Record not found in XML entry.")
51
+ xml_dict = etree_to_dict(xml_tree)["html"]["body"]
52
+
53
+ if self.root_element:
54
+ record = xml_dict.get(self.root_element)
55
+ if not record:
56
+ raise TransformerError(
57
+ f"Root element '{self.root_element}' not found in XML entry."
58
+ )
59
+ else:
60
+ record = xml_dict
50
61
 
51
62
  stream_entry.entry = record
52
63
  return stream_entry
@@ -13,10 +13,11 @@ from pathlib import Path
13
13
 
14
14
  import yaml
15
15
  from invenio_access.permissions import system_identity
16
- from invenio_pidstore.errors import PIDAlreadyExists
16
+ from invenio_pidstore.errors import PIDAlreadyExists, PIDDoesNotExistError
17
17
  from invenio_records.systemfields.relations.errors import InvalidRelationValue
18
18
  from invenio_records_resources.proxies import current_service_registry
19
19
  from marshmallow import ValidationError
20
+ from sqlalchemy.exc import NoResultFound
20
21
 
21
22
  from .datastreams import StreamEntry
22
23
  from .errors import WriterError
@@ -55,12 +56,15 @@ class BaseWriter(ABC):
55
56
  class ServiceWriter(BaseWriter):
56
57
  """Writes the entries to an RDM instance using a Service object."""
57
58
 
58
- def __init__(self, service_or_name, *args, identity=None, update=False, **kwargs):
59
+ def __init__(
60
+ self, service_or_name, *args, identity=None, insert=True, update=False, **kwargs
61
+ ):
59
62
  """Constructor.
60
63
 
61
64
  :param service_or_name: a service instance or a key of the
62
65
  service registry.
63
66
  :param identity: access identity.
67
+ :param insert: if True it will insert records which do not exist.
64
68
  :param update: if True it will update records if they exist.
65
69
  """
66
70
  if isinstance(service_or_name, str):
@@ -68,6 +72,7 @@ class ServiceWriter(BaseWriter):
68
72
 
69
73
  self._service = service_or_name
70
74
  self._identity = identity or system_identity
75
+ self._insert = insert
71
76
  self._update = update
72
77
 
73
78
  super().__init__(*args, **kwargs)
@@ -79,20 +84,47 @@ class ServiceWriter(BaseWriter):
79
84
  def _resolve(self, id_):
80
85
  return self._service.read(self._identity, id_)
81
86
 
87
+ def _do_update(self, entry):
88
+ vocab_id = self._entry_id(entry)
89
+ current = self._resolve(vocab_id)
90
+ combined_dict = current.to_dict()
91
+
92
+ # Update fields from entry
93
+ for key, value in entry.items():
94
+ if key in combined_dict:
95
+ if isinstance(combined_dict[key], list) and isinstance(value, list):
96
+ combined_dict[key].extend(
97
+ item for item in value if item not in combined_dict[key]
98
+ )
99
+ else:
100
+ combined_dict[key] = value
101
+ else:
102
+ combined_dict[key] = value
103
+
104
+ return StreamEntry(
105
+ self._service.update(self._identity, vocab_id, combined_dict)
106
+ )
107
+
82
108
  def write(self, stream_entry, *args, **kwargs):
83
109
  """Writes the input entry using a given service."""
84
110
  entry = stream_entry.entry
111
+
85
112
  try:
86
- try:
87
- return StreamEntry(self._service.create(self._identity, entry))
88
- except PIDAlreadyExists:
89
- if not self._update:
90
- raise WriterError([f"Vocabulary entry already exists: {entry}"])
91
- vocab_id = self._entry_id(entry)
92
- current = self._resolve(vocab_id)
93
- updated = dict(current.to_dict(), **entry)
94
- return StreamEntry(
95
- self._service.update(self._identity, vocab_id, updated)
113
+ if self._insert:
114
+ try:
115
+ return StreamEntry(self._service.create(self._identity, entry))
116
+ except PIDAlreadyExists:
117
+ if not self._update:
118
+ raise WriterError([f"Vocabulary entry already exists: {entry}"])
119
+ return self._do_update(entry)
120
+ elif self._update:
121
+ try:
122
+ return self._do_update(entry)
123
+ except (NoResultFound, PIDDoesNotExistError):
124
+ raise WriterError([f"Vocabulary entry does not exist: {entry}"])
125
+ else:
126
+ raise WriterError(
127
+ ["Writer wrongly configured to not insert and to not update"]
96
128
  )
97
129
 
98
130
  except ValidationError as err:
@@ -16,7 +16,13 @@ from invenio_records_resources.proxies import current_service_registry
16
16
  from .contrib.affiliations.datastreams import (
17
17
  DATASTREAM_CONFIG as affiliations_ds_config,
18
18
  )
19
+ from .contrib.affiliations.datastreams import (
20
+ DATASTREAM_CONFIG_OPENAIRE as affiliations_openaire_ds_config,
21
+ )
19
22
  from .contrib.awards.datastreams import DATASTREAM_CONFIG as awards_ds_config
23
+ from .contrib.awards.datastreams import (
24
+ DATASTREAM_CONFIG_CORDIS as awards_cordis_ds_config,
25
+ )
20
26
  from .contrib.funders.datastreams import DATASTREAM_CONFIG as funders_ds_config
21
27
  from .contrib.names.datastreams import DATASTREAM_CONFIG as names_ds_config
22
28
  from .contrib.subjects.datastreams import DATASTREAM_CONFIG as subjects_ds_config
@@ -84,6 +90,17 @@ class AwardsVocabularyConfig(VocabularyConfig):
84
90
  raise NotImplementedError("Service not implemented for Awards")
85
91
 
86
92
 
93
+ class AwardsCordisVocabularyConfig(VocabularyConfig):
94
+ """Awards Vocabulary Config."""
95
+
96
+ config = awards_cordis_ds_config
97
+ vocabulary_name = "awards:cordis"
98
+
99
+ def get_service(self):
100
+ """Get the service for the vocabulary."""
101
+ raise NotImplementedError("Service not implemented for CORDIS Awards")
102
+
103
+
87
104
  class AffiliationsVocabularyConfig(VocabularyConfig):
88
105
  """Affiliations Vocabulary Config."""
89
106
 
@@ -95,13 +112,26 @@ class AffiliationsVocabularyConfig(VocabularyConfig):
95
112
  raise NotImplementedError("Service not implemented for Affiliations")
96
113
 
97
114
 
115
+ class AffiliationsOpenAIREVocabularyConfig(VocabularyConfig):
116
+ """OpenAIRE Affiliations Vocabulary Config."""
117
+
118
+ config = affiliations_openaire_ds_config
119
+ vocabulary_name = "affiliations:openaire"
120
+
121
+ def get_service(self):
122
+ """Get the service for the vocabulary."""
123
+ raise NotImplementedError("Service not implemented for OpenAIRE Affiliations")
124
+
125
+
98
126
  def get_vocabulary_config(vocabulary):
99
127
  """Factory function to get the appropriate Vocabulary Config."""
100
128
  vocab_config = {
101
129
  "names": NamesVocabularyConfig,
102
130
  "funders": FundersVocabularyConfig,
103
131
  "awards": AwardsVocabularyConfig,
132
+ "awards:cordis": AwardsCordisVocabularyConfig,
104
133
  "affiliations": AffiliationsVocabularyConfig,
134
+ "affiliations:openaire": AffiliationsOpenAIREVocabularyConfig,
105
135
  "subjects": SubjectsVocabularyConfig,
106
136
  }
107
137
  return vocab_config.get(vocabulary, VocabularyConfig)()
@@ -0,0 +1,88 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2021-2022 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
+ """Jobs module."""
10
+
11
+ import datetime
12
+ from datetime import timezone
13
+
14
+ from invenio_i18n import gettext as _
15
+ from invenio_jobs.jobs import JobType
16
+ from marshmallow import Schema, fields
17
+ from marshmallow_utils.fields import TZDateTime
18
+
19
+ from invenio_vocabularies.services.tasks import process_datastream
20
+
21
+
22
+ class ArgsSchema(Schema):
23
+ """Schema of task input arguments."""
24
+
25
+ since = TZDateTime(
26
+ timezone=timezone.utc,
27
+ format="iso",
28
+ metadata={
29
+ "description": _(
30
+ "YYYY-MM-DD HH:mm format. "
31
+ "Leave field empty if it should continue since last successful run."
32
+ )
33
+ },
34
+ )
35
+ job_arg_schema = fields.String(
36
+ metadata={"type": "hidden"},
37
+ dump_default="ArgsSchema",
38
+ load_default="ArgsSchema",
39
+ )
40
+
41
+
42
+ class ProcessDataStreamJob(JobType):
43
+ """Generic process data stream job type."""
44
+
45
+ arguments_schema = ArgsSchema
46
+ task = process_datastream
47
+ id = None
48
+
49
+
50
+ class ProcessRORAffiliationsJob(ProcessDataStreamJob):
51
+ """Process ROR affiliations datastream registered task."""
52
+
53
+ description = "Process ROR affiliations"
54
+ title = "Load ROR affiliations"
55
+ id = "process_ror_affiliations"
56
+
57
+ @classmethod
58
+ def default_args(cls, job_obj, since=None, **kwargs):
59
+ """Generate default job arguments here."""
60
+ if since is None and job_obj.last_runs["success"]:
61
+ since = job_obj.last_runs["success"].started_at
62
+ else:
63
+ since = datetime.datetime.now()
64
+
65
+ return {
66
+ "config": {
67
+ "readers": [
68
+ {
69
+ "args": {"since": since},
70
+ "type": "ror-http",
71
+ },
72
+ {"args": {"regex": "_schema_v2\\.json$"}, "type": "zip"},
73
+ {"type": "json"},
74
+ ],
75
+ "writers": [
76
+ {
77
+ "args": {
78
+ "writer": {
79
+ "type": "affiliations-service",
80
+ "args": {"update": True},
81
+ }
82
+ },
83
+ "type": "async",
84
+ }
85
+ ],
86
+ "transformers": [{"type": "ror-affiliations"}],
87
+ }
88
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: invenio-vocabularies
3
- Version: 5.1.0
3
+ Version: 6.1.0
4
4
  Summary: Invenio module for managing vocabularies.
5
5
  Home-page: https://github.com/inveniosoftware/invenio-vocabularies
6
6
  Author: CERN
@@ -13,9 +13,11 @@ Requires-Python: >=3.7
13
13
  Requires-Dist: invenio-i18n <3.0.0,>=2.0.0
14
14
  Requires-Dist: invenio-records-resources <7.0.0,>=6.0.0
15
15
  Requires-Dist: invenio-administration <3.0.0,>=2.0.0
16
+ Requires-Dist: invenio-jobs <2.0.0,>=1.0.0
16
17
  Requires-Dist: lxml >=4.5.0
17
18
  Requires-Dist: PyYAML >=5.4.1
18
19
  Requires-Dist: regex >=2024.7.24
20
+ Requires-Dist: rdflib >=7.0.0
19
21
  Provides-Extra: elasticsearch7
20
22
  Requires-Dist: invenio-search[elasticsearch7] <3.0.0,>=2.1.0 ; extra == 'elasticsearch7'
21
23
  Provides-Extra: mysql
@@ -81,6 +83,19 @@ https://invenio-vocabularies.readthedocs.io/
81
83
  Changes
82
84
  =======
83
85
 
86
+ Version v6.1.0 (released 2024-10-10)
87
+
88
+ - jobs: define invenio job wrapper for ROR affiliation data stream
89
+ - awards: remove subj props from jsonschema
90
+
91
+ Version v6.0.0 (released 2024-10-03)
92
+
93
+ - datastreams: writers: add option to not insert
94
+ - subjects: added euroscivoc datastream
95
+ - affiliations: OpenAIRE transformer and writer adding PIC identifier
96
+ - awards: added subjects and participating organizations from CORDIS datastreams
97
+ - names: add permission check to names search
98
+
84
99
  Version v5.1.0 (released 2024-09-25)
85
100
 
86
101
  - funders: tune search boost for acronyms
@@ -1,9 +1,10 @@
1
- invenio_vocabularies/__init__.py,sha256=EY0EBDXPeTzwN5DQMUlFBqdRhHxUqKpyOeWjvG3og0U,377
2
- invenio_vocabularies/cli.py,sha256=ToGc5dcGarDwNUgUXGqHIRT-3Uv1rleyFLKenwZdyBw,5719
3
- invenio_vocabularies/config.py,sha256=sOkJdmnfoSftfpH7msZEC6Eyo61Q3RQ7V2mMeE5LPAM,5157
1
+ invenio_vocabularies/__init__.py,sha256=FP2iYtN9rANG4J8ur97OwNGV6rvg034f6BWA90bCUNM,377
2
+ invenio_vocabularies/cli.py,sha256=S3lBsLxsSYa83sCDaGZr5mP7TwPvmmwxzzbB13h8VBI,5856
3
+ invenio_vocabularies/config.py,sha256=bpNKVgwfb7bgkP5zbmoawnAMD6bHWXIJV-6CpEhi-M8,5752
4
4
  invenio_vocabularies/ext.py,sha256=GujJ4UARd4Fxf4z7zznRk9JAgHamZuYCOdrKU5czg00,5987
5
- invenio_vocabularies/factories.py,sha256=VLMoWUZ8DKoJWnKA-HoWE1NlTewrB0GvRg3ej56pVYc,3339
5
+ invenio_vocabularies/factories.py,sha256=mVg4yGKe58e4uS8rYe0DmIO6oMpmtNTcK3wH9eM5jVU,4380
6
6
  invenio_vocabularies/fixtures.py,sha256=nNWwH04HFASjfj1oy5kMdcQGKmVjzUuA5wSw-ER1QAg,1585
7
+ invenio_vocabularies/jobs.py,sha256=QBWgScrUlKJagpOvwXN12G1OsvW6NM-IFKRgkbW_edg,2549
7
8
  invenio_vocabularies/proxies.py,sha256=k7cTUgWfnCoYIuNqAj_VFi1zBN33KNNclRSVnBkObEM,711
8
9
  invenio_vocabularies/views.py,sha256=PNJ5nvc3O7ASwNe56xmqy5YaU9n3UYF3W2JwvtE_kYs,1561
9
10
  invenio_vocabularies/webpack.py,sha256=bp2vz3O8QdZwrznsV-SjAmS0g1nV9WGWqc-7ZJQY5PQ,1891
@@ -46,7 +47,7 @@ invenio_vocabularies/contrib/affiliations/__init__.py,sha256=rV8YAzBRoSKsBYcVjCN
46
47
  invenio_vocabularies/contrib/affiliations/affiliations.py,sha256=BSEjzAjLq17GGKHyPrgC5VLluvZqVnKMepIiqqLQKzo,2077
47
48
  invenio_vocabularies/contrib/affiliations/api.py,sha256=5nIOvpfcseuAAg2XgblHc8jb7TAdfU79XOBRpL-p398,326
48
49
  invenio_vocabularies/contrib/affiliations/config.py,sha256=kk-zAl7Uyi6N4qVOiCkBD9cN1KKOvDcILDHJ-zoIzJA,2084
49
- invenio_vocabularies/contrib/affiliations/datastreams.py,sha256=Mn62EBBkGwO09qjrXY71qDIrS2mNgarb89ez69Vw4Yk,2384
50
+ invenio_vocabularies/contrib/affiliations/datastreams.py,sha256=vEH6wj951LLa9pSsNb0rS8IVJ1zWbEQDDe0Cu770J9k,5479
50
51
  invenio_vocabularies/contrib/affiliations/facets.py,sha256=w316MGvtdyTpRCPOpCEmMxxLraRkbFFb1VvLkFlEc9o,1229
51
52
  invenio_vocabularies/contrib/affiliations/models.py,sha256=JUcj-1ydc2Cw2Rsc24JwXE3TFBJ_6fivhUYhGq4rT8A,329
52
53
  invenio_vocabularies/contrib/affiliations/resources.py,sha256=DBEbRxQmp-o-PeZlgFG588Q4sGcruuwIL8L9O-SzCes,435
@@ -65,26 +66,28 @@ invenio_vocabularies/contrib/affiliations/mappings/v7/__init__.py,sha256=zr9YyyK
65
66
  invenio_vocabularies/contrib/affiliations/mappings/v7/affiliations/affiliation-v1.0.0.json,sha256=PaHChFsf9r7xRnZ_7ro8SWNEXpWv4uUYrl32g0QESZs,2096
66
67
  invenio_vocabularies/contrib/awards/__init__.py,sha256=KwCmwFalz-3pDs9iTa5TKUidBjLepnUMqpCBXRiQOO8,474
67
68
  invenio_vocabularies/contrib/awards/api.py,sha256=OXukE7PLXs45BTtqVrhvGBNqLmQaI-CgXmHTCi36LZk,303
68
- invenio_vocabularies/contrib/awards/awards.py,sha256=FU7XKSsfEIqaQYyCFjPMDbD2z-lwGsicuLXg69HO6oE,2701
69
+ invenio_vocabularies/contrib/awards/awards.py,sha256=tOLvcvTPiN1gn1QAl-hSh1bwcclg8Kx2ZMmJMEhI7vk,2959
69
70
  invenio_vocabularies/contrib/awards/config.py,sha256=PlDHabkWDUzwa1Fvk_U2hG83kQYBqM1IyChg8Yg_VlY,1630
70
- invenio_vocabularies/contrib/awards/datastreams.py,sha256=wQIhLGXSYCIjwXzTofpiaSjnO1XuDpiOlH5TqiGix4c,8245
71
+ invenio_vocabularies/contrib/awards/datastreams.py,sha256=j6dtimniWg9faHzV1J49QpAgUJDDW3rjQR0_Mhcfqm4,11147
71
72
  invenio_vocabularies/contrib/awards/models.py,sha256=mM-kSNf7kDH3oIbV8epxxbUi7muYqi4JreXxgWXlVzw,318
72
73
  invenio_vocabularies/contrib/awards/resources.py,sha256=_9YTqbhz8axFXGhG5y4WyjE27p9n-7e3c6HoBRditPA,411
73
- invenio_vocabularies/contrib/awards/schema.py,sha256=bg-09nvhEn-ipzaztK1iNbKc59saAM8v8hAW9zpKDAc,2786
74
- invenio_vocabularies/contrib/awards/serializer.py,sha256=MDnq41EJf_LFu-UT6qlB3-O2S7aEYePIzQ_immMnwag,1139
74
+ invenio_vocabularies/contrib/awards/schema.py,sha256=P_k9EONMMx0eWpALVuhGBzZlDeh4599elLlmMis-Vko,3302
75
+ invenio_vocabularies/contrib/awards/serializer.py,sha256=W59OMDxOXPdXrrimzMdIPbDIfVk6hARgyz1N2xSbchA,1440
75
76
  invenio_vocabularies/contrib/awards/services.py,sha256=zwOMHqa4SyZuHopGZwEKhfw3kUHrWg73_4zMNo5kOe4,371
76
77
  invenio_vocabularies/contrib/awards/jsonschemas/__init__.py,sha256=XB2l9hr53vqTk7o9lmy18FWGhHEUvNHu8D6nMF8Bz4k,246
77
- invenio_vocabularies/contrib/awards/jsonschemas/awards/award-v1.0.0.json,sha256=XKHjWWmv7Ph6v-JxPsP09V_6Pr9QNJcJeZdaU5HZWwU,1117
78
+ invenio_vocabularies/contrib/awards/jsonschemas/awards/award-v1.0.0.json,sha256=KUJW0XaHSU8iYNtK0Hb1H42jlhw-oL4Y644Q_-aSlTo,2131
78
79
  invenio_vocabularies/contrib/awards/mappings/__init__.py,sha256=PbM5urjiSrJSx4Ak-H_lJrOOVKGT38MrGgRv61gIbAM,243
79
80
  invenio_vocabularies/contrib/awards/mappings/os-v1/__init__.py,sha256=r8IZvjorG9SVz32Hv1fncoqLfz-5Ml0Ph3jiYWCHBPk,250
80
- invenio_vocabularies/contrib/awards/mappings/os-v1/awards/award-v1.0.0.json,sha256=QJT2gS7SE47YTP2HdU4ESjMwHJBTzAH70JEhWWg9SXM,1528
81
+ invenio_vocabularies/contrib/awards/mappings/os-v1/awards/award-v1.0.0.json,sha256=dcE1dvgGBYYb7vziGArmXb64rg2HpBdiIw_aP3oYaDw,2441
81
82
  invenio_vocabularies/contrib/awards/mappings/os-v2/__init__.py,sha256=9gRLFRtjhNJcbop3qz8iRpQVEng_wudDTbOFsS-gxjk,250
82
- invenio_vocabularies/contrib/awards/mappings/os-v2/awards/award-v1.0.0.json,sha256=QJT2gS7SE47YTP2HdU4ESjMwHJBTzAH70JEhWWg9SXM,1528
83
+ invenio_vocabularies/contrib/awards/mappings/os-v2/awards/award-v1.0.0.json,sha256=dcE1dvgGBYYb7vziGArmXb64rg2HpBdiIw_aP3oYaDw,2441
83
84
  invenio_vocabularies/contrib/awards/mappings/v7/__init__.py,sha256=fERdPp7K7ajaoUu_4_HVLfF-WD_qcl7QgST6yGb68s4,253
84
- invenio_vocabularies/contrib/awards/mappings/v7/awards/award-v1.0.0.json,sha256=QJT2gS7SE47YTP2HdU4ESjMwHJBTzAH70JEhWWg9SXM,1528
85
+ invenio_vocabularies/contrib/awards/mappings/v7/awards/award-v1.0.0.json,sha256=dcE1dvgGBYYb7vziGArmXb64rg2HpBdiIw_aP3oYaDw,2441
85
86
  invenio_vocabularies/contrib/common/__init__.py,sha256=DdbGYRthEpQtObhY_YK4vOT9Zf7FFagQ6qtUjJOYw-M,247
87
+ invenio_vocabularies/contrib/common/openaire/__init__.py,sha256=L7UtSimFJ3NI6j53bHzYKsWpFti1uo4fPb9OaTl7leI,244
88
+ invenio_vocabularies/contrib/common/openaire/datastreams.py,sha256=BV6NtBCPFuii6KbTHGkgNQO5tt_3Hn9T_219bz8AINg,3514
86
89
  invenio_vocabularies/contrib/common/ror/__init__.py,sha256=3u2-fre1SQ-4nz3Ay0nxj3ntmMZ8Ujh_4eV-fyxfmtc,239
87
- invenio_vocabularies/contrib/common/ror/datastreams.py,sha256=7VaQUGtc4j0fX6P16csjAUgIVxSDEySrdZ5QZ57RD_g,7941
90
+ invenio_vocabularies/contrib/common/ror/datastreams.py,sha256=arhB2OKu3Hl0Sn6urTxBQh_kim4oc9TTMRAwzi4pbXE,8057
88
91
  invenio_vocabularies/contrib/funders/__init__.py,sha256=YxFXBDnT7NM8rFwxT_Ge3xXR2n17EM0alknQq7r_Bt8,478
89
92
  invenio_vocabularies/contrib/funders/api.py,sha256=QKGGeSnPHSoBfucvpaVruXT_txYidofZ080G3IxFkIo,306
90
93
  invenio_vocabularies/contrib/funders/config.py,sha256=EU7UrwLOkr2Bem9Skz_HJIxyBQRkXEdPT8zIuV8vbzI,2217
@@ -110,9 +113,10 @@ invenio_vocabularies/contrib/funders/mappings/v7/funders/funder-v1.0.0.json,sha2
110
113
  invenio_vocabularies/contrib/names/__init__.py,sha256=DBfsM7JMETZGaV5QmXEwE7zhCaAXvc2SZN6uXnW_V-c,451
111
114
  invenio_vocabularies/contrib/names/api.py,sha256=sEPn_jFX3gyoxgbdEUSIvOoPCUI8pocI6qCZO6mzCgQ,300
112
115
  invenio_vocabularies/contrib/names/config.py,sha256=8FVtMuq1NHC0cz8O-p_-Ng_IpHE9PTOVqQ7KDJIm7qA,1905
113
- invenio_vocabularies/contrib/names/datastreams.py,sha256=PgCUwK0qpw_r0NTA17w7eqCDhgL2xd0tIXZ9-GjOT2M,9301
116
+ invenio_vocabularies/contrib/names/datastreams.py,sha256=EKatHb0gkvcC9LCYBLIcN5pAgklBY4G43lZR_XE52wY,9505
114
117
  invenio_vocabularies/contrib/names/models.py,sha256=SYdtDDG-y5Wq_d06YhiVO5n8gfxPW_mx-tECsIcv5H8,308
115
- invenio_vocabularies/contrib/names/names.py,sha256=Tq9dO_V1F2URzHNqt8QTHnlFjujDQxooXMlTkZ0lcaI,2459
118
+ invenio_vocabularies/contrib/names/names.py,sha256=x_kcSrH48Q6Iqx1zeCcat5xRmTLe_KqZd5CbHCeR2C4,2498
119
+ invenio_vocabularies/contrib/names/permissions.py,sha256=d7UxvmqFBKWNcFQeJ4MGGFUHlNh_BJGO03-DVW_YFI4,576
116
120
  invenio_vocabularies/contrib/names/resources.py,sha256=Z8XqLKfFKE69zdTTvcTDmpEZ6wqiqjIH5tp0LzXTSwQ,1588
117
121
  invenio_vocabularies/contrib/names/s3client.py,sha256=c7B9_NbnXCfE4pE_yMTsT6uQ2hgbcRU-KY6nbWFuFzU,1063
118
122
  invenio_vocabularies/contrib/names/schema.py,sha256=eKhpNwBaACMEY0JWNrSUhr-40lXhkiHDRmM42KsLrYg,3354
@@ -131,31 +135,34 @@ invenio_vocabularies/contrib/names/mappings/v7/names/name-v1.0.0.json,sha256=5Yb
131
135
  invenio_vocabularies/contrib/subjects/__init__.py,sha256=GtXZKA6VWG1oA1fUX2Wh92nd-1i7RnnQF6RprGhxkD4,591
132
136
  invenio_vocabularies/contrib/subjects/api.py,sha256=QH8mxoLsa8qjJT1i1Tj6rRnpbH23plo2IMOJ56rnvbU,347
133
137
  invenio_vocabularies/contrib/subjects/config.py,sha256=12Hoy46iGaBv7DlxcCjBuJaDtmpSvPPQKrWabtaUGe0,1712
134
- invenio_vocabularies/contrib/subjects/datastreams.py,sha256=SwhqoIjQn-6A0wm61HJ2TOFDDhCRG2EZwzeMJw_37ec,1606
138
+ invenio_vocabularies/contrib/subjects/datastreams.py,sha256=CiLSTm9PukzLKm34VDmmKOH4A_pYnjbrshxAht1Fox4,1787
135
139
  invenio_vocabularies/contrib/subjects/facets.py,sha256=qQ7_rppFBzsmrlZu4-MvOIdUcjeOmDA9gOHAcs0lWwI,695
136
140
  invenio_vocabularies/contrib/subjects/models.py,sha256=8XgbVRxDDvhWPjMWsoCriNlOKdmV_113a14yLRtlvM4,363
137
141
  invenio_vocabularies/contrib/subjects/resources.py,sha256=0KRfUMizwgIziZybk4HnIjiSsXbrCv_XmguNPwnxoo8,506
138
- invenio_vocabularies/contrib/subjects/schema.py,sha256=tN22MVZ-za0N4ZR-b77ItqNNYX2miHYl7inTnFW5R_w,1674
142
+ invenio_vocabularies/contrib/subjects/schema.py,sha256=5pM9FFVdeb1nUuTwr2SqkUJh-oHIjYN-EXXI8_SSjCQ,2446
139
143
  invenio_vocabularies/contrib/subjects/services.py,sha256=s1U6HMmpjuz7rrgR0DtT9C28TC6sZEeDTsa4Jh1TXQk,864
140
144
  invenio_vocabularies/contrib/subjects/subjects.py,sha256=NwZycExLyV8l7ikGStH4GOecVuDSxFT70KoNv6qC78I,1877
145
+ invenio_vocabularies/contrib/subjects/euroscivoc/__init__.py,sha256=e5L9E4l5JHqVzijAX8tn2DIa2n01vJ5wOAZdN62RnIo,247
146
+ invenio_vocabularies/contrib/subjects/euroscivoc/datastreams.py,sha256=ZEFDySRSEkb-2cjbYP_so2uCB1tP2_zcdMGpwPcRe90,6152
141
147
  invenio_vocabularies/contrib/subjects/jsonschemas/__init__.py,sha256=WowVUST1JoEDS3-xeHhCJvIgC9nzMkFs8XRks9zgzaM,292
142
- invenio_vocabularies/contrib/subjects/jsonschemas/subjects/subject-v1.0.0.json,sha256=cspw-pYIwiKpEO8zx7GFFqhWb7PZkAeQCRNLWoY8Uyk,1253
148
+ invenio_vocabularies/contrib/subjects/jsonschemas/subjects/subject-v1.0.0.json,sha256=SCFOfwtdAQJnUC4wccRJj--c2yUUmo5Z3tnOfo2XluU,1632
143
149
  invenio_vocabularies/contrib/subjects/mappings/__init__.py,sha256=Qk-yj1ENsTmijO8ImWuDYGzXi6QQ2VjP4DbjrpRfDk8,243
144
150
  invenio_vocabularies/contrib/subjects/mappings/os-v1/__init__.py,sha256=rv2-AasC_WJFp2t9Nrhzivmw9RovRI2_msin4oHTZuk,250
145
- invenio_vocabularies/contrib/subjects/mappings/os-v1/subjects/subject-v1.0.0.json,sha256=iZ8BByd4nOsTQ8Go5prQQ-puZOWzYIYHVjVYD39kNXo,1533
151
+ invenio_vocabularies/contrib/subjects/mappings/os-v1/subjects/subject-v1.0.0.json,sha256=WNNWVsaf-pNxqV6p_IR2uIcwIBh30WJeP4IDIxzqutI,1810
146
152
  invenio_vocabularies/contrib/subjects/mappings/os-v2/__init__.py,sha256=rQnrw1tMKR0yzlPiXBbCVHnxy_aAhwrKghrSuhhZYAc,250
147
- invenio_vocabularies/contrib/subjects/mappings/os-v2/subjects/subject-v1.0.0.json,sha256=iZ8BByd4nOsTQ8Go5prQQ-puZOWzYIYHVjVYD39kNXo,1533
153
+ invenio_vocabularies/contrib/subjects/mappings/os-v2/subjects/subject-v1.0.0.json,sha256=cJSjcJ_PqrifBZOUeDMW3qyT7VtENTvYq3Xvi-iylOc,1810
148
154
  invenio_vocabularies/contrib/subjects/mappings/v7/__init__.py,sha256=QK__a1749g2UN3fBqOr9jx8ccZHWAuvd6DSN4B1jJW4,258
149
- invenio_vocabularies/contrib/subjects/mappings/v7/subjects/subject-v1.0.0.json,sha256=iZ8BByd4nOsTQ8Go5prQQ-puZOWzYIYHVjVYD39kNXo,1533
155
+ invenio_vocabularies/contrib/subjects/mappings/v7/subjects/subject-v1.0.0.json,sha256=WNNWVsaf-pNxqV6p_IR2uIcwIBh30WJeP4IDIxzqutI,1810
156
+ invenio_vocabularies/contrib/subjects/mesh/__init__.py,sha256=P44hmgVNNTN5O_EmWgaeYJ91yqkGNoeKYo0wfif_wE4,241
150
157
  invenio_vocabularies/contrib/subjects/mesh/datastreams.py,sha256=qsi2fu-TzpI2aC9qIOkXGpNcLFkClJ5Dw5rC9ffEdjc,1318
151
158
  invenio_vocabularies/datastreams/__init__.py,sha256=VPefh6k4Q3eYxKIW8I5zXUGucntp7VHxaOR5Vhgkfmg,412
152
159
  invenio_vocabularies/datastreams/datastreams.py,sha256=SpI6ivmf2LIDS2JSkxoM2v5kRmrPoRDtAG5fuzZO4oQ,6078
153
160
  invenio_vocabularies/datastreams/errors.py,sha256=IDUZ3gNtYGrhcOgApHCms1gNNJTyJzoMPmG5JtIeYNU,678
154
161
  invenio_vocabularies/datastreams/factories.py,sha256=H8a2gAy7KNImtdCdtqpVKC5gIvE3ON6U1Wn1_zaMlQ4,2181
155
- invenio_vocabularies/datastreams/readers.py,sha256=JT76oKeD1N2u-0zWlyI7GZ5tR1aGc9IZe7pdTtNaSaM,11038
162
+ invenio_vocabularies/datastreams/readers.py,sha256=Gr_KbN-tZtoQ8R4TJG4dTBTE8028eLRlcxSv2-IqI9c,11386
156
163
  invenio_vocabularies/datastreams/tasks.py,sha256=0fuH_PRt9Ncv6WHM4pkYmfheRVGDKkERZiMPvgV4bZU,1129
157
- invenio_vocabularies/datastreams/transformers.py,sha256=wspny-kazYMRHjkkyFfRVNIYzJxbjAqokRCBQ_-gXcY,1357
158
- invenio_vocabularies/datastreams/writers.py,sha256=gFJ-NVbpIuR2aw4v5TyxR5roS-qVnETyqEVY1o8rYKk,6059
164
+ invenio_vocabularies/datastreams/transformers.py,sha256=0ymZiHtNtgfYxt2MIjthtSzikRH1jAqhIAZ1yScoAHs,1733
165
+ invenio_vocabularies/datastreams/writers.py,sha256=PO9UPQ8rT4pstfoCiB-zCfuvCNOHRgFbysq6-spXm34,7218
159
166
  invenio_vocabularies/datastreams/xml.py,sha256=HFa-lfxj7kFrr2IjeN1jxSLDfcvpBwO9nZLZF2-BryE,997
160
167
  invenio_vocabularies/records/__init__.py,sha256=Uj7O6fYdAtLOkLXUGSAYPADBB7aqP4yVs9b6OAjA158,243
161
168
  invenio_vocabularies/records/api.py,sha256=Lynt6Sz4BVN1orh0zgJ5ljhnUobEtcq8c22PmSeUo2U,1494
@@ -290,10 +297,10 @@ invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.mo,sha256=g1I5aNO8r
290
297
  invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.po,sha256=vg8qC8ofpAdJ3mQz7mWM1ylKDpiNWXFs7rlMdSPkgKk,4629
291
298
  invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.mo,sha256=cqSm8NtMAwrP9O6qbmtkDtRT1e9D93qpsJN5X9_PPVw,600
292
299
  invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.po,sha256=9ACePz_EpB-LfcIJajZ2kp8Q04tcdrQLOtug162ZUss,4115
293
- invenio_vocabularies-5.1.0.dist-info/AUTHORS.rst,sha256=8d0p_WWE1r9DavvzMDi2D4YIGBHiMYcN3LYxqQOj8sY,291
294
- invenio_vocabularies-5.1.0.dist-info/LICENSE,sha256=UvI8pR8jGWqe0sTkb_hRG6eIrozzWwWzyCGEpuXX4KE,1062
295
- invenio_vocabularies-5.1.0.dist-info/METADATA,sha256=q58QaH3-DlcUWMppE5PDWV1vf8FsIE4rWiT_mCvoaNo,9111
296
- invenio_vocabularies-5.1.0.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
297
- invenio_vocabularies-5.1.0.dist-info/entry_points.txt,sha256=qHHFkyU3r0COsKm5gCYuhP8tfsioBggxKAiEXNAbbjM,2803
298
- invenio_vocabularies-5.1.0.dist-info/top_level.txt,sha256=x1gRNbaODF_bCD0SBLM3nVOFPGi06cmGX5X94WKrFKk,21
299
- invenio_vocabularies-5.1.0.dist-info/RECORD,,
300
+ invenio_vocabularies-6.1.0.dist-info/AUTHORS.rst,sha256=8d0p_WWE1r9DavvzMDi2D4YIGBHiMYcN3LYxqQOj8sY,291
301
+ invenio_vocabularies-6.1.0.dist-info/LICENSE,sha256=UvI8pR8jGWqe0sTkb_hRG6eIrozzWwWzyCGEpuXX4KE,1062
302
+ invenio_vocabularies-6.1.0.dist-info/METADATA,sha256=QwLqpBcTeK4HsEnUp0i6yVeK-_6Btwf-wER2m_FmdBM,9659
303
+ invenio_vocabularies-6.1.0.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
304
+ invenio_vocabularies-6.1.0.dist-info/entry_points.txt,sha256=qm4ydo2p2KWN3937X8argeeSHw-BX_IJ7gS11pkADEU,2903
305
+ invenio_vocabularies-6.1.0.dist-info/top_level.txt,sha256=x1gRNbaODF_bCD0SBLM3nVOFPGi06cmGX5X94WKrFKk,21
306
+ invenio_vocabularies-6.1.0.dist-info/RECORD,,
@@ -49,6 +49,9 @@ vocabulary_model = invenio_vocabularies.records.models
49
49
  [invenio_i18n.translations]
50
50
  invenio_vocabularies = invenio_vocabularies
51
51
 
52
+ [invenio_jobs.jobs]
53
+ process_ror_affiliations = invenio_vocabularies.jobs:ProcessRORAffiliationsJob
54
+
52
55
  [invenio_jsonschemas.schemas]
53
56
  affiliations = invenio_vocabularies.contrib.affiliations.jsonschemas
54
57
  awards = invenio_vocabularies.contrib.awards.jsonschemas