invenio-app-rdm 13.0.0b3.dev4__py2.py3-none-any.whl → 13.0.0b3.dev6__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 (30) hide show
  1. invenio_app_rdm/__init__.py +1 -1
  2. invenio_app_rdm/administration/audit_logs/__init__.py +12 -0
  3. invenio_app_rdm/administration/audit_logs/audit_logs.py +77 -0
  4. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/audit_logs.html +14 -0
  5. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/details.html +2 -2
  6. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/licenses.html +50 -36
  7. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/detail.html +9 -0
  8. invenio_app_rdm/records_ui/views/__init__.py +2 -0
  9. invenio_app_rdm/records_ui/views/decorators.py +10 -7
  10. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/ViewAction.js +0 -0
  11. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/index.js +29 -0
  12. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/search/SearchResultItemLayout.js +71 -0
  13. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/search/index.js +9 -0
  14. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +8 -1
  15. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/AccessUsersGroups.js +1 -1
  16. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/UserGroupAccessSearchResultItem.js +1 -1
  17. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/files_integrity_report/email/files_integrity_report.html +10 -11
  18. invenio_app_rdm/theme/webpack.py +1 -0
  19. {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/METADATA +21 -6
  20. {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/RECORD +29 -22
  21. {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/WHEEL +1 -1
  22. {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/entry_points.txt +1 -0
  23. tests/conftest.py +0 -41
  24. tests/mock_module/templates/mock_mail.html +3 -4
  25. tests/test_tasks.py +121 -16
  26. tests/ui/conftest.py +17 -5
  27. tests/ui/test_file_download.py +73 -0
  28. invenio_app_rdm/urls.py +0 -72
  29. {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/licenses/LICENSE +0 -0
  30. {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/top_level.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.0b3.dev4"
20
+ __version__ = "13.0.0b3.dev6"
21
21
 
22
22
  __all__ = ("__version__",)
@@ -0,0 +1,12 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2025 CERN.
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
+ """Audit logs administration module."""
9
+
10
+ from .audit_logs import AuditLogListView
11
+
12
+ __all__ = "AuditLogListView"
@@ -0,0 +1,77 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2025 CERN.
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
+ """Invenio administration view module for audit logs."""
9
+ from flask import current_app
10
+ from invenio_administration.views.base import AdminResourceListView
11
+ from invenio_i18n import lazy_gettext as _
12
+
13
+
14
+ class AuditLogListView(AdminResourceListView):
15
+ """Audit logs admin search view."""
16
+
17
+ api_endpoint = "/audit-logs/"
18
+ extension_name = "invenio-audit-logs"
19
+ name = "audit-logs"
20
+ resource_config = "audit_log_resource"
21
+
22
+ title = "Audit Logs"
23
+ menu_label = "Audit Logs"
24
+ category = "Logs"
25
+ pid_path = "id"
26
+ icon = "file alternate"
27
+ template = "invenio_app_rdm/administration/audit_logs.html"
28
+ order = 1
29
+ search_request_headers = {"Accept": "application/vnd.inveniordm.v1+json"}
30
+
31
+ display_search = True
32
+ display_delete = False
33
+ display_create = False
34
+ display_edit = False
35
+
36
+ item_field_list = {
37
+ "id": {
38
+ "text": _("Log ID"),
39
+ "order": 1,
40
+ "width": 3,
41
+ "width": 3,
42
+ },
43
+ "resource.type": {
44
+ "text": _("Resource"),
45
+ "order": 2,
46
+ "width": 2,
47
+ },
48
+ "resource.id": { # Link to resource in the `resource_type` admin panel
49
+ "text": _("Resource ID"),
50
+ "order": 3,
51
+ "width": 2,
52
+ },
53
+ "action": {
54
+ "text": _("Action"),
55
+ "order": 4,
56
+ "width": 2,
57
+ },
58
+ "user.id": { # Link to user in user admin panel
59
+ "text": _("User"),
60
+ "order": 5,
61
+ "width": 3,
62
+ },
63
+ "created": {
64
+ "text": _("Timestamp"),
65
+ "order": 6,
66
+ "width": 7,
67
+ },
68
+ }
69
+
70
+ search_config_name = "AUDIT_LOGS_SEARCH"
71
+ search_facets_config_name = "AUDIT_LOGS_FACETS"
72
+ search_sort_config_name = "AUDIT_LOGS_SORT_OPTIONS"
73
+
74
+ @staticmethod
75
+ def disabled():
76
+ """Disable the view on demand."""
77
+ return not current_app.config["AUDIT_LOGS_ENABLED"]
@@ -0,0 +1,14 @@
1
+ {#
2
+ Copyright (C) 2025 CERN.
3
+
4
+ Invenio App RDM is free software; you can redistribute it and/or modify it
5
+ under the terms of the MIT License; see LICENSE file for more details.
6
+ #}
7
+
8
+ {% extends "invenio_administration/search.html" %}
9
+
10
+
11
+ {% block javascript %}
12
+ {{ super() }}
13
+ {{ webpack['invenio-audit-logs-administration.js'] }}
14
+ {% endblock %}
@@ -9,7 +9,7 @@
9
9
  #}
10
10
 
11
11
  {%- from "invenio_app_rdm/records/macros/detail.html" import
12
- list_languages, show_dates, show_detail, show_detail_conference %}
12
+ list_languages, show_dates, show_detail, show_detail_conference, show_detail_thesis %}
13
13
 
14
14
  {%- set id_doi = record.pids.get('doi', {}).get('identifier') %}
15
15
 
@@ -26,7 +26,7 @@
26
26
  {{ show_detail(_('Publisher'), metadata.publisher) if metadata.publisher }}
27
27
  {{ show_detail(_('Published in'), record.ui.publishing_information.journal) if record.ui.get('publishing_information', {}).get('journal') }}
28
28
  {{ show_detail(_('Imprint'), record.ui.publishing_information.imprint) if record.ui.get('publishing_information', {}).get('imprint') }}
29
- {{ show_detail(_('Awarding university'), record.ui.publishing_information.thesis) if record.ui.get('publishing_information', {}).get('thesis', {}) }}
29
+ {{ show_detail_thesis(_('Thesis'), record.ui.publishing_information.thesis) if record.ui.get('publishing_information', {}).get('thesis', {}) }}
30
30
  {{ show_detail(_('Conference'), show_detail_conference(record.ui.conference)) if record.ui.conference }}
31
31
  {{ show_detail(_('Languages'), list_languages(record.ui.languages)) if record.ui.languages }}
32
32
  {{ show_detail(_('Formats'), ", ".join(metadata.formats)) if metadata.formats }}
@@ -11,58 +11,72 @@
11
11
 
12
12
  {% macro license_link(license) %}
13
13
  {% if license.link %}
14
- <a class="license-link" href="{{ license.link }}" target="_blank" title="{{ _('Opens in new tab') }}">{{ _('Read more') }}</a>
14
+ <a class="license-link" href="{{ license.link }}" target="_blank"
15
+ title="{{ _('Opens in new tab') }}">{{ _('Read more') }}</a>
15
16
  {% elif license.props and license.props.url %}
16
- <a class="license-link" href="{{ license.props.url }}" target="_blank" title="{{ _('Opens in new tab') }}">{{ _('Read more') }}</a>
17
+ <a class="license-link" href="{{ license.props.url }}" target="_blank"
18
+ title="{{ _('Opens in new tab') }}">{{ _('Read more') }}</a>
17
19
  {% endif %}
18
20
  {% endmacro %}
19
21
 
20
- {% set rights = record.ui.get('rights') %}
21
- {% if rights %}
22
+ {% set rights = record.ui.get('rights', []) %}
23
+ {% set copyrights = record.get('metadata', {}).get('copyright') %}
24
+ {% if rights or copyrights %}
22
25
  <div class="sidebar-container">
23
26
  <h2 class="ui medium top attached header mt-0">{{ _('Rights') }}</h2>
24
27
  <div id="licenses" class="ui segment bottom attached rdm-sidebar">
25
-
26
- <ul class="details-list m-0 p-0">
27
-
28
- {%- for license in rights%}
29
- <li id="license-{{license.id}}-{{loop.index}}" class="has-popup">
30
- <div id="title-{{license.id}}-{{loop.index}}"
31
- class="license clickable"
32
- tabindex="0"
33
- aria-haspopup="dialog"
34
- aria-expanded="false"
35
- role="button"
36
- aria-label="{{ license.title_l10n }}"
37
- >
38
- {% if license.icon %}
39
- {% set iconFile = 'icons/licenses/{}.svg'.format(license.icon) %}
40
- <span class="icon-wrap">
41
- <img class="icon" src="{{ url_for('static', filename=iconFile) }}" alt="{{ license.id }} icon"/>
28
+ {% if rights %}
29
+ <h4>License</h4>
30
+ <ul class="details-list m-0 p-0">
31
+ {%- for license in rights -%}
32
+ <li id="license-{{ license.id }}-{{ loop.index }}" class="has-popup">
33
+ <div id="title-{{ license.id }}-{{ loop.index }}"
34
+ class="license clickable"
35
+ tabindex="0"
36
+ aria-haspopup="dialog"
37
+ aria-expanded="false"
38
+ role="button"
39
+ aria-label="{{ license.title_l10n }}"
40
+ >
41
+ {% if license.icon %}
42
+ {% set iconFile = 'icons/licenses/{}.svg'.format(license.icon) %}
43
+ <span class="icon-wrap">
44
+ <img class="icon" src="{{ url_for('static', filename=iconFile) }}"
45
+ alt="{{ license.id }} icon"/>
42
46
  </span>
43
- {% endif %}
47
+ {% endif %}
44
48
 
45
- <span class="title-text">
49
+ <span class="title-text">
46
50
  {{ license.title_l10n }}
47
51
  </span>
48
- </div>
49
- <div id="description-{{license.id}}-{{loop.index}}"
50
- class="licenses-description ui flowing popup transition hidden"
51
- role="dialog"
52
- aria-labelledby="title-{{license.id}}-{{loop.index}}"
53
- >
54
- <i role="button" tabindex="0" class="close icon text-muted" aria-label="{{ _('Close') }}"></i>
52
+ </div>
53
+ <div id="description-{{ license.id }}-{{ loop.index }}"
54
+ class="licenses-description ui flowing popup transition hidden"
55
+ role="dialog"
56
+ aria-labelledby="title-{{ license.id }}-{{ loop.index }}"
57
+ >
58
+ <i role="button" tabindex="0" class="close icon text-muted"
59
+ aria-label="{{ _('Close') }}"></i>
55
60
 
56
- <div id="license-description-{{loop.index}}" class="description">
61
+ <div id="license-description-{{ loop.index }}" class="description">
57
62
  <span class="text-muted">
58
63
  {{ license.description_l10n or _('No further description.') }}
59
64
  </span>
60
- {{ license_link(license) }}
65
+ {{ license_link(license) }}
66
+ </div>
61
67
  </div>
62
- </div>
63
- </li>
64
- {% endfor %}
65
- </ul>
68
+ </li>
69
+ {% endfor %}
70
+
71
+ </ul>
72
+ {% endif %}
73
+ {% if copyrights %}
74
+ <h4>Copyrights</h4>
75
+ <div id="copyrights">
76
+ {{ copyrights }}
77
+ </div>
78
+ {% endif %}
66
79
  </div>
80
+
67
81
  </div>
68
82
  {% endif %}
@@ -309,3 +309,12 @@
309
309
  class="fa fa-external-link"></i> {{ _('Conference website') }}</a></dd>
310
310
  {%- endif %}
311
311
  {% endmacro %}
312
+
313
+
314
+ {% macro show_detail_thesis(title, thesis) %}
315
+ <dt class="ui tiny header">
316
+ {{ title }}
317
+ </dt>
318
+ <dd>{{ thesis | safe }}
319
+ </dd>
320
+ {% endmacro %}
@@ -22,6 +22,7 @@ from invenio_records_resources.services.errors import (
22
22
  PermissionDeniedError,
23
23
  RecordPermissionDeniedError,
24
24
  )
25
+ from sqlalchemy.orm.exc import NoResultFound
25
26
 
26
27
  from invenio_app_rdm.views import create_url_rule
27
28
 
@@ -161,6 +162,7 @@ def create_blueprint(app):
161
162
  blueprint.register_error_handler(PIDUnregistered, not_found_error)
162
163
  blueprint.register_error_handler(KeyError, not_found_error)
163
164
  blueprint.register_error_handler(FileKeyNotFoundError, not_found_error)
165
+ blueprint.register_error_handler(NoResultFound, not_found_error)
164
166
  blueprint.register_error_handler(DraftNotCreatedError, draft_not_found_error)
165
167
  blueprint.register_error_handler(
166
168
  PermissionDeniedError, record_permission_denied_error
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  # Copyright (C) 2019-2025 CERN.
4
- # Copyright (C) 2019-2021 Northwestern University.
4
+ # Copyright (C) 2019-2025 Northwestern University.
5
5
  # Copyright (C) 2021 TU Wien.
6
6
  #
7
7
  # Invenio App RDM is free software; you can redistribute it and/or modify it
@@ -13,6 +13,7 @@ from functools import wraps
13
13
 
14
14
  from flask import current_app, g, make_response, redirect, request, session, url_for
15
15
  from flask_login import login_required
16
+ from invenio_base import invenio_url_for
16
17
  from invenio_communities.communities.resources.serializer import (
17
18
  UICommunityJSONSerializer,
18
19
  )
@@ -25,8 +26,6 @@ from invenio_rdm_records.resources.serializers.signposting import (
25
26
  from invenio_records_resources.services.errors import PermissionDeniedError
26
27
  from sqlalchemy.orm.exc import NoResultFound
27
28
 
28
- from invenio_app_rdm.urls import record_url_for
29
-
30
29
 
31
30
  def service():
32
31
  """Get the record service."""
@@ -376,17 +375,21 @@ def _get_header(rel, value, link_type=None):
376
375
 
377
376
 
378
377
  def _get_signposting_collection(pid_value):
379
- ui_url = record_url_for(pid_value=pid_value)
378
+ ui_url = invenio_url_for(
379
+ "invenio_app_rdm_records.record_detail", pid_value=pid_value
380
+ )
380
381
  return _get_header("collection", ui_url, "text/html")
381
382
 
382
383
 
383
384
  def _get_signposting_describes(pid_value):
384
- ui_url = record_url_for(pid_value=pid_value)
385
+ ui_url = invenio_url_for(
386
+ "invenio_app_rdm_records.record_detail", pid_value=pid_value
387
+ )
385
388
  return _get_header("describes", ui_url, "text/html")
386
389
 
387
390
 
388
391
  def _get_signposting_linkset(pid_value):
389
- api_url = record_url_for(_app="api", pid_value=pid_value)
392
+ api_url = invenio_url_for("records.read", pid_value=pid_value)
390
393
  return _get_header("linkset", api_url, "application/linkset+json")
391
394
 
392
395
 
@@ -412,7 +415,7 @@ def add_signposting_landing_page(f):
412
415
  response.headers["Link"] = signposting_headers
413
416
  else:
414
417
  pid_value = kwargs["pid_value"]
415
- signposting_link = record_url_for(_app="api", pid_value=pid_value)
418
+ signposting_link = invenio_url_for("records.read", pid_value=pid_value)
416
419
 
417
420
  response.headers["Link"] = (
418
421
  f'<{signposting_link}> ; rel="linkset" ; type="application/linkset+json"' # fmt: skip
@@ -0,0 +1,29 @@
1
+ // This file is part of InvenioCommunities
2
+ // Copyright (C) 2025 CERN.
3
+ //
4
+ // Invenio RDM is free software; you can redistribute it and/or modify it
5
+ // under the terms of the MIT License; see LICENSE file for more details.
6
+
7
+ import { initDefaultSearchComponents } from "@js/invenio_administration";
8
+ import { createSearchAppInit } from "@js/invenio_search_ui";
9
+ import { NotificationController } from "@js/invenio_administration";
10
+ import { SearchResultItemLayout } from "./search";
11
+ import { SearchFacets } from "@js/invenio_administration";
12
+
13
+ const domContainer = document.getElementById("invenio-search-config");
14
+
15
+ const defaultComponents = initDefaultSearchComponents(domContainer);
16
+
17
+ const overridenComponents = {
18
+ ...defaultComponents,
19
+ "InvenioAdministration.SearchResultItem.layout": SearchResultItemLayout,
20
+ "SearchApp.facets": SearchFacets,
21
+ };
22
+
23
+ createSearchAppInit(
24
+ overridenComponents,
25
+ true,
26
+ "invenio-search-config",
27
+ false,
28
+ NotificationController
29
+ );
@@ -0,0 +1,71 @@
1
+ /*
2
+ * This file is part of Invenio.
3
+ * Copyright (C) 2025 CERN.
4
+ *
5
+ * Invenio 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
+
9
+ import PropTypes from "prop-types";
10
+ import React, { Component } from "react";
11
+ import { Item, Table } from "semantic-ui-react";
12
+ import { Image } from "react-invenio-forms";
13
+ import { withState } from "react-searchkit";
14
+ import { i18next } from "@translations/invenio_app_rdm/i18next";
15
+
16
+ class SearchResultItemComponent extends Component {
17
+ componentDidMount() {
18
+ console.error("result", this.props.result);
19
+ }
20
+
21
+ refreshAfterAction = () => {
22
+ const { updateQueryState, currentQueryState } = this.props;
23
+ updateQueryState(currentQueryState);
24
+ };
25
+
26
+ render() {
27
+ const { result } = this.props;
28
+
29
+ const {
30
+ id,
31
+ created,
32
+ action,
33
+ resource: { id: resourceId, type: resourceType },
34
+ user: { id: userId, email: userEmail },
35
+ } = result;
36
+
37
+ return (
38
+ <Table.Row>
39
+ <Table.Cell data-label={i18next.t("Log ID")}>
40
+ <a target="_blank" rel="noreferrer noopener" href={result.links.self}>
41
+ {id}
42
+ </a>
43
+ </Table.Cell>
44
+ <Table.Cell data-label={i18next.t("Resource")}>{resourceType}</Table.Cell>
45
+ <Table.Cell data-label={i18next.t("Resource ID")}>
46
+ <a href={`/administration/${resourceType}s?q=id:${resourceId}`}>
47
+ {resourceId}
48
+ </a>
49
+ </Table.Cell>
50
+ <Table.Cell data-label={i18next.t("Action")}>{action}</Table.Cell>
51
+ <Table.Cell data-label={i18next.t("User")}>
52
+ <Item className="flex" key={userId}>
53
+ <Image src={`/api/users/${userId}/avatar.svg`} avatar loadFallbackFirst />
54
+ <a href={`/administration/users?q=id:${userId}`}>
55
+ {userEmail} ({userId})
56
+ </a>
57
+ </Item>
58
+ </Table.Cell>
59
+ <Table.Cell data-label={i18next.t("Date")}>{created}</Table.Cell>
60
+ </Table.Row>
61
+ );
62
+ }
63
+ }
64
+
65
+ SearchResultItemComponent.propTypes = {
66
+ result: PropTypes.object.isRequired,
67
+ updateQueryState: PropTypes.func.isRequired,
68
+ currentQueryState: PropTypes.object.isRequired,
69
+ };
70
+
71
+ export const SearchResultItemLayout = withState(SearchResultItemComponent);
@@ -0,0 +1,9 @@
1
+ /*
2
+ * This file is part of Invenio.
3
+ * Copyright (C) 2025 CERN.
4
+ *
5
+ * Invenio 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
+
9
+ export { SearchResultItemLayout } from "./SearchResultItemLayout";
@@ -43,6 +43,7 @@ import { FundingField } from "@js/invenio_vocabularies";
43
43
  import { Card, Container, Grid, Ref, Sticky } from "semantic-ui-react";
44
44
  import PropTypes from "prop-types";
45
45
  import Overridable from "react-overridable";
46
+ import { CopyrightsField } from "@js/invenio_rdm_records/src/deposit/fields/CopyrightsField/CopyrightsField";
46
47
  import { ShareDraftButton } from "./ShareDraftButton";
47
48
  import { depositFormSectionsConfig, severityChecksConfig } from "./config";
48
49
 
@@ -351,6 +352,12 @@ export class RDMDepositForm extends Component {
351
352
  })}
352
353
  />
353
354
  </Overridable>
355
+ <Overridable
356
+ id="InvenioAppRdm.Deposit.CopyrightsField.container"
357
+ fieldPath="metadata.copyright"
358
+ >
359
+ <CopyrightsField fieldPath="metadata.copyright" />
360
+ </Overridable>
354
361
  <Overridable
355
362
  id="InvenioAppRdm.Deposit.AccordionFieldBasicInformation.extra"
356
363
  record={record}
@@ -474,7 +481,7 @@ export class RDMDepositForm extends Component {
474
481
  includesPaths={this.sectionsConfig["funding-section"]}
475
482
  severityChecks={this.severityChecks}
476
483
  active
477
- label="Funding"
484
+ label={i18next.t("Funding")}
478
485
  ui={this.accordionStyle}
479
486
  id="funding-section"
480
487
  >
@@ -98,7 +98,7 @@ export class AccessUsersGroups extends Component {
98
98
  <Grid.Column>
99
99
  <Item className="flex">
100
100
  <Image
101
- src={recOwner.links.avatar}
101
+ src={recOwner.links?.avatar}
102
102
  avatar
103
103
  className="rel-ml-1"
104
104
  alt=""
@@ -78,7 +78,7 @@ export class UserGroupAccessSearchResultItem extends Component {
78
78
  <Grid.Column>
79
79
  <Item className="flex" key={result.id}>
80
80
  <Image
81
- src={entity.links.avatar}
81
+ src={entity.links?.avatar}
82
82
  avatar
83
83
  className="rel-ml-1"
84
84
  alt=""
@@ -3,30 +3,29 @@
3
3
  #
4
4
  # Copyright (C) 2022 CERN.
5
5
  # Copyright (C) 2024 KTH Royal Institute of Technology.
6
+ # Copyright (C) 2025 Northwestern University.
6
7
  #
7
8
  # Invenio App RDM is free software; you can redistribute it and/or modify it
8
9
  # under the terms of the MIT License; see LICENSE file for more details.
9
10
  -#}
10
11
 
11
- {% set BASE_URL = config.SITE_UI_URL %}
12
-
13
12
  {{ _("The following files were flagged as 'unhealthy'. This means that the checksum check failed or timed out. Please take any action if needed.") }}
14
13
 
15
14
  {% for entry in entries -%}
16
- {{ _("ID: %s") | format(entry.file.id) }}
17
- {{ _("URI: %s") | format(entry.file.uri) }}
15
+ {{ _("ID: {}").format(entry.file.id) }}
16
+ {{ _("URI: {}").format(entry.file.uri) }}
18
17
  {%- if 'filename' in entry %}
19
- {{ _("Name: %s") | format(entry.filename) }}
18
+ {{ _("Name: {}").format(entry.filename) }}
20
19
  {%- endif %}
21
- {{ _("Created: %s") | format(entry.file.created) }}
22
- {{ _("Checksum: %s") | format(entry.file.checksum) }}
23
- {{ _("Last check date: %s") | format(entry.file.last_check_at) }}
24
- {{ _("Last check FAILED with result: %s") | format(entry.file.last_check) }}
20
+ {{ _("Created: {}").format(entry.file.created) }}
21
+ {{ _("Checksum: {}").format(entry.file.checksum) }}
22
+ {{ _("Last check date: {}").format(entry.file.last_check_at) }}
23
+ {{ _("Last check FAILED with result: {}").format(entry.file.last_check) }}
25
24
  {%- if 'record' in entry %}
26
- {{ _("Record: %s/records/%s") | format(BASE_URL, entry.record.id) }}
25
+ {{ _("Record: {}").format(invenio_url_for("invenio_app_rdm_records.record_detail", pid_value=entry.record.id)) }}
27
26
  {%- endif %}
28
27
  {%- if 'draft' in entry %}
29
- {{ _("Draft: %s/uploads/%s") | format(BASE_URL, entry.draft.id) }}
28
+ {{ _("Draft: {}").format(invenio_url_for("invenio_app_rdm_records.deposit_edit", pid_value=entry.draft.id)) }}
30
29
  {%- endif %}
31
30
  {{ "-" * 80 }}
32
31
  {% endfor %}
@@ -38,6 +38,7 @@ theme = WebpackThemeBundle(
38
38
  "invenio-records-administration": "./js/invenio_app_rdm/administration/records/index.js",
39
39
  "invenio-drafts-administration": "./js/invenio_app_rdm/administration/drafts/index.js",
40
40
  "invenio-domains-administration": "./js/invenio_app_rdm/administration/domains/index.js",
41
+ "invenio-audit-logs-administration": "./js/invenio_app_rdm/administration/auditLogs/index.js",
41
42
  "invenio-communities-browse": "./js/invenio_app_rdm/subcommunity/browse.js",
42
43
  },
43
44
  dependencies={
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: invenio-app-rdm
3
- Version: 13.0.0b3.dev4
3
+ Version: 13.0.0b3.dev6
4
4
  Summary: Invenio Research Data Management.
5
5
  Home-page: https://github.com/inveniosoftware/invenio-app-rdm
6
6
  Author: CERN
@@ -11,8 +11,8 @@ Platform: any
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Requires-Python: >=3.7
13
13
  License-File: LICENSE
14
- Requires-Dist: invenio-app<3.0.0,>=2.0.0
15
- Requires-Dist: invenio-base<3.0.0,>=2.0.0
14
+ Requires-Dist: invenio-app<3.0.0,>=2.1.0
15
+ Requires-Dist: invenio-base<3.0.0,>=2.1.0
16
16
  Requires-Dist: invenio-cache<3.0.0,>=2.0.0
17
17
  Requires-Dist: invenio-celery<3.0.0,>=2.0.0
18
18
  Requires-Dist: invenio-config<2.0.0,>=1.0.3
@@ -40,14 +40,15 @@ Requires-Dist: invenio-search-ui<5.0.0,>=4.0.0
40
40
  Requires-Dist: invenio-files-rest<4.0.0,>=3.0.0
41
41
  Requires-Dist: invenio-previewer<4.0.0,>=3.0.0
42
42
  Requires-Dist: invenio-records-files<2.0.0,>=1.2.1
43
- Requires-Dist: invenio-communities<19.0.0,>=18.0.0
44
- Requires-Dist: invenio-rdm-records<19.0.0,>=18.1.0
43
+ Requires-Dist: invenio-communities<19.0.0,>=18.2.0
44
+ Requires-Dist: invenio-rdm-records<19.0.0,>=18.4.0
45
45
  Requires-Dist: CairoSVG<3.0.0,>=2.5.2
46
46
  Requires-Dist: invenio-banners<5.0.0,>=4.0.0
47
47
  Requires-Dist: invenio-pages<6.0.0,>=5.0.0
48
+ Requires-Dist: invenio-audit-logs<1.0.0,>=0.1.0
48
49
  Provides-Extra: tests
49
50
  Requires-Dist: pytest-black-ng>=0.4.0; extra == "tests"
50
- Requires-Dist: pytest-invenio<4.0.0,>=3.0.0; extra == "tests"
51
+ Requires-Dist: pytest-invenio<4.0.0,>=3.3.0; extra == "tests"
51
52
  Requires-Dist: Sphinx>=4.5.0; extra == "tests"
52
53
  Provides-Extra: elasticsearch7
53
54
  Requires-Dist: invenio-search[elasticsearch7]<4.0.0,>=3.0.0; extra == "elasticsearch7"
@@ -97,6 +98,20 @@ https://inveniordm.docs.cern.ch
97
98
  Changes
98
99
  =======
99
100
 
101
+ Version v13.0.0b3.dev6 (released 2025-05-07)
102
+
103
+ - records-ui: add error handler for NoResultFound exceptions
104
+ - tests: add tests for draft file download with and without preview flag
105
+ - i18n: mark string for translation
106
+ - urls: integrate link generation (invenio_url_for)
107
+ - templates: add thesis details display
108
+ - administration: Add Audit Logs Admin Panel UI (experimental feature, behind a flag)
109
+
110
+ Version v13.0.0b3.dev5 (released 2025-04-25)
111
+
112
+ - deposit: add copyright field
113
+ - landing page: bugfix for user avatars
114
+
100
115
  Version v13.0.0b3.dev4 (released 2025-04-10)
101
116
 
102
117
  - deposits: use optional doi validator method