invenio-app-rdm 13.0.0b2.dev2__py2.py3-none-any.whl → 13.0.0b2.dev4__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.
Files changed (50) hide show
  1. invenio_app_rdm/__init__.py +1 -1
  2. invenio_app_rdm/config.py +4 -2
  3. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/meta.html +3 -1
  4. invenio_app_rdm/records_ui/views/decorators.py +91 -8
  5. invenio_app_rdm/records_ui/views/records.py +7 -4
  6. invenio_app_rdm/tasks.py +6 -2
  7. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/CompareRevisionsDropdown.js +6 -0
  8. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js +5 -0
  9. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/CompareRevisions.js +10 -9
  10. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides +1 -1
  11. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.en.html +1 -1
  12. invenio_app_rdm/urls.py +11 -1
  13. {invenio_app_rdm-13.0.0b2.dev2.dist-info → invenio_app_rdm-13.0.0b2.dev4.dist-info}/METADATA +20 -1
  14. {invenio_app_rdm-13.0.0b2.dev2.dist-info → invenio_app_rdm-13.0.0b2.dev4.dist-info}/RECORD +50 -18
  15. {invenio_app_rdm-13.0.0b2.dev2.dist-info → invenio_app_rdm-13.0.0b2.dev4.dist-info}/WHEEL +1 -1
  16. {invenio_app_rdm-13.0.0b2.dev2.dist-info → invenio_app_rdm-13.0.0b2.dev4.dist-info}/top_level.txt +1 -0
  17. tests/__init__.py +8 -0
  18. tests/api/__init__.py +8 -0
  19. tests/api/conftest.py +24 -0
  20. tests/api/test_protect_files_rest.py +73 -0
  21. tests/api/test_record_api.py +175 -0
  22. tests/api/test_stats_api.py +26 -0
  23. tests/conftest.py +313 -0
  24. tests/fixtures/__init__.py +8 -0
  25. tests/fixtures/app_data/oai_sets.yaml +3 -0
  26. tests/fixtures/app_data/pages/about.html +1 -0
  27. tests/fixtures/app_data/pages.yaml +4 -0
  28. tests/fixtures/conftest.py +27 -0
  29. tests/fixtures/test_cli.py +25 -0
  30. tests/fixtures/test_fixtures.py +46 -0
  31. tests/mock_module/__init__.py +7 -0
  32. tests/mock_module/templates/mock_mail.html +28 -0
  33. tests/mock_module/views.py +32 -0
  34. tests/redirector/__init__.py +8 -0
  35. tests/redirector/conftest.py +54 -0
  36. tests/redirector/test_redirector.py +28 -0
  37. tests/test_tasks.py +104 -0
  38. tests/test_utils.py +67 -0
  39. tests/test_version.py +16 -0
  40. tests/test_views.py +43 -0
  41. tests/ui/__init__.py +8 -0
  42. tests/ui/conftest.py +105 -0
  43. tests/ui/test_deposits.py +115 -0
  44. tests/ui/test_export_formats.py +37 -0
  45. tests/ui/test_filters.py +10 -0
  46. tests/ui/test_signposting_ui.py +95 -0
  47. tests/ui/test_static.py +25 -0
  48. tests/ui/test_stats_ui.py +92 -0
  49. {invenio_app_rdm-13.0.0b2.dev2.dist-info → invenio_app_rdm-13.0.0b2.dev4.dist-info}/LICENSE +0 -0
  50. {invenio_app_rdm-13.0.0b2.dev2.dist-info → invenio_app_rdm-13.0.0b2.dev4.dist-info}/entry_points.txt +0 -0
@@ -17,6 +17,6 @@
17
17
  #
18
18
  # See PEP 0440 for details - https://www.python.org/dev/peps/pep-0440
19
19
 
20
- __version__ = "13.0.0b2.dev2"
20
+ __version__ = "13.0.0b2.dev4"
21
21
 
22
22
  __all__ = ("__version__",)
invenio_app_rdm/config.py CHANGED
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # Copyright (C) 2019-2025 CERN.
4
4
  # Copyright (C) 2019-2020 Northwestern University.
5
- # Copyright (C) 2021-2024 Graz University of Technology.
5
+ # Copyright (C) 2021-2025 Graz University of Technology.
6
6
  # Copyright (C) 2022-2024 KTH Royal Institute of Technology.
7
7
  # Copyright (C) 2023 TU Wien
8
8
  #
@@ -184,7 +184,7 @@ def _(x):
184
184
  # =====
185
185
  # See https://flask.palletsprojects.com/en/1.1.x/config/
186
186
 
