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.
- invenio_app_rdm/__init__.py +1 -1
- invenio_app_rdm/administration/audit_logs/__init__.py +12 -0
- invenio_app_rdm/administration/audit_logs/audit_logs.py +77 -0
- invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/audit_logs.html +14 -0
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/details.html +2 -2
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/licenses.html +50 -36
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/detail.html +9 -0
- invenio_app_rdm/records_ui/views/__init__.py +2 -0
- invenio_app_rdm/records_ui/views/decorators.py +10 -7
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/ViewAction.js +0 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/index.js +29 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/search/SearchResultItemLayout.js +71 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/search/index.js +9 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +8 -1
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/AccessUsersGroups.js +1 -1
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/UserGroupAccessSearchResultItem.js +1 -1
- invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/files_integrity_report/email/files_integrity_report.html +10 -11
- invenio_app_rdm/theme/webpack.py +1 -0
- {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/METADATA +21 -6
- {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/RECORD +29 -22
- {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/WHEEL +1 -1
- {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/entry_points.txt +1 -0
- tests/conftest.py +0 -41
- tests/mock_module/templates/mock_mail.html +3 -4
- tests/test_tasks.py +121 -16
- tests/ui/conftest.py +17 -5
- tests/ui/test_file_download.py +73 -0
- invenio_app_rdm/urls.py +0 -72
- {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/licenses/LICENSE +0 -0
- {invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/top_level.txt +0 -0
invenio_app_rdm/__init__.py
CHANGED
|
@@ -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"]
|
invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/audit_logs.html
ADDED
|
@@ -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
|
-
{{
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
{%
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
<img class="icon" src="{{ url_for('static', filename=iconFile) }}"
|
|
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
|
-
|
|
47
|
+
{% endif %}
|
|
44
48
|
|
|
45
|
-
|
|
49
|
+
<span class="title-text">
|
|
46
50
|
{{ license.title_l10n }}
|
|
47
51
|
</span>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
|
-
|
|
65
|
+
{{ license_link(license) }}
|
|
66
|
+
</div>
|
|
61
67
|
</div>
|
|
62
|
-
</
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/ViewAction.js
ADDED
|
File without changes
|
|
@@ -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);
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/search/index.js
ADDED
|
@@ -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
|
>
|
|
@@ -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:
|
|
17
|
-
{{ _("URI:
|
|
15
|
+
{{ _("ID: {}").format(entry.file.id) }}
|
|
16
|
+
{{ _("URI: {}").format(entry.file.uri) }}
|
|
18
17
|
{%- if 'filename' in entry %}
|
|
19
|
-
{{ _("Name:
|
|
18
|
+
{{ _("Name: {}").format(entry.filename) }}
|
|
20
19
|
{%- endif %}
|
|
21
|
-
{{ _("Created:
|
|
22
|
-
{{ _("Checksum:
|
|
23
|
-
{{ _("Last check date:
|
|
24
|
-
{{ _("Last check FAILED with result:
|
|
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:
|
|
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:
|
|
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 %}
|
invenio_app_rdm/theme/webpack.py
CHANGED
|
@@ -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={
|
{invenio_app_rdm-13.0.0b3.dev4.dist-info → invenio_app_rdm-13.0.0b3.dev6.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: invenio-app-rdm
|
|
3
|
-
Version: 13.0.0b3.
|
|
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.
|
|
15
|
-
Requires-Dist: invenio-base<3.0.0,>=2.
|
|
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.
|
|
44
|
-
Requires-Dist: invenio-rdm-records<19.0.0,>=18.
|
|
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.
|
|
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
|