invenio-app-rdm 14.0.0b0.dev1__py2.py3-none-any.whl → 14.0.0b0.dev3__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/records/records.py +9 -7
- invenio_app_rdm/config.py +1 -0
- invenio_app_rdm/fixtures/pages.py +5 -2
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/citation.html +2 -2
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/communities.html +8 -7
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/external_resources.html +5 -6
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/licenses.html +9 -13
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/manage_menu.html +1 -2
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/files.html +1 -1
- invenio_app_rdm/records_ui/views/decorators.py +23 -9
- invenio_app_rdm/records_ui/views/deposits.py +10 -3
- invenio_app_rdm/records_ui/views/records.py +3 -11
- invenio_app_rdm/requests_ui/views/requests.py +3 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/ViewRecentChanges.js +8 -8
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js +14 -16
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js +1 -2
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +1 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/CommunitiesManagement.js +2 -2
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCitationField.js +15 -14
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesListModal/RecordCommunitiesListModal.js +4 -4
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js +38 -40
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/theme.js +5 -5
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/search/components.js +1 -1
- invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/landing_page/licenses.less +5 -3
- invenio_app_rdm/upgrade_scripts/migrate_12_0_to_13_0.py +101 -4
- {invenio_app_rdm-14.0.0b0.dev1.dist-info → invenio_app_rdm-14.0.0b0.dev3.dist-info}/METADATA +27 -2
- {invenio_app_rdm-14.0.0b0.dev1.dist-info → invenio_app_rdm-14.0.0b0.dev3.dist-info}/RECORD +32 -32
- {invenio_app_rdm-14.0.0b0.dev1.dist-info → invenio_app_rdm-14.0.0b0.dev3.dist-info}/WHEEL +0 -0
- {invenio_app_rdm-14.0.0b0.dev1.dist-info → invenio_app_rdm-14.0.0b0.dev3.dist-info}/entry_points.txt +0 -0
- {invenio_app_rdm-14.0.0b0.dev1.dist-info → invenio_app_rdm-14.0.0b0.dev3.dist-info}/licenses/LICENSE +0 -0
- {invenio_app_rdm-14.0.0b0.dev1.dist-info → invenio_app_rdm-14.0.0b0.dev3.dist-info}/top_level.txt +0 -0
invenio_app_rdm/__init__.py
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2023-
|
|
3
|
+
# Copyright (C) 2023-2025 CERN.
|
|
4
4
|
# Copyright (C) 2023 Graz University of Technology.
|
|
5
5
|
# Copyright (C) 2024 KTH Royal Institute of Technology.
|
|
6
6
|
#
|
|
7
|
-
#
|
|
7
|
+
# Invenio-app-rdm is free software; you can redistribute it and/or
|
|
8
8
|
# modify it under the terms of the MIT License; see LICENSE file for more
|
|
9
9
|
# details.
|
|
10
10
|
|
|
11
|
-
"""Invenio administration
|
|
11
|
+
"""Invenio administration records and drafts list views."""
|
|
12
12
|
|
|
13
13
|
from functools import partial
|
|
14
14
|
|
|
@@ -19,7 +19,7 @@ from invenio_search_ui.searchconfig import search_app_config
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class RecordAdminListView(AdminResourceListView):
|
|
22
|
-
"""Configuration for
|
|
22
|
+
"""Configuration for the records list view."""
|
|
23
23
|
|
|
24
24
|
api_endpoint = "/records"
|
|
25
25
|
name = "records"
|
|
@@ -27,10 +27,11 @@ class RecordAdminListView(AdminResourceListView):
|
|
|
27
27
|
search_request_headers = {"Accept": "application/vnd.inveniordm.v1+json"}
|
|
28
28
|
title = _("Records")
|
|
29
29
|
menu_label = _("Records")
|
|
30
|
-
category = _("
|
|
30
|
+
category = _("Deposits")
|
|
31
31
|
icon = "file"
|
|
32
32
|
template = "invenio_app_rdm/administration/records/records.html"
|
|
33
33
|
extension_name = "invenio-rdm-records"
|
|
34
|
+
order = 1
|
|
34
35
|
|
|
35
36
|
display_search = True
|
|
36
37
|
display_delete = False
|
|
@@ -103,7 +104,7 @@ class RecordAdminListView(AdminResourceListView):
|
|
|
103
104
|
|
|
104
105
|
|
|
105
106
|
class DraftAdminListView(AdminResourceListView):
|
|
106
|
-
"""Configuration for
|
|
107
|
+
"""Configuration for the drafts list view."""
|
|
107
108
|
|
|
108
109
|
api_endpoint = "/user/records"
|
|
109
110
|
name = "drafts"
|
|
@@ -111,10 +112,11 @@ class DraftAdminListView(AdminResourceListView):
|
|
|
111
112
|
search_request_headers = {"Accept": "application/vnd.inveniordm.v1+json"}
|
|
112
113
|
title = _("Drafts")
|
|
113
114
|
menu_label = _("Drafts")
|
|
114
|
-
category = _("
|
|
115
|
+
category = _("Deposits")
|
|
115
116
|
icon = "upload"
|
|
116
117
|
template = "invenio_app_rdm/administration/records/drafts.html"
|
|
117
118
|
extension_name = "invenio-rdm-records"
|
|
119
|
+
order = 2
|
|
118
120
|
|
|
119
121
|
display_search = True
|
|
120
122
|
display_delete = False
|
invenio_app_rdm/config.py
CHANGED
|
@@ -1181,6 +1181,7 @@ PAGES_DEFAULT_TEMPLATE = "invenio_app_rdm/default_static_page.html"
|
|
|
1181
1181
|
|
|
1182
1182
|
PAGES_TEMPLATES = [
|
|
1183
1183
|
("invenio_app_rdm/default_static_page.html", "Default"),
|
|
1184
|
+
("invenio_communities/default_static_page.html", "Community"),
|
|
1184
1185
|
]
|
|
1185
1186
|
"""List of available templates for pages."""
|
|
1186
1187
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2022-
|
|
3
|
+
# Copyright (C) 2022-2025 CERN.
|
|
4
4
|
# Copyright (C) 2025 University of Münster.
|
|
5
5
|
#
|
|
6
6
|
# Invenio App RDM is free software; you can redistribute it and/or modify
|
|
@@ -68,6 +68,9 @@ class StaticPages(FixtureMixin):
|
|
|
68
68
|
),
|
|
69
69
|
"lang": lang[0],
|
|
70
70
|
"description": entry.get("description", ""),
|
|
71
|
-
"template_name":
|
|
71
|
+
"template_name": entry.get(
|
|
72
|
+
"template_name",
|
|
73
|
+
current_app.config["PAGES_DEFAULT_TEMPLATE"],
|
|
74
|
+
),
|
|
72
75
|
}
|
|
73
76
|
current_pages_service.create(system_identity, data)
|
invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/citation.html
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{#
|
|
2
|
-
Copyright (C) 2020-
|
|
2
|
+
Copyright (C) 2020-2025 CERN.
|
|
3
3
|
Copyright (C) 2020 Northwestern University.
|
|
4
4
|
Copyright (C) 2021 New York University.
|
|
5
5
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
it under the terms of the MIT License; see LICENSE file for more details.
|
|
8
8
|
#}
|
|
9
9
|
|
|
10
|
-
<div id="recordCitation" data-record='{{ record_ui | tojson }}'
|
|
10
|
+
<div id="recordCitation" data-record-links='{{ record_ui.links | tojson }}'
|
|
11
11
|
data-styles='{{ config.get("RDM_CITATION_STYLES") | tojson }}'
|
|
12
12
|
data-defaultstyle='{{ config.get("RDM_CITATION_STYLES_DEFAULT") | tojson }}'
|
|
13
13
|
data-include-deleted='{{ include_deleted | tojson }}'>
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
<div
|
|
2
2
|
id="sidebar-communities-manage"
|
|
3
3
|
data-user-communities-memberships='{{ user_communities_memberships | tojson }}'
|
|
4
|
-
data-record-community-endpoint=
|
|
5
|
-
data-record-community-search-endpoint=
|
|
6
|
-
data-record-
|
|
7
|
-
data-
|
|
8
|
-
data-record-community-search-config='{{
|
|
9
|
-
data-
|
|
4
|
+
data-record-community-endpoint='{{ record_ui["links"]["communities"] }}'
|
|
5
|
+
data-record-community-search-endpoint='{{ record_ui["links"]["communities-suggestions"] }}'
|
|
6
|
+
data-record-community-search-config='{{ search_app_rdm_record_communities_config(app_id="InvenioAppRdm.RecordCommunitiesSuggestions", endpoint=record_ui["links"]["communities-suggestions"]) | tojson }}'
|
|
7
|
+
data-record-user-community-search-endpoint='{{ record_ui["links"]["user-communities-suggestions"] }}'
|
|
8
|
+
data-record-user-community-search-config='{{ search_app_rdm_record_user_communities_config(app_id="InvenioAppRdm.RecordUserCommunitiesSuggestions", endpoint=record_ui["links"]["communities-suggestions"]) | tojson }}'
|
|
9
|
+
data-pending-communities-search-config='{{ search_app_rdm_record_requests_config(app_id="InvenioAppRdm.RecordRequests", endpoint=record_ui["links"]["requests"]) | tojson }}'
|
|
10
10
|
data-permissions='{{ permissions | tojson }}'
|
|
11
|
-
|
|
11
|
+
data-record='{{ record_ui | tojson }}'
|
|
12
|
+
class='sidebar-container'
|
|
12
13
|
>
|
|
13
14
|
|
|
14
15
|
<h2 class="ui medium top attached header">{{ _("Communities") }}</h2>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{#
|
|
2
|
-
Copyright (C) 2020 CERN.
|
|
2
|
+
Copyright (C) 2020-2025 CERN.
|
|
3
3
|
|
|
4
4
|
Invenio RDM Records is free software; you can redistribute it and/or modify
|
|
5
5
|
it under the terms of the MIT License; see LICENSE file for more details.
|
|
@@ -7,15 +7,14 @@ it under the terms of the MIT License; see LICENSE file for more details.
|
|
|
7
7
|
{%- if external_resources -%}
|
|
8
8
|
<div class="sidebar-container">
|
|
9
9
|
<h2 class="ui small top attached header">{{ _('External resources')}}</h2>
|
|
10
|
-
<
|
|
10
|
+
<dl id="external-resource" aria-label="{{ _('External resources') }}" class="ui bottom attached segment rdm-sidebar external resource details-list">
|
|
11
11
|
|
|
12
12
|
{# dynamically create the list of external resources #}
|
|
13
13
|
{%- for section, external_resources in external_resources | groupby("content.section") -%}
|
|
14
|
-
<
|
|
15
|
-
<ul class="ui
|
|
14
|
+
<dt class="ui tiny header">{{ section }}</dt>
|
|
15
|
+
<ul class="ui list no-bullet m-0">
|
|
16
16
|
|
|
17
17
|
{%- for resource in external_resources -%}
|
|
18
|
-
|
|
19
18
|
{%- if resource -%}
|
|
20
19
|
{%- if resource.template -%}
|
|
21
20
|
{# It's up to the template to render the `resource` as it wishes #}
|
|
@@ -50,7 +49,7 @@ it under the terms of the MIT License; see LICENSE file for more details.
|
|
|
50
49
|
{%- endfor -%}
|
|
51
50
|
</ul>
|
|
52
51
|
{%- endfor -%}
|
|
53
|
-
</
|
|
52
|
+
</dl>
|
|
54
53
|
</div>
|
|
55
54
|
{%- endif -%}
|
|
56
55
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{#
|
|
2
|
-
Copyright (C) 2020 CERN.
|
|
2
|
+
Copyright (C) 2020-2025 CERN.
|
|
3
3
|
Copyright (C) 2020 Northwestern University.
|
|
4
4
|
Copyright (C) 2021 Graz University of Technology.
|
|
5
5
|
Copyright (C) 2021 New York University.
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
<div class="sidebar-container">
|
|
26
26
|
<h2 class="ui medium top attached header mt-0">{{ _('Rights') }}</h2>
|
|
27
27
|
<div id="licenses" class="ui segment bottom attached rdm-sidebar">
|
|
28
|
+
<dl class="details-list">
|
|
28
29
|
{% if rights %}
|
|
29
|
-
<
|
|
30
|
-
<ul class="details-list m-0 p-0">
|
|
30
|
+
<dt class="ui tiny header">License</dt>
|
|
31
31
|
{%- for license in rights -%}
|
|
32
|
-
<
|
|
32
|
+
<dd id="license-{{ license.id }}-{{ loop.index }}" class="has-popup">
|
|
33
33
|
<div id="title-{{ license.id }}-{{ loop.index }}"
|
|
34
34
|
class="license clickable"
|
|
35
35
|
tabindex="0"
|
|
@@ -45,7 +45,6 @@
|
|
|
45
45
|
alt="{{ license.id }} icon"/>
|
|
46
46
|
</span>
|
|
47
47
|
{% endif %}
|
|
48
|
-
|
|
49
48
|
<span class="title-text">
|
|
50
49
|
{{ license.title_l10n }}
|
|
51
50
|
</span>
|
|
@@ -57,7 +56,6 @@
|
|
|
57
56
|
>
|
|
58
57
|
<i role="button" tabindex="0" class="close icon text-muted"
|
|
59
58
|
aria-label="{{ _('Close') }}"></i>
|
|
60
|
-
|
|
61
59
|
<div id="license-description-{{ loop.index }}" class="description">
|
|
62
60
|
<span class="text-muted">
|
|
63
61
|
{{ license.description_l10n or _('No further description.') }}
|
|
@@ -65,18 +63,16 @@
|
|
|
65
63
|
{{ license_link(license) }}
|
|
66
64
|
</div>
|
|
67
65
|
</div>
|
|
68
|
-
</
|
|
66
|
+
</dd>
|
|
69
67
|
{% endfor %}
|
|
70
|
-
|
|
71
|
-
</ul>
|
|
72
68
|
{% endif %}
|
|
73
69
|
{% if copyrights %}
|
|
74
|
-
<
|
|
75
|
-
<
|
|
70
|
+
<dt class="ui tiny header">Copyright</dt>
|
|
71
|
+
<dd id="copyrights">
|
|
76
72
|
{{ copyrights }}
|
|
77
|
-
</
|
|
73
|
+
</dd>
|
|
78
74
|
{% endif %}
|
|
75
|
+
</dl>
|
|
79
76
|
</div>
|
|
80
|
-
|
|
81
77
|
</div>
|
|
82
78
|
{% endif %}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{#
|
|
2
|
-
Copyright (C) 2022-
|
|
2
|
+
Copyright (C) 2022-2025 CERN.
|
|
3
3
|
|
|
4
4
|
Invenio RDM Records is free software; you can redistribute it and/or modify
|
|
5
5
|
it under the terms of the MIT License; see LICENSE file for more details.
|
|
@@ -17,7 +17,6 @@ it under the terms of the MIT License; see LICENSE file for more details.
|
|
|
17
17
|
data-is-draft="{{ is_draft | tojson }}"
|
|
18
18
|
data-is-preview-submission-request="{{ is_preview_submission_request | tojson }}"
|
|
19
19
|
data-current-user-id="{{ current_user.id }}"
|
|
20
|
-
data-record-owner-id='{{ record_owner_id }}'
|
|
21
20
|
data-groups-enabled='{{ config.USERS_RESOURCES_GROUPS_ENABLED | tojson }}'
|
|
22
21
|
{% if config.RDM_DETAIL_SIDE_BAR_MANAGE_ATTRIBUTES_EXTENSION_TEMPLATE %}
|
|
23
22
|
{% include config.RDM_DETAIL_SIDE_BAR_MANAGE_ATTRIBUTES_EXTENSION_TEMPLATE %}
|
|
@@ -123,7 +123,7 @@ To access its content, please download it and open it locally.') }}
|
|
|
123
123
|
<a href="{{ file_url_download }}">{{ file.key }}</a>
|
|
124
124
|
</div>
|
|
125
125
|
{%- if not is_remote_file %}
|
|
126
|
-
<small class="ui text-muted font-tiny">{{ file.checksum }}
|
|
126
|
+
<small class="ui text-muted font-tiny">{{ file.checksum or _("Checksum not yet calculated.") }}
|
|
127
127
|
<div class="ui icon inline-block" data-tooltip="{{_('This is the file fingerprint (checksum), which can be used to verify the file integrity.')}}">
|
|
128
128
|
<i class="question circle checksum icon"></i>
|
|
129
129
|
</div>
|
|
@@ -23,6 +23,7 @@ from invenio_rdm_records.proxies import current_rdm_records
|
|
|
23
23
|
from invenio_rdm_records.resources.serializers.signposting import (
|
|
24
24
|
FAIRSignpostingProfileLvl1Serializer,
|
|
25
25
|
)
|
|
26
|
+
from invenio_rdm_records.services.errors import RecordDeletedException
|
|
26
27
|
from invenio_records_resources.services.errors import PermissionDeniedError
|
|
27
28
|
from sqlalchemy.orm.exc import NoResultFound
|
|
28
29
|
|
|
@@ -224,16 +225,28 @@ def pass_file_item(is_media=False):
|
|
|
224
225
|
)
|
|
225
226
|
record_service = media_files_service if is_media else files_service
|
|
226
227
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
228
|
+
try:
|
|
229
|
+
if is_preview:
|
|
230
|
+
try:
|
|
231
|
+
item = draft_service().get_file_content(**read_kwargs)
|
|
232
|
+
except NoResultFound:
|
|
233
|
+
item = record_service().get_file_content(**read_kwargs)
|
|
234
|
+
else:
|
|
231
235
|
item = record_service().get_file_content(**read_kwargs)
|
|
232
|
-
else:
|
|
233
|
-
item = record_service().get_file_content(**read_kwargs)
|
|
234
236
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
+
kwargs["file_item"] = item
|
|
238
|
+
return f(**kwargs)
|
|
239
|
+
|
|
240
|
+
except RecordDeletedException:
|
|
241
|
+
# Redirect to the record page which has proper tombstone handling
|
|
242
|
+
return redirect(
|
|
243
|
+
url_for(
|
|
244
|
+
"invenio_app_rdm_records.record_detail",
|
|
245
|
+
pid_value=pid_value,
|
|
246
|
+
),
|
|
247
|
+
# Use 302 (temporary) instead of 301 since records can be restored
|
|
248
|
+
code=302,
|
|
249
|
+
)
|
|
237
250
|
|
|
238
251
|
return view
|
|
239
252
|
|
|
@@ -358,7 +371,8 @@ def pass_draft_community(f):
|
|
|
358
371
|
comid = request.args.get("community")
|
|
359
372
|
if comid:
|
|
360
373
|
community = current_communities.service.read(id_=comid, identity=g.identity)
|
|
361
|
-
kwargs["community"] =
|
|
374
|
+
kwargs["community"] = community
|
|
375
|
+
kwargs["community_ui"] = UICommunityJSONSerializer().dump_obj(
|
|
362
376
|
community.to_dict()
|
|
363
377
|
)
|
|
364
378
|
|
|
@@ -15,6 +15,9 @@ from copy import deepcopy
|
|
|
15
15
|
|
|
16
16
|
from flask import current_app, g, redirect
|
|
17
17
|
from flask_login import login_required
|
|
18
|
+
from invenio_communities.communities.resources.serializer import (
|
|
19
|
+
UICommunityJSONSerializer,
|
|
20
|
+
)
|
|
18
21
|
from invenio_communities.errors import CommunityDeletedError
|
|
19
22
|
from invenio_communities.proxies import current_communities
|
|
20
23
|
from invenio_communities.views.communities import render_community_theme_template
|
|
@@ -446,7 +449,7 @@ def new_record():
|
|
|
446
449
|
@login_required
|
|
447
450
|
@no_cache_response
|
|
448
451
|
@pass_draft_community
|
|
449
|
-
def deposit_create(community=None):
|
|
452
|
+
def deposit_create(community=None, community_ui=None):
|
|
450
453
|
"""Create a new deposit."""
|
|
451
454
|
can_create = current_rdm_records.records_service.check_permission(
|
|
452
455
|
g.identity, "create"
|
|
@@ -456,7 +459,7 @@ def deposit_create(community=None):
|
|
|
456
459
|
|
|
457
460
|
community_theme = None
|
|
458
461
|
if community is not None:
|
|
459
|
-
community_theme =
|
|
462
|
+
community_theme = community_ui.get("theme", {})
|
|
460
463
|
|
|
461
464
|
community_use_jinja_header = bool(community_theme)
|
|
462
465
|
dashboard_routes = current_app.config["APP_RDM_USER_DASHBOARD_ROUTES"]
|
|
@@ -479,9 +482,10 @@ def deposit_create(community=None):
|
|
|
479
482
|
searchbar_config=dict(searchUrl=get_search_url()),
|
|
480
483
|
record=new_record(),
|
|
481
484
|
community=community,
|
|
485
|
+
community_ui=community_ui,
|
|
482
486
|
community_use_jinja_header=community_use_jinja_header,
|
|
483
487
|
files=dict(default_preview=None, entries=[], links={}),
|
|
484
|
-
preselectedCommunity=
|
|
488
|
+
preselectedCommunity=community_ui,
|
|
485
489
|
files_locked=False,
|
|
486
490
|
permissions=get_record_permissions(
|
|
487
491
|
[
|
|
@@ -517,6 +521,7 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
|
|
|
517
521
|
ui_serializer = UIJSONSerializer()
|
|
518
522
|
record = ui_serializer.dump_obj(draft.to_dict())
|
|
519
523
|
|
|
524
|
+
community_ui = None
|
|
520
525
|
community_theme = None
|
|
521
526
|
community = record.get("expanded", {}).get("parent", {}).get("review", {}).get(
|
|
522
527
|
"receiver"
|
|
@@ -531,6 +536,7 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
|
|
|
531
536
|
id_=community["id"], identity=g.identity
|
|
532
537
|
)
|
|
533
538
|
community_theme = community.to_dict().get("theme", {})
|
|
539
|
+
community_ui = UICommunityJSONSerializer().dump_obj(community.to_dict())
|
|
534
540
|
except CommunityDeletedError:
|
|
535
541
|
pass
|
|
536
542
|
|
|
@@ -573,6 +579,7 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
|
|
|
573
579
|
forms_config=form_config,
|
|
574
580
|
record=record,
|
|
575
581
|
community=community,
|
|
582
|
+
community_ui=community_ui,
|
|
576
583
|
community_use_jinja_header=community_use_jinja_header,
|
|
577
584
|
files=files_dict,
|
|
578
585
|
searchbar_config=dict(searchUrl=get_search_url()),
|
|
@@ -216,19 +216,13 @@ def record_detail(
|
|
|
216
216
|
if record is not None and emitter is not None:
|
|
217
217
|
emitter(current_app, record=record._record, via_api=False)
|
|
218
218
|
|
|
219
|
-
record_owner = (
|
|
220
|
-
record_ui.get("expanded", {})
|
|
221
|
-
.get("parent", {})
|
|
222
|
-
.get("access", {})
|
|
223
|
-
.get("owned_by", {})
|
|
224
|
-
)
|
|
225
219
|
resolved_community, _ = get_record_community(record_ui)
|
|
226
|
-
|
|
220
|
+
resolved_community_ui = (
|
|
227
221
|
UICommunityJSONSerializer().dump_obj(resolved_community.to_dict())
|
|
228
222
|
if resolved_community
|
|
229
223
|
else None
|
|
230
224
|
)
|
|
231
|
-
theme =
|
|
225
|
+
theme = resolved_community_ui.get("theme", {}) if resolved_community else None
|
|
232
226
|
|
|
233
227
|
return render_community_theme_template(
|
|
234
228
|
current_app.config.get("APP_RDM_RECORD_LANDING_PAGE_TEMPLATE"),
|
|
@@ -256,11 +250,9 @@ def record_detail(
|
|
|
256
250
|
include_deleted=include_deleted,
|
|
257
251
|
is_draft=is_draft,
|
|
258
252
|
community=resolved_community,
|
|
253
|
+
community_ui=resolved_community_ui,
|
|
259
254
|
external_resources=get_external_resources(record),
|
|
260
255
|
user_avatar=avatar,
|
|
261
|
-
record_owner_id=(
|
|
262
|
-
record_owner.get("id")
|
|
263
|
-
), # record created with system_identity have not owners e.g demo
|
|
264
256
|
)
|
|
265
257
|
|
|
266
258
|
|
|
@@ -275,6 +275,9 @@ def community_dashboard_request_view(request, community, community_ui, **kwargs)
|
|
|
275
275
|
permissions = community.has_permissions_to(
|
|
276
276
|
["update", "read", "search_requests", "search_invites", "submit_record"]
|
|
277
277
|
)
|
|
278
|
+
request_permissions = request.has_permissions_to(["action_accept"])
|
|
279
|
+
# Add request specific permissions so that reviewers can be selected from community curators
|
|
280
|
+
permissions.update(request_permissions)
|
|
278
281
|
|
|
279
282
|
if is_draft_submission or is_record_inclusion:
|
|
280
283
|
topic = _resolve_topic_record(request)
|
|
@@ -24,6 +24,14 @@ export class ViewRecentChanges extends Component {
|
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
componentDidMount() {
|
|
28
|
+
this.fetchPreviousRevision();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
componentWillUnmount() {
|
|
32
|
+
this.cancellableAction && this.cancellableAction.cancel();
|
|
33
|
+
}
|
|
34
|
+
|
|
27
35
|
async fetchPreviousRevision() {
|
|
28
36
|
const { resource } = this.props;
|
|
29
37
|
const {
|
|
@@ -60,14 +68,6 @@ export class ViewRecentChanges extends Component {
|
|
|
60
68
|
}
|
|
61
69
|
}
|
|
62
70
|
|
|
63
|
-
componentDidMount() {
|
|
64
|
-
this.fetchPreviousRevision();
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
componentWillUnmount() {
|
|
68
|
-
this.cancellableAction && this.cancellableAction.cancel();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
71
|
handleModalClose = () => {
|
|
72
72
|
const { actionCancelCallback } = this.props;
|
|
73
73
|
actionCancelCallback();
|
|
@@ -24,20 +24,6 @@ export class RevisionsDiffViewer extends Component {
|
|
|
24
24
|
ignoreCaseForKey: false,
|
|
25
25
|
recursiveEqual: true,
|
|
26
26
|
});
|
|
27
|
-
|
|
28
|
-
this.viewerProps = {
|
|
29
|
-
indent: 4,
|
|
30
|
-
lineNumbers: true,
|
|
31
|
-
highlightInlineDiff: true,
|
|
32
|
-
inlineDiffOptions: {
|
|
33
|
-
mode: "word",
|
|
34
|
-
wordSeparator: " ",
|
|
35
|
-
},
|
|
36
|
-
hideUnchangedLines: true,
|
|
37
|
-
syntaxHighlight: false,
|
|
38
|
-
virtual: true,
|
|
39
|
-
};
|
|
40
|
-
|
|
41
27
|
this.state = {
|
|
42
28
|
currentDiff: undefined,
|
|
43
29
|
};
|
|
@@ -58,13 +44,13 @@ export class RevisionsDiffViewer extends Component {
|
|
|
58
44
|
};
|
|
59
45
|
|
|
60
46
|
render() {
|
|
61
|
-
const { currentDiff } = this.state;
|
|
47
|
+
const { currentDiff, viewerProps } = this.state;
|
|
62
48
|
|
|
63
49
|
return currentDiff ? (
|
|
64
50
|
<Grid>
|
|
65
51
|
<Grid.Column width={16}>
|
|
66
52
|
<Container fluid>
|
|
67
|
-
<Viewer diff={currentDiff} {...
|
|
53
|
+
<Viewer diff={currentDiff} {...viewerProps} />
|
|
68
54
|
</Container>
|
|
69
55
|
</Grid.Column>
|
|
70
56
|
</Grid>
|
|
@@ -79,4 +65,16 @@ RevisionsDiffViewer.propTypes = {
|
|
|
79
65
|
|
|
80
66
|
RevisionsDiffViewer.defaultProps = {
|
|
81
67
|
diff: {},
|
|
68
|
+
viewerProps: {
|
|
69
|
+
indent: 4,
|
|
70
|
+
lineNumbers: true,
|
|
71
|
+
highlightInlineDiff: true,
|
|
72
|
+
inlineDiffOptions: {
|
|
73
|
+
mode: "word",
|
|
74
|
+
wordSeparator: " ",
|
|
75
|
+
},
|
|
76
|
+
hideUnchangedLines: true,
|
|
77
|
+
syntaxHighlight: false,
|
|
78
|
+
virtual: true,
|
|
79
|
+
},
|
|
82
80
|
};
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* This file is part of Invenio.
|
|
3
|
-
* Copyright (C) 2023 CERN.
|
|
3
|
+
* Copyright (C) 2023-2025 CERN.
|
|
4
4
|
*
|
|
5
5
|
* Invenio is free software; you can redistribute it and/or modify it
|
|
6
6
|
* under the terms of the MIT License; see LICENSE file for more details.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { last } from "lodash";
|
|
10
9
|
import _get from "lodash/get";
|
|
11
10
|
|
|
12
11
|
const APIRoutesGenerators = {
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/CommunitiesManagement.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// This file is part of InvenioRDM
|
|
2
|
-
// Copyright (C) 2023-
|
|
2
|
+
// Copyright (C) 2023-2025 CERN.
|
|
3
3
|
//
|
|
4
4
|
// Invenio App RDM is free software; you can redistribute it and/or modify it
|
|
5
5
|
// under the terms of the MIT License; see LICENSE file for more details.
|
|
@@ -135,7 +135,7 @@ export class CommunitiesManagement extends Component {
|
|
|
135
135
|
successActionCallback={this.handleRefresh}
|
|
136
136
|
recordCommunityEndpoint={recordCommunityEndpoint}
|
|
137
137
|
permissions={permissions}
|
|
138
|
-
|
|
138
|
+
recordParent={record.parent}
|
|
139
139
|
/>
|
|
140
140
|
|
|
141
141
|
{!loading && communities?.length > MAX_COMMUNITIES && (
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCitationField.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// This file is part of InvenioRDM
|
|
2
|
-
// Copyright (C) 2021-
|
|
2
|
+
// Copyright (C) 2021-2025 CERN.
|
|
3
3
|
// Copyright (C) 2021 Graz University of Technology.
|
|
4
4
|
// Copyright (C) 2021 TU Wien
|
|
5
5
|
//
|
|
@@ -28,18 +28,18 @@ export class RecordCitationField extends Component {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
componentDidMount() {
|
|
31
|
-
const {
|
|
32
|
-
this.getCitation(
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
componentWillUnmount() {
|
|
36
|
-
this.cancellableFetchCitation?.cancel();
|
|
31
|
+
const { recordLinks, defaultStyle, includeDeleted } = this.props;
|
|
32
|
+
this.getCitation(recordLinks, defaultStyle, includeDeleted);
|
|
37
33
|
}
|
|
38
34
|
|
|
39
35
|
async componentDidUpdate() {
|
|
40
36
|
await window.MathJax?.typesetPromise();
|
|
41
37
|
}
|
|
42
38
|
|
|
39
|
+
componentWillUnmount() {
|
|
40
|
+
this.cancellableFetchCitation?.cancel();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
43
|
placeholderLoader = () => {
|
|
44
44
|
return (
|
|
45
45
|
<Placeholder>
|
|
@@ -56,9 +56,9 @@ export class RecordCitationField extends Component {
|
|
|
56
56
|
return <Message negative>{message}</Message>;
|
|
57
57
|
};
|
|
58
58
|
|
|
59
|
-
fetchCitation = async (
|
|
59
|
+
fetchCitation = async (recordLinks, style, includeDeleted) => {
|
|
60
60
|
const includeDeletedParam = includeDeleted === true ? "&include_deleted=1" : "";
|
|
61
|
-
const url = `${
|
|
61
|
+
const url = `${recordLinks.self}?locale=${navigator.language}&style=${style}${includeDeletedParam}`;
|
|
62
62
|
return await http.get(url, {
|
|
63
63
|
headers: {
|
|
64
64
|
Accept: "text/x-bibliography",
|
|
@@ -66,7 +66,7 @@ export class RecordCitationField extends Component {
|
|
|
66
66
|
});
|
|
67
67
|
};
|
|
68
68
|
|
|
69
|
-
getCitation = async (
|
|
69
|
+
getCitation = async (recordLinks, style, includeDeleted) => {
|
|
70
70
|
this.setState({
|
|
71
71
|
loading: true,
|
|
72
72
|
citation: "",
|
|
@@ -74,7 +74,7 @@ export class RecordCitationField extends Component {
|
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
this.cancellableFetchCitation = withCancel(
|
|
77
|
-
this.fetchCitation(
|
|
77
|
+
this.fetchCitation(recordLinks, style, includeDeleted)
|
|
78
78
|
);
|
|
79
79
|
|
|
80
80
|
try {
|
|
@@ -95,7 +95,7 @@ export class RecordCitationField extends Component {
|
|
|
95
95
|
};
|
|
96
96
|
|
|
97
97
|
render() {
|
|
98
|
-
const { styles,
|
|
98
|
+
const { styles, recordLinks, defaultStyle, includeDeleted } = this.props;
|
|
99
99
|
const { loading, citation, error } = this.state;
|
|
100
100
|
const citationOptions = styles.map((style) => {
|
|
101
101
|
return {
|
|
@@ -140,7 +140,8 @@ export class RecordCitationField extends Component {
|
|
|
140
140
|
options={citationOptions}
|
|
141
141
|
selection
|
|
142
142
|
onChange={_debounce(
|
|
143
|
-
(event, data) =>
|
|
143
|
+
(event, data) =>
|
|
144
|
+
this.getCitation(recordLinks, data.value, includeDeleted),
|
|
144
145
|
500
|
|
145
146
|
)}
|
|
146
147
|
/>
|
|
@@ -155,7 +156,7 @@ export class RecordCitationField extends Component {
|
|
|
155
156
|
|
|
156
157
|
RecordCitationField.propTypes = {
|
|
157
158
|
styles: PropTypes.array.isRequired,
|
|
158
|
-
|
|
159
|
+
recordLinks: PropTypes.object.isRequired,
|
|
159
160
|
defaultStyle: PropTypes.string.isRequired,
|
|
160
161
|
includeDeleted: PropTypes.bool.isRequired,
|
|
161
162
|
};
|