187
- APP_ALLOWED_HOSTS = ["0.0.0.0", "localhost", "127.0.0.1"]
187
+ TRUSTED_HOSTS = ["0.0.0.0", "localhost", "127.0.0.1"]
188
188
  """Allowed hosts.
189
189
 
190
190
  Since HAProxy and Nginx route all requests no matter the host header
@@ -964,6 +964,8 @@ APP_RDM_DEPOSIT_FORM_PUBLISH_MODAL_EXTRA = ""
964
964
 
965
965
  APP_RDM_RECORD_LANDING_PAGE_TEMPLATE = "invenio_app_rdm/records/detail.html"
966
966
 
967
+ APP_RDM_RECORD_LANDING_PAGE_FAIR_SIGNPOSTING_LEVEL_1_ENABLED = False
968
+
967
969
  APP_RDM_RECORD_THUMBNAIL_SIZES = [10, 50, 100, 250, 750, 1200]
968
970
  """Allowed record thumbnail sizes."""
969
971
 
@@ -1,5 +1,5 @@
1
1
  {#
2
- Copyright (C) 2020-2024 CERN.
2
+ Copyright (C) 2020-2025 CERN.
3
3
  Copyright (C) 2020 Northwestern University.
4
4
  Copyright (C) 2021 New York University.
5
5
  Copyright (C) 2023 Front Matter.
@@ -28,6 +28,8 @@ _external=True) %}
28
28
  <meta name="citation_pdf_url" content="{{ file_url }}"/>
29
29
  {%- endif %}
30
30
  <link rel="alternate" type="{{ file.mimetype }}" href="{{ file_url }}">
31
+ {#- See https://signposting.org/FAIR/ #}
32
+ <link rel="item" type="{{ file.mimetype }}" href="{{ file_url }}">
31
33
  {%- endfor %}
32
34
  {% endif %}
33
35
 
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2019-2024 CERN.
3
+ # Copyright (C) 2019-2025 CERN.
4
4
  # Copyright (C) 2019-2021 Northwestern University.
5
5
  # Copyright (C) 2021 TU Wien.
6
6
  #
@@ -11,7 +11,7 @@
11
11
 
12
12
  from functools import wraps
13
13
 
14
- from flask import g, make_response, redirect, request, session, url_for
14
+ from flask import current_app, g, make_response, redirect, request, session, url_for
15
15
  from flask_login import login_required
16
16
  from invenio_communities.communities.resources.serializer import (
17
17
  UICommunityJSONSerializer,
@@ -19,6 +19,9 @@ from invenio_communities.communities.resources.serializer import (
19
19
  from invenio_communities.proxies import current_communities
20
20
  from invenio_pidstore.errors import PIDDoesNotExistError
21
21
  from invenio_rdm_records.proxies import current_rdm_records
22
+ from invenio_rdm_records.resources.serializers.signposting import (
23
+ FAIRSignpostingProfileLvl1Serializer,
24
+ )
22
25
  from invenio_records_resources.services.errors import PermissionDeniedError
23
26
  from sqlalchemy.orm.exc import NoResultFound
24
27
 
@@ -365,8 +368,63 @@ def pass_draft_community(f):
365
368
  return view
366
369
 
367
370
 
368
- def add_signposting(f):
369
- """Add signposting link to view's response headers."""
371
+ def _get_header(rel, value, link_type=None):
372
+ header = f'<{value}> ; rel="{rel}"'
373
+ if link_type:
374
+ header += f' ; type="{link_type}"'
375
+ return header
376
+
377
+
378
+ def _get_signposting_collection(pid_value):
379
+ ui_url = record_url_for(pid_value=pid_value)
380
+ return _get_header("collection", ui_url, "text/html")
381
+
382
+
383
+ def _get_signposting_describes(pid_value):
384
+ ui_url = record_url_for(pid_value=pid_value)
385
+ return _get_header("describes", ui_url, "text/html")
386
+
387
+
388
+ def _get_signposting_linkset(pid_value):
389
+ api_url = record_url_for(_app="api", pid_value=pid_value)
390
+ return _get_header("linkset", api_url, "application/linkset+json")
391
+
392
+
393
+ def add_signposting_landing_page(f):
394
+ """Add signposting links to the landing page view's response headers."""
395
+
396
+ @wraps(f)
397
+ def view(*args, **kwargs):
398
+ response = make_response(f(*args, **kwargs))
399
+
400
+ # Relies on other decorators having operated before it
401
+ if current_app.config[
402
+ "APP_RDM_RECORD_LANDING_PAGE_FAIR_SIGNPOSTING_LEVEL_1_ENABLED"
403
+ ]:
404
+ record = kwargs["record"]
405
+
406
+ signposting_headers = (
407
+ FAIRSignpostingProfileLvl1Serializer().serialize_object(
408
+ record.to_dict()
409
+ )
410
+ )
411
+
412
+ response.headers["Link"] = signposting_headers
413
+ else:
414
+ pid_value = kwargs["pid_value"]
415
+ signposting_link = record_url_for(_app="api", pid_value=pid_value)
416
+
417
+ response.headers["Link"] = (
418
+ f'<{signposting_link}> ; rel="linkset" ; type="application/linkset+json"' # fmt: skip
419
+ )
420
+
421
+ return response
422
+
423
+ return view
424
+
425
+
426
+ def add_signposting_content_resources(f):
427
+ """Add signposting links to the content resources view's response headers."""
370
428
 
371
429
  @wraps(f)
372
430
  def view(*args, **kwargs):
@@ -374,11 +432,36 @@ def add_signposting(f):
374
432
 
375
433
  # Relies on other decorators having operated before it
376
434
  pid_value = kwargs["pid_value"]
377
- signposting_link = record_url_for(_app="api", pid_value=pid_value)
378
435
 
379
- response.headers["Link"] = (
380
- f'<{signposting_link}> ; rel="linkset" ; type="application/linkset+json"' # fmt: skip
381
- )
436
+ signposting_headers = [
437
+ _get_signposting_collection(pid_value),
438
+ _get_signposting_linkset(pid_value),
439
+ ]
440
+
441
+ response.headers["Link"] = " , ".join(signposting_headers)
442
+
443
+ return response
444
+
445
+ return view
446
+
447
+
448
+ def add_signposting_metadata_resources(f):
449
+ """Add signposting links to the metadata resources view's response headers."""
450
+
451
+ @wraps(f)
452
+ def view(*args, **kwargs):
453
+ response = make_response(f(*args, **kwargs))
454
+
455
+ # Relies on other decorators having operated before it
456
+ pid_value = kwargs["pid_value"]
457
+
458
+ signposting_headers = [
459
+ _get_signposting_describes(pid_value),
460
+ _get_signposting_linkset(pid_value),
461
+ ]
462
+
463
+ response.headers["Link"] = " , ".join(signposting_headers)
464
+
382
465
  return response
383
466
 
384
467
  return view
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2019-2024 CERN.
3
+ # Copyright (C) 2019-2025 CERN.
4
4
  # Copyright (C) 2019-2021 Northwestern University.
5
5
  # Copyright (C) 2021-2023 TU Wien.
6
6
  #
@@ -39,7 +39,9 @@ from invenio_app_rdm.records_ui.previewer.iiif_simple import (
39
39
 
40
40
  from ..utils import get_external_resources
41
41
  from .decorators import (
42
- add_signposting,
42
+ add_signposting_content_resources,
43
+ add_signposting_landing_page,
44
+ add_signposting_metadata_resources,
43
45
  pass_file_item,
44
46
  pass_file_metadata,
45
47
  pass_include_deleted,
@@ -141,7 +143,7 @@ class PreviewFile:
141
143
  @pass_record_or_draft(expand=True)
142
144
  @pass_record_files
143
145
  @pass_record_media_files
144
- @add_signposting
146
+ @add_signposting_landing_page
145
147
  def record_detail(
146
148
  pid_value, record, files, media_files, is_preview=False, include_deleted=False
147
149
  ):
@@ -263,6 +265,7 @@ def record_detail(
263
265
 
264
266
  @pass_is_preview
265
267
  @pass_record_or_draft(expand=False)
268
+ @add_signposting_metadata_resources
266
269
  def record_export(
267
270
  pid_value, record, export_format=None, permissions=None, is_preview=False
268
271
  ):
@@ -325,7 +328,7 @@ def record_file_preview(
325
328
 
326
329
  @pass_is_preview
327
330
  @pass_file_item(is_media=False)
328
- @add_signposting
331
+ @add_signposting_content_resources
329
332
  def record_file_download(pid_value, file_item=None, is_preview=False, **kwargs):
330
333
  """Download a file from a record."""
331
334
  download = bool(request.args.get("download"))
invenio_app_rdm/tasks.py CHANGED
@@ -18,7 +18,10 @@ from .utils.files import send_integrity_report_email
18
18
  def file_integrity_report():
19
19
  """Send a report of uhealthy/missing files to system admins."""
20
20
  # First retry verifying files that errored during their last check
21
- files = FileInstance.query.filter(FileInstance.last_check.is_(None))
21
+ files = FileInstance.query.filter(
22
+ FileInstance.last_check.is_(None),
23
+ FileInstance.uri.is_not(None),
24
+ )
22
25
  for f in files:
23
26
  try:
24
27
  f.clear_last_check()
@@ -32,7 +35,8 @@ def file_integrity_report():
32
35
  FileInstance.query.filter(
33
36
  sa.or_(
34
37
  FileInstance.last_check.is_(None), FileInstance.last_check.is_(False)
35
- )
38
+ ),
39
+ FileInstance.uri.is_not(None),
36
40
  )
37
41
  .order_by(FileInstance.created.desc())
38
42
  .all()
@@ -1,6 +1,7 @@
1
1
  /*
2
2
  * // This file is part of Invenio-App-Rdm
3
3
  * // Copyright (C) 2025 CERN.
4
+ * // Copyright (C) 2025 Graz University of Technology.
4
5
  * //
5
6
  * // Invenio-App-Rdm is free software; you can redistribute it and/or modify it
6
7
  * // under the terms of the MIT License; see LICENSE file for more details.
@@ -81,3 +82,8 @@ CompareRevisionsDropdown.propTypes = {
81
82
  srcRevision: PropTypes.object,
82
83
  targetRevision: PropTypes.object,
83
84
  };
85
+
86
+ CompareRevisionsDropdown.defaultProps = {
87
+ srcRevision: 0,
88
+ targetRevision: 0,
89
+ };
@@ -1,6 +1,7 @@
1
1
  /*
2
2
  * // This file is part of Invenio-App-Rdm
3
3
  * // Copyright (C) 2025 CERN.
4
+ * // Copyright (C) 2025 Graz University of Technology.
4
5
  * //
5
6
  * // Invenio-App-Rdm is free software; you can redistribute it and/or modify it
6
7
  * // under the terms of the MIT License; see LICENSE file for more details.
@@ -75,3 +76,7 @@ RevisionsDiffViewer.propTypes = {
75
76
  diff: PropTypes.object,
76
77
  viewerProps: PropTypes.object.isRequired,
77
78
  };
79
+
80
+ RevisionsDiffViewer.defaultProps = {
81
+ diff: {},
82
+ };
@@ -1,6 +1,7 @@
1
1
  /*
2
2
  * // This file is part of Invenio-App-Rdm
3
3
  * // Copyright (C) 2025 CERN.
4
+ * // Copyright (C) 2025 Graz University of Technology.
4
5
  * //
5
6
  * // Invenio-App-Rdm is free software; you can redistribute it and/or modify it
6
7
  * // under the terms of the MIT License; see LICENSE file for more details.
@@ -28,6 +29,14 @@ export class CompareRevisions extends Component {
28
29
  };
29
30
  }
30
31
 
32
+ componentDidMount() {
33
+ this.fetchRevisions();
34
+ }
35
+
36
+ componentWillUnmount() {
37
+ this.cancellableAction && this.cancellableAction.cancel();
38
+ }
39
+
31
40
  async fetchRevisions() {
32
41
  const { resource } = this.props;
33
42
  this.setState({ loading: true });
@@ -50,14 +59,6 @@ export class CompareRevisions extends Component {
50
59
  }
51
60
  }
52
61
 
53
- componentDidMount() {
54
- this.fetchRevisions();
55
- }
56
-
57
- componentWillUnmount() {
58
- this.cancellableAction && this.cancellableAction.cancel();
59
- }
60
-
61
62
  handleModalClose = () => {
62
63
  const { actionCancelCallback } = this.props;
63
64
  actionCancelCallback();
@@ -100,7 +101,7 @@ export class CompareRevisions extends Component {
100
101
  </Modal.Content>
101
102
  )}
102
103
  <Modal.Content scrolling>
103
- <RevisionsDiffViewer diff={this.state.diff} />
104
+ <RevisionsDiffViewer diff={diff} />
104
105
  </Modal.Content>
105
106
  </Modal.Content>
106
107
  <Modal.Actions>
@@ -311,7 +311,7 @@ a.remove-default-style:hover {
311
311
  display: block;
312
312
  border-style: none;
313
313
  width:100%;
314
- height:400px;
314
+ height:60vh;
315
315
  }
316
316
 
317
317
 
@@ -235,7 +235,7 @@
235
235
  in exactly the same order, and thus for instance would not match a record
236
236
  containing the phrase <em>"open access and science"</em>. A proximity search
237
237
  allows that the terms are not in the exact order and may include other terms
238
- inbetween. The degree of flexiblity is specified by an integer afterwards:
238
+ in between. The degree of flexibility is specified by an integer afterwards:
239
239
  </p>
240
240
  <p>
241
241
  <strong>Example:</strong>
invenio_app_rdm/urls.py CHANGED
@@ -28,6 +28,9 @@ Design decisions:
28
28
  - Generated urls are absolute for now
29
29
  """
30
30
 
31
+ import unicodedata
32
+ from urllib.parse import quote
33
+
31
34
  from flask import current_app
32
35
 
33
36
 
@@ -49,7 +52,14 @@ def record_url_for(_app="ui", pid_value=""):
49
52
 
50
53
  def download_url_for(pid_value="", filename=""):
51
54
  """Return url for download route."""
52
- url_prefix = current_app.config.get(f"SITE_UI_URL", "")
55
+ url_prefix = current_app.config.get("SITE_UI_URL", "")
56
+
57
+ # see https://github.com/pallets/werkzeug/blob/main/src/werkzeug/utils.py#L456-L465
58
+ try:
59
+ filename.encode("ascii")
60
+ except UnicodeEncodeError:
61
+ # safe = RFC 5987 attr-char
62
+ filename = quote(filename, safe="!#$&+-.^_`|~")
53
63
 
54
64
  # We use [] so that this fails and brings to attention the configuration
55
65
  # problem if APP_RDM_ROUTES.record_file_download is missing
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: invenio-app-rdm
3
- Version: 13.0.0b2.dev2
3
+ Version: 13.0.0b2.dev4
4
4
  Summary: Invenio Research Data Management.
5
5
  Home-page: https://github.com/inveniosoftware/invenio-app-rdm
6
6
  Author: CERN
@@ -96,6 +96,25 @@ https://inveniordm.docs.cern.ch
96
96
  Changes
97
97
  =======
98
98
 
99
+ Version v13.0.0b2.dev4 (released 2025-03-10)
100
+
101
+ - views: FAIR signposting level 1 support (config flag)
102
+ - tasks: skip health checks for files that don't have a uri
103
+ - views: signposting: files: fix filename encoding issues for downloads
104
+
105
+ Version v13.0.0b2.dev3 (released 2025-02-21)
106
+
107
+ - views: FAIR signposting level 1 support
108
+ - meta: FAIR signposting level 1 support (link rel item)
109
+ - globals: site.overrides: Increase pdf preview iframe height
110
+ - tests: fix mock module paths
111
+ - tests: add __init__.py in all directories
112
+ * This is necessary for pytest v8.x to be able to detect all unique
113
+ tests.
114
+
115
+ - tests: filter out excessive warnings
116
+ - fix: flask changed to TRUSTED_HOSTS
117
+
99
118
  Version v13.0.0b2.dev2 (released 2025-02-13)
100
119
 
101
120
  - Bump prerelease dependencies to stable.
@@ -1,9 +1,9 @@
1
- invenio_app_rdm/__init__.py,sha256=2ND67Fk3n5FHuJuhC32pWVdE4KOYewSKuSU2eI6C2tk,699
1
+ invenio_app_rdm/__init__.py,sha256=hJh2ID9D2F8shJQctjpBsnXXNr6rUgqvkW32PXDpBj8,699
2
2
  invenio_app_rdm/cli.py,sha256=G6QqNU2W6n6ICtTMnpeKFXIsdorncDmVXwwwsGH5F2k,2746
3
- invenio_app_rdm/config.py,sha256=eg8JHluXVF6qkcom-YsaFdQj7CniqN2kc3S7JxbRU0E,50382
3
+ invenio_app_rdm/config.py,sha256=aQHeG7QxiKx01eDi1Xo7hsOfyAfe_yb8SNrq-CDOYag,50448
4
4
  invenio_app_rdm/ext.py,sha256=PkZhATGJDgYqBJQh41NdvBZWR83mgI3Eej6rj10UVJE,5278
5
- invenio_app_rdm/tasks.py,sha256=XAbl8KeAWaJ5lC_4OUWUPstvCT7lYs5tRR1zSVBDfRk,1275
6
- invenio_app_rdm/urls.py,sha256=VRbpuN3kQ2fcmKvEIGQ5O1EnaSsEE2kyhLwUmONwZO8,2192
5
+ invenio_app_rdm/tasks.py,sha256=FyrIQXVuPjms-dNEnLrVmmdwrX_IykJ87gcSNgOR6O0,1373
6
+ invenio_app_rdm/urls.py,sha256=8S95QSs4yS0rtORsd4veo--rF3LSLwZenoowJ5ubbmM,2496
7
7
  invenio_app_rdm/administration/__init__.py,sha256=8r9LeoE9fNHZSVS5QsCfVhRU7MAiEOWJk9MA3Y--4F8,251
8
8
  invenio_app_rdm/administration/domains/__init__.py,sha256=Qob5kqjRPxpuSE5yDV2tesN6tmaKp5JcxCxGA8Mrcak,487
9
9
  invenio_app_rdm/administration/domains/domains.py,sha256=vafLa-mqkg_tQLjx328E64P_4mksB5kjBlsfunvdatg,5599
@@ -56,7 +56,7 @@ invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details
56
56
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/description.html,sha256=wqLb_Z6cJ026KEDedJMSsQhQnKWpe7TnMuMVwFAMDX0,912
57
57
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/details.html,sha256=jdXr5U6YS8UllEuJjjSzusJJ1XkdE75V2q97h43D0NA,12095
58
58
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/doi.html,sha256=bveXC9JvZVjPKQrtZ8FFUV-fIHEN4nB1VSyomR_obxA,473
59
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/meta.html,sha256=V_-DVNjwPDPTnHSprcdbO8MZWiwWyDWjzQofU26b4bk,1616
59
+ invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/meta.html,sha256=guLBzq2zQM9VqGVnRKZ2XHZcAk0YEK1VAf3wEM-mk2M,1732
60
60
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar.html,sha256=PjmX-aH2YVZl67Q9ydFDOTLlrEwV2hgz64dRfftFF0A,426
61
61
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/stats.html,sha256=74xWPQNHoFbhN1an-p9SEAFUbW-TwCsBEUAaOEyNgWQ,4370
62
62
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/subjects.html,sha256=Wu7MCXzGj41K38-VXi-kStvc8fm3Ck68uJ1egfFK0dw,1509
@@ -80,10 +80,10 @@ invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/
80
80
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/stats_popup.html,sha256=5SVzfIS15Aro2Itd2BiaLbMXm0cvvwk6ZCdYjuSwhBw,625
81
81
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/version.html,sha256=JpE4e6RpbSR2pQD1rOsfvzD2ur584aRfBWUUap2IMBA,688
82
82
  invenio_app_rdm/records_ui/views/__init__.py,sha256=4NxQNADuvMsblEsGd3zkKXSNR5_4eLMcFEFYvc6NxVc,5718
83
- invenio_app_rdm/records_ui/views/decorators.py,sha256=_TYUGedQAHvEugusIG8xk8xPWHxfw9v4HZR_0dL-tH0,13371
83
+ invenio_app_rdm/records_ui/views/decorators.py,sha256=XUSPpstYyh72IdNaIO4wz3sw1fjI_2DNGsKdUu3ueL4,15769
84
84
  invenio_app_rdm/records_ui/views/deposits.py,sha256=ZQSlYugqZX1jnS0GFNtJQVq2_KyDS_ECzp1S26qDGAs,21337
85
85
  invenio_app_rdm/records_ui/views/filters.py,sha256=Rm55fXJv97cqq8B_6KCe-3PxxHUH4VRu-jd9fTea6r4,6994
86
- invenio_app_rdm/records_ui/views/records.py,sha256=2TDbBW2GdX7HuO0KQu116GqGhXIXLqcGqvrFP-Pyn0w,16269
86
+ invenio_app_rdm/records_ui/views/records.py,sha256=GdxG3JnXrV1QT0KxOqeYWoDGIiZRZ9w5poihPPd-wTo,16428
87
87
  invenio_app_rdm/redirector/__init__.py,sha256=AYCTGmfbmkHW3YJXMqXlWBXcBrUsta-QmL9ULX2bjwA,243
88
88
  invenio_app_rdm/redirector/resource.py,sha256=XuH6ZK0HVE5LdXoorlm8aI3deizvnZ5gFa9d1ihYosk,3312
89
89
  invenio_app_rdm/redirector/views.py,sha256=CTJ3EGEFKfc0lFwNb9pwH7MbMLiqaWnF8LA3xGIwahc,563
@@ -105,10 +105,10 @@ invenio_app_rdm/theme/views.py,sha256=UJs2_C28BWsXY1JqbRK4_ML1JRtGo1yM2S0_W37JJo
105
105
  invenio_app_rdm/theme/webpack.py,sha256=5ucwIJQgM1y9EFdRcsxv_ThPs7hXRzdmipVBxoU1McI,5090
106
106
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/theme.js,sha256=2-BWDEH3YQPwPt1ey3jUHnMrKTyb0JBPRlydk5_reH8,4151
107
107
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/utils.js,sha256=zKROcc3qE64-UhM8ha42K-EDDxAXMupxoocZZ9bjEHo,3452
108
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/CompareRevisionsDropdown.js,sha256=h7ilYSO4XYwdIqO75R1aREzCdp-EFeHbMbYvQ-Iq41A,2342
108
+ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/CompareRevisionsDropdown.js,sha256=BNdMxfFYPhlrGKPg47oc4X8ILllfCngN61L1b7Yt_8Q,2483
109
109
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUser.js,sha256=GmZGEPOylGXr6fyNJxS_0hPwCGdO98F2u6Pn8Qrt9ew,2291
110
110
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUserForm.js,sha256=qsjNiOsHWx9rrP3uA4nxthUEoY9b82n0IO8PfdObxHQ,6815
111
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js,sha256=N8dEcGupDr1_TG858E6uU64TDtGVR4zJ_mgKiASG90s,1823
111
+ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js,sha256=-2khcBmWr3zztAjy3mRz4d9gu8b8IAZtWbcnwnD5eAk,1932
112
112
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/SetQuotaAction.js,sha256=wwvYfTJ7pBEdoeqcEqmxFLaEwpJnnFW0oRQTyAdDSBw,3038
113
113
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/SetQuotaForm.js,sha256=Ltr03KlCogkg2NjqWc1GkxJlYPWB2LDLHL04w6eJiRU,5749
114
114
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/index.js,sha256=soELMxc1jf_rL62CJ9wtWGVG13yk1PRY7JqseqnKkqU,297
@@ -116,7 +116,7 @@ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/domai
116
116
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/domains/search/SearchResultItemLayout.js,sha256=sWIHw6tSCmRa0dYCHTa-fbxnHr9MhyDhMUiGlGV-HWE,6097
117
117
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/domains/search/index.js,sha256=uajCJbGiHGjRH_YapCGGXATKtAUlXTr0jirx1UfqjCQ,283
118
118
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/drafts/index.js,sha256=DuPY4wnnwyWF61Oyef1S4SvQrg-DrkZZjjQKlA0DeJo,1159
119
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/CompareRevisions.js,sha256=wqJrxHi5kW83PJhJMinpuX-He1NPBVjRVHyyhBoHoQ4,3723
119
+ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/CompareRevisions.js,sha256=J-bx3k8PPSAFg669w_rhZVuSFDS2RjcKyyqxZ029FFU,3768
120
120
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RecordActions.js,sha256=FAjkK7TZ4ebjsQh1ZcFFHkVePP2T8msa1OAIjxktKJo,1935
121
121
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RecordResourceActions.js,sha256=rrQhCfw1Q8n5SJ9aT-XfZfadEZRK9b1N6hzGkbMAnrU,5528
122
122
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RemovalReasonsSelect.js,sha256=8y1YRo1ZyqDfeQL4aNbO9ig3689YpzEBse8kLf_qI8o,2192
@@ -251,7 +251,7 @@ invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/seg
251
251
  invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/segment.variables,sha256=HwtfX97PrCMjVYBHj323pUmrjBuUl41yVthXQL_8YHs,141
252
252
  invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/reset.overrides,sha256=ms-coZLC-kFoWoZ4UNyJq0FRQ0bSLRziXzbyP7tnmNA,139
253
253
  invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/reset.variables,sha256=Luyh-V1w5wDFv2j77bYmTxfn22Cp7h1vLjRsqhf207Y,139
254
- invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides,sha256=8LBnXXf0lYLQEhw-1BBhKj9tGYCS1Gpw0qVxKG_Vomo,9011
254
+ invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides,sha256=Okd5gBx3clt63UUmvSOb1PlHwDEB7-Th9DUJ4LNAXmw,9010
255
255
  invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.variables,sha256=j59x9AQ5p4omynVitye2tIM3h0GCXSqcajNYJElKxjI,3043
256
256
  invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/accordion.overrides,sha256=7SK2kGZU-KMda2SVbuLfP-6hk0vTe_4gFk6O_RvU_hs,3306
257
257
  invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/accordion.variables,sha256=JFUnfiL_Xve48EwxRjYq0T-QJA8jboC606L08IjrBXg,322
@@ -396,7 +396,7 @@ invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/searchbar.html,sha25
396
396
  invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/site_footer.html,sha256=O4914C0hNrKtHreAanMbhRUiCfb8aubr6pV2chXB_BQ,821
397
397
  invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/files_integrity_report/email/files_integrity_report.html,sha256=27L0XZKP5bkOu4tx0QmMMDwIPdtFU_dyVfTfRk9E5QQ,1063
398
398
  invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.de.html,sha256=gefXaGv-ylkBUbvXXJe5EcTS66qoY0-v0XesXICX5_E,9310
399
- invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.en.html,sha256=HwZW7ZcBWV39NaYXhoIbGlep7aYoDO-in36jYSjVJMY,8790
399
+ invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.en.html,sha256=-EZdjhc4JslSq37_QN3KRL01LBwLJENkRtwBJ-PLSzc,8792
400
400
  invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/statistics.en.html,sha256=gQSJsmsXaLLA8KqEjkyxn7j299Kc0hnjA0sXq0oXeuI,7780
401
401
  invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/versioning.en.html,sha256=Rfd4-1vpU92VxppMTLGlS7uzqXWZUtGBARJTalUFuxg,6066
402
402
  invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/macros/records_list.html,sha256=GhHhRCn2lD9zyZ7J7_GiLqTQSHGxpWbiuYdZp8ft0bU,1081
@@ -523,9 +523,41 @@ invenio_app_rdm/users_ui/views/__init__.py,sha256=SMdY2NJj9GICfr3Xuok7qdNYVtA2bJ
523
523
  invenio_app_rdm/users_ui/views/dashboard.py,sha256=iUn2PrODAwb8ugmMosJKAjPhUzjCiWiAWoXQr9RUFuc,1793
524
524
  invenio_app_rdm/users_ui/views/ui.py,sha256=W_eXM8dLVIrNHQB2UEh37C9BYoHauft6RyvcDNFHovA,1742
525
525
  invenio_app_rdm/utils/files.py,sha256=CruDyO2gDVadSlWEJD-WHpWHeOQ0juh-Ei9jz3D9yjc,3923
526
- invenio_app_rdm-13.0.0b2.dev2.dist-info/LICENSE,sha256=AZXFHRrZa5s4m9DV7zZr4bPGTMUvcEPCodeV_AmFI8k,1204
527
- invenio_app_rdm-13.0.0b2.dev2.dist-info/METADATA,sha256=KHTC5PKuQE01qpCxhfoCuHcRTcRf2DWarD2lh1_u4P4,9901
528
- invenio_app_rdm-13.0.0b2.dev2.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
529
- invenio_app_rdm-13.0.0b2.dev2.dist-info/entry_points.txt,sha256=r1vTqYNABeWqRMWitzyR9FnBsAy-KYZKZCp95IziyLY,2070
530
- invenio_app_rdm-13.0.0b2.dev2.dist-info/top_level.txt,sha256=quZejDUw2vLfKQboNIuVLJ9fxZifdnCT_s2PNf1dfmk,16
531
- invenio_app_rdm-13.0.0b2.dev2.dist-info/RECORD,,
526
+ tests/__init__.py,sha256=yKVf0yYRuxmXvyAtLjmfpHGVCsEkZOhs_FojAAM_w-8,244
527
+ tests/conftest.py,sha256=6iR-l-DIpQDxN2LLMu6kbHnLsmAW1m8Lq-j8rNNucf8,8956
528
+ tests/test_tasks.py,sha256=6l25lcMjL3ZuQr4hsxbAEjSTu_J1aKkOB3ZXqOZZIy0,3712
529
+ tests/test_utils.py,sha256=nvj59DibjRZgLzwnch83tyCw9R1DEuDSQhU7v7mEOT0,1897
530
+ tests/test_version.py,sha256=c_ayM-WLlD0Q6z939sBnFpMTY160TmFg-9-hGsPa7FE,410
531
+ tests/test_views.py,sha256=Q0mSOqd6xVrAxQMdc0MAdZRUnxv7gFAkKcBQY-gQtUI,1420
532
+ tests/api/__init__.py,sha256=yKVf0yYRuxmXvyAtLjmfpHGVCsEkZOhs_FojAAM_w-8,244
533
+ tests/api/conftest.py,sha256=0HkavUGeZLAF6aP5j8yFoyPFaEQj790x57L_otwvFTo,635
534
+ tests/api/test_protect_files_rest.py,sha256=wbe_PaUbWKnlq5nWDkfqTA2h0HxvI4we4PtxW_ma5tc,2423
535
+ tests/api/test_record_api.py,sha256=9fHo6tWSakVG1bj12JfY1xY2QnYmDAaX_b_QIDj5woM,6000
536
+ tests/api/test_stats_api.py,sha256=UePoplUtJPOZcW0ih22Uw7QFT4h5gPN4pfXGGlOe1W0,1052
537
+ tests/fixtures/__init__.py,sha256=yKVf0yYRuxmXvyAtLjmfpHGVCsEkZOhs_FojAAM_w-8,244
538
+ tests/fixtures/conftest.py,sha256=XeHBsck2uwtOM0d0fcKhu2gPMVq6-_Xp2WxT-2AgQNU,700
539
+ tests/fixtures/test_cli.py,sha256=HivtaI3dqdWZml-rBif_FfyFfi1iG-pAJOol0ckiGHc,751
540
+ tests/fixtures/test_fixtures.py,sha256=dOFejrkfK5LsJyvDem9wa5I03e-yH40TALlelEinre0,1319
541
+ tests/fixtures/app_data/oai_sets.yaml,sha256=nQt7ZNQCUOEJBR6txo5Cc845SbjEnvNfLR4lAeRMBA0,84
542
+ tests/fixtures/app_data/pages.yaml,sha256=t4pyjwMBVI6MxEkwCtg9urMXo5fh0mzWy-Zr8NvCXuQ,73
543
+ tests/fixtures/app_data/pages/about.html,sha256=obB_g3uL1ligwguh0a0-tRLRBB-eGXN1NE-3odp2j-E,11
544
+ tests/mock_module/__init__.py,sha256=gu6vRcXqYTKCXZjvAIHZRv2w1IvpGiDs7atQJbij5M0,236
545
+ tests/mock_module/views.py,sha256=TWJQfcql5XaBNtdR9phVl4tHB0YG6g5IG5n08VZTzXE,770
546
+ tests/mock_module/templates/mock_mail.html,sha256=H_ya78ip4xS-9ZpBuzVpwD-QE8EKEZpoLayKe0u5rHQ,845
547
+ tests/redirector/__init__.py,sha256=yKVf0yYRuxmXvyAtLjmfpHGVCsEkZOhs_FojAAM_w-8,244
548
+ tests/redirector/conftest.py,sha256=KAbp0R8tgGoNvMr8mJ1G2AZX6PzLw-PChtbucrLn5_o,1676
549
+ tests/redirector/test_redirector.py,sha256=iATYglIw3QSoUKpspQCAM4SaG_WmzjL7r1Nmew_KlGY,1002
550
+ tests/ui/__init__.py,sha256=yKVf0yYRuxmXvyAtLjmfpHGVCsEkZOhs_FojAAM_w-8,244
551
+ tests/ui/conftest.py,sha256=id6A9VbwHQtnr8bzQyQXDBDoKUHx8uufuhRVk02mqbk,3015
552
+ tests/ui/test_deposits.py,sha256=BehQzo1r3_f4Uc9jcXRddd9bS5GfQ3jRRYOM0AMbi3w,3792
553
+ tests/ui/test_export_formats.py,sha256=pCXJCTp9ykEWb2oB-ynGjQDhFaVsOs31ym0stwfWCaQ,909
554
+ tests/ui/test_filters.py,sha256=Q90wsJffjMVir7wNX8taGf2KZleLtPbXZXHLTkBpzLA,284
555
+ tests/ui/test_signposting_ui.py,sha256=KCSjQlMD2VKlwQCyZYDwYjtVNL35x3u-ZC4ceD5y21w,3847
556
+ tests/ui/test_static.py,sha256=vO3OQAOhrQESJifnQfM1pw7JYz3J874O8BAb7Cc_PPA,868
557
+ tests/ui/test_stats_ui.py,sha256=LHa_0hjvpYvliSk_jknWy-90CO82jVElUfK5Ua_ZmfA,3554
558
+ invenio_app_rdm-13.0.0b2.dev4.dist-info/LICENSE,sha256=AZXFHRrZa5s4m9DV7zZr4bPGTMUvcEPCodeV_AmFI8k,1204
559
+ invenio_app_rdm-13.0.0b2.dev4.dist-info/METADATA,sha256=llhPnYj4_mF5zohdgicsNAdMhTOiADuTi1v_Z7lUUvw,10582
560
+ invenio_app_rdm-13.0.0b2.dev4.dist-info/WHEEL,sha256=SrDKpSbFN1G94qcmBqS9nyHcDMp9cUS9OC06hC0G3G0,109
561
+ invenio_app_rdm-13.0.0b2.dev4.dist-info/entry_points.txt,sha256=r1vTqYNABeWqRMWitzyR9FnBsAy-KYZKZCp95IziyLY,2070
562
+ invenio_app_rdm-13.0.0b2.dev4.dist-info/top_level.txt,sha256=NqTqrntInEAci7EXcNBvouXFMqwyjVQhEI0b7izYRBY,22
563
+ invenio_app_rdm-13.0.0b2.dev4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
tests/__init__.py ADDED
@@ -0,0 +1,8 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2025 Graz University of Technology.
4
+ #
5
+ # Invenio App RDM is free software; you can redistribute it and/or modify it
6
+ # under the terms of the MIT License; see LICENSE file for more details.
7
+
8
+ """Tests."""
tests/api/__init__.py ADDED
@@ -0,0 +1,8 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2025 Graz University of Technology.
4
+ #
5
+ # Invenio App RDM is free software; you can redistribute it and/or modify it
6
+ # under the terms of the MIT License; see LICENSE file for more details.
7
+
8
+ """Tests."""
tests/api/conftest.py ADDED
@@ -0,0 +1,24 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2019 CERN.
4
+ # Copyright (C) 2019 Northwestern University.
5
+ #
6
+ # Invenio App RDM is free software; you can redistribute it and/or modify it
7
+ # under the terms of the MIT License; see LICENSE file for more details.
8
+
9
+ """Pytest fixtures and plugins for the API application."""
10
+
11
+ import pytest
12
+ from invenio_app.factory import create_api
13
+
14
+
15
+ @pytest.fixture(scope="module")
16
+ def create_app():
17
+ """Create test app."""
18
+ return create_api
19
+
20
+
21
+ @pytest.fixture(scope="module")
22
+ def headers():
23
+ """Return typical API headers."""
24
+ return {"content-type": "application/json", "accept": "application/json"}