invenio-app-rdm 13.0.0rc4__py2.py3-none-any.whl → 13.0.0rc7__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 (58) hide show
  1. invenio_app_rdm/__init__.py +1 -1
  2. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/doi.html +7 -5
  3. invenio_app_rdm/records_ui/views/filters.py +1 -1
  4. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CopyButton.js +38 -19
  5. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ExportDropdown.js +7 -2
  6. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/theme.js +4 -0
  7. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/theme.js +9 -0
  8. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides +6 -1
  9. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/macros/records_list.html +2 -1
  10. invenio_app_rdm/theme/templates/semantic-ui/invenio_communities/default_static_page.html +26 -0
  11. invenio_app_rdm/theme/webpack.py +0 -1
  12. invenio_app_rdm/upgrade_scripts/migrate_12_0_to_13_0.py +94 -65
  13. {invenio_app_rdm-13.0.0rc4.dist-info → invenio_app_rdm-13.0.0rc7.dist-info}/METADATA +24 -2
  14. {invenio_app_rdm-13.0.0rc4.dist-info → invenio_app_rdm-13.0.0rc7.dist-info}/RECORD +18 -57
  15. {invenio_app_rdm-13.0.0rc4.dist-info → invenio_app_rdm-13.0.0rc7.dist-info}/top_level.txt +0 -1
  16. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/i18next-scanner.config.js +0 -64
  17. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/package-lock.json +0 -2129
  18. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/compileCatalog.js +0 -118
  19. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/fixTrailingNewlines.js +0 -23
  20. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/initCatalog.js +0 -20
  21. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/postExtractMessages.js +0 -36
  22. tests/__init__.py +0 -8
  23. tests/api/__init__.py +0 -8
  24. tests/api/conftest.py +0 -24
  25. tests/api/test_protect_files_rest.py +0 -73
  26. tests/api/test_record_api.py +0 -175
  27. tests/api/test_stats_api.py +0 -26
  28. tests/conftest.py +0 -390
  29. tests/fixtures/__init__.py +0 -8
  30. tests/fixtures/app_data/oai_sets.yaml +0 -3
  31. tests/fixtures/app_data/pages/about.html +0 -1
  32. tests/fixtures/app_data/pages.yaml +0 -4
  33. tests/fixtures/conftest.py +0 -27
  34. tests/fixtures/test_cli.py +0 -25
  35. tests/fixtures/test_fixtures.py +0 -46
  36. tests/mock_module/__init__.py +0 -7
  37. tests/mock_module/templates/mock_mail.html +0 -27
  38. tests/mock_module/views.py +0 -32
  39. tests/redirector/__init__.py +0 -8
  40. tests/redirector/conftest.py +0 -54
  41. tests/redirector/test_redirector.py +0 -28
  42. tests/test_tasks.py +0 -209
  43. tests/test_utils.py +0 -67
  44. tests/test_version.py +0 -16
  45. tests/test_views.py +0 -43
  46. tests/ui/__init__.py +0 -8
  47. tests/ui/conftest.py +0 -115
  48. tests/ui/test_deposits.py +0 -115
  49. tests/ui/test_export_formats.py +0 -37
  50. tests/ui/test_file_download.py +0 -73
  51. tests/ui/test_filters.py +0 -10
  52. tests/ui/test_robotstxt.py +0 -35
  53. tests/ui/test_signposting_ui.py +0 -95
  54. tests/ui/test_sitemaps.py +0 -85
  55. tests/ui/test_stats_ui.py +0 -92
  56. {invenio_app_rdm-13.0.0rc4.dist-info → invenio_app_rdm-13.0.0rc7.dist-info}/WHEEL +0 -0
  57. {invenio_app_rdm-13.0.0rc4.dist-info → invenio_app_rdm-13.0.0rc7.dist-info}/entry_points.txt +0 -0
  58. {invenio_app_rdm-13.0.0rc4.dist-info → invenio_app_rdm-13.0.0rc7.dist-info}/licenses/LICENSE +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.0rc4"
20
+ __version__ = "13.0.0rc7"
21
21
 
22
22
  __all__ = ("__version__",)
@@ -6,15 +6,17 @@
6
6
  #}
7
7
 
8
8
  {% macro show_doi(doi_value, record_ui, badge_id="record-doi-badge", modal_id="doi-modal", subheader=None, parent_doi=false) %}
9
+ {%- set doi_link = record_ui["links"]["doi"] if not parent_doi else record_ui["links"]["parent_doi"] %}
9
10
  <dt class="ui tiny header">{{_('DOI')}}
10
11
  {% if subheader %}
11
- <i><span class="doi sub header">{{subheader}}</span></i></dt>
12
+ <i><span class="doi sub header">{{subheader}}</span></i>
12
13
  {% endif %}
14
+ </dt>
13
15
  <dd>
14
- <span class="get-badge" data-toggle="tooltip" data-placement="bottom" style="cursor: pointer;"
15
- title="{{ _('Get the DOI badge!') }}">
16
- <img id='{{badge_id}}' data-target="[data-modal='{{ doi_value }}']"
16
+ <span class="get-badge details-doi-section" data-toggle="tooltip" data-placement="bottom">
17
+ <img id='{{badge_id}}' data-target="[data-modal='{{ doi_value }}']" title="{{ _('Get the DOI badge!') }}"
17
18
  src="{{ url_for('invenio_formatter_badges.badge', title='DOI', value=doi_value, ext='svg') }}" alt="{{ doi_value }}" />
19
+ <div id="copy-button-{{ badge_id }}" class="copy-doi-button" data-value={{ doi_link }} data-size="mini"></div>
18
20
  </span>
19
21
 
20
22
  <div id="{{modal_id}}" class="ui modal fade badge-modal" data-modal="{{ doi_value }}">
@@ -27,7 +29,7 @@
27
29
  <pre>{{ doi_value }}</pre>
28
30
  </h4>
29
31
  {% from "semantic-ui/invenio_formatter/macros/badges.html" import badges_formats_list %}
30
- {{ badges_formats_list(url_for('invenio_formatter_badges.badge', title='DOI', value=doi_value, ext='svg', _external=True, _scheme='https'), record_ui["links"]["parent_doi"] if parent_doi else record_ui["links"]["doi"]) }}
32
+ {{ badges_formats_list(url_for('invenio_formatter_badges.badge', title='DOI', value=doi_value, ext='svg', _external=True, _scheme='https'), doi_link) }}
31
33
  </div>
32
34
  </div>
33
35
  </dd>
@@ -207,6 +207,6 @@ def transform_record(record, serializer, module=None, throws=True, **kwargs):
207
207
  if throws:
208
208
  raise Exception("No serializer found.")
209
209
  except Exception:
210
- current_app.logger.error("Record transformation failed.")
210
+ current_app.logger.exception("Record transformation failed.")
211
211
  if throws:
212
212
  raise
@@ -7,29 +7,38 @@
7
7
  import React, { Component } from "react";
8
8
  import PropTypes from "prop-types";
9
9
  import { Button, Popup } from "semantic-ui-react";
10
- import { CopyToClipboard } from "react-copy-to-clipboard";
11
10
  import { i18next } from "@translations/invenio_app_rdm/i18next";
12
11
 
13
12
  class SimpleCopyButton extends React.Component {
13
+ fetchUrl = async (url) => {
14
+ return await (await fetch(url)).text();
15
+ };
16
+
17
+ handleClick = async () => {
18
+ const { url, text, onCopy } = this.props;
19
+ let textToCopy = text;
20
+ if (url) {
21
+ textToCopy = await this.fetchUrl(url);
22
+ }
23
+
24
+ await navigator.clipboard.writeText(textToCopy);
25
+ onCopy(text);
26
+ };
27
+
14
28
  render() {
15
- const { text, onCopy, hoverState } = this.props;
29
+ const { hoverState, size } = this.props;
16
30
 
17
31
  return (
18
- <CopyToClipboard
19
- text={text}
20
- onCopy={() => {
21
- onCopy(text);
22
- }}
23
- >
24
- <Button
25
- className="copy"
26
- basic
27
- icon="copy"
28
- aria-label={i18next.t("Copy to clipboard")}
29
- onMouseEnter={hoverState}
30
- onMouseLeave={hoverState}
31
- />
32
- </CopyToClipboard>
32
+ <Button
33
+ className="copy"
34
+ basic
35
+ size={size}
36
+ icon="copy"
37
+ aria-label={i18next.t("Copy to clipboard")}
38
+ onClick={this.handleClick} // Handle click to fetch from url if url passed, otherwise use text from props
39
+ onMouseEnter={hoverState}
40
+ onMouseLeave={hoverState}
41
+ />
33
42
  );
34
43
  }
35
44
  }
@@ -37,11 +46,15 @@ class SimpleCopyButton extends React.Component {
37
46
  SimpleCopyButton.propTypes = {
38
47
  text: PropTypes.string.isRequired,
39
48
  onCopy: PropTypes.func.isRequired,
49
+ url: PropTypes.func,
40
50
  hoverState: PropTypes.func,
51
+ size: PropTypes.string,
41
52
  };
42
53
 
43
54
  SimpleCopyButton.defaultProps = {
44
55
  hoverState: null,
56
+ url: null,
57
+ size: "medium",
45
58
  };
46
59
 
47
60
  export class CopyButton extends Component {
@@ -86,12 +99,12 @@ export class CopyButton extends Component {
86
99
  };
87
100
 
88
101
  render() {
89
- const { text, popUpPosition } = this.props;
102
+ const { popUpPosition, text, url, size } = this.props;
90
103
  const { confirmationPopupMsg, confirmationPopupIsOpen, hoverPopupIsOpen } =
91
104
  this.state;
92
105
 
93
106
  return (
94
- text && (
107
+ (text || url) && ( // Ensure text or url is provided
95
108
  <Popup
96
109
  role="alert"
97
110
  open={hoverPopupIsOpen || confirmationPopupIsOpen}
@@ -103,7 +116,9 @@ export class CopyButton extends Component {
103
116
  <SimpleCopyButton
104
117
  text={text}
105
118
  onCopy={this.onCopy}
119
+ url={url}
106
120
  hoverState={this.hoverStateHandler}
121
+ size={size}
107
122
  />
108
123
  }
109
124
  />
@@ -115,9 +130,13 @@ export class CopyButton extends Component {
115
130
  CopyButton.propTypes = {
116
131
  popUpPosition: PropTypes.string,
117
132
  text: PropTypes.string,
133
+ url: PropTypes.func,
134
+ size: PropTypes.string,
118
135
  };
119
136
 
120
137
  CopyButton.defaultProps = {
121
138
  popUpPosition: "right center",
122
139
  text: "",
140
+ url: "",
141
+ size: "medium",
123
142
  };
@@ -9,6 +9,7 @@ import React, { Component } from "react";
9
9
  import PropTypes from "prop-types";
10
10
  import { Grid, Dropdown, Button } from "semantic-ui-react";
11
11
  import { i18next } from "@translations/invenio_app_rdm/i18next";
12
+ import { CopyButton } from "@js/invenio_app_rdm/components/CopyButton";
12
13
 
13
14
  export class ExportDropdown extends Component {
14
15
  constructor(props) {
@@ -18,6 +19,7 @@ export class ExportDropdown extends Component {
18
19
  selectedFormatUrl: formats[0]?.export_url,
19
20
  };
20
21
  }
22
+
21
23
  render() {
22
24
  const { formats } = this.props;
23
25
  const { selectedFormatUrl } = this.state;
@@ -31,7 +33,7 @@ export class ExportDropdown extends Component {
31
33
 
32
34
  return (
33
35
  <Grid>
34
- <Grid.Column width={11}>
36
+ <Grid.Column width={10}>
35
37
  <Dropdown
36
38
  aria-label={i18next.t("Export selection")}
37
39
  selection
@@ -42,7 +44,7 @@ export class ExportDropdown extends Component {
42
44
  defaultValue={selectedFormatUrl}
43
45
  />
44
46
  </Grid.Column>
45
- <Grid.Column width={5} className="pl-0">
47
+ <Grid.Column width={4} className="pl-0">
46
48
  <Button
47
49
  as="a"
48
50
  role="button"
@@ -53,6 +55,9 @@ export class ExportDropdown extends Component {
53
55
  {i18next.t("Export")}
54
56
  </Button>
55
57
  </Grid.Column>
58
+ <Grid.Column width={2} className="pl-0">
59
+ <CopyButton url={selectedFormatUrl} />
60
+ </Grid.Column>
56
61
  </Grid>
57
62
  );
58
63
  }
@@ -12,6 +12,10 @@ $("#record-doi-badge").on("click", function () {
12
12
  $("#doi-modal").modal("show");
13
13
  });
14
14
 
15
+ $("#record-conceptdoi-badge").on("click", function () {
16
+ $("#conceptdoi-modal").modal("show");
17
+ });
18
+
15
19
  $(".preview-link").on("click", function (event) {
16
20
  $("#preview-file-title").html(event.target.dataset.fileKey);
17
21
  });
@@ -7,6 +7,7 @@
7
7
 
8
8
  import $ from "jquery";
9
9
  import { MultipleOptionsSearchBar } from "@js/invenio_search_ui/components";
10
+ import { CopyButton } from "@js/invenio_app_rdm/components/CopyButton";
10
11
  import { i18next } from "@translations/invenio_app_rdm/i18next";
11
12
  import ReactDOM from "react-dom";
12
13
  import React from "react";
@@ -153,3 +154,11 @@ if (window.invenio) {
153
154
  }
154
155
  };
155
156
  }
157
+
158
+ // Copy Buttons for DOI
159
+ document.querySelectorAll(".copy-doi-button").forEach((element) => {
160
+ ReactDOM.render(
161
+ <CopyButton text={element.dataset.value} size={element.dataset.size} />,
162
+ element
163
+ );
164
+ });
@@ -553,4 +553,9 @@ dl.details-list {
553
553
  }
554
554
  }
555
555
 
556
-
556
+ .details-doi-section {
557
+ cursor: pointer;
558
+ display: flex;
559
+ align-items: center;
560
+ justify-content: space-between;
561
+ }
@@ -45,5 +45,6 @@
45
45
  {% endfor %}
46
46
  </div>
47
47
 
48
- {{ webpack["invenio-app-rdm-frontpage.js"]}}
48
+ {{ webpack['overridable-registry.js'] }}
49
+ {{ webpack['invenio-app-rdm-frontpage.js']}}
49
50
  {% endmacro %}
@@ -0,0 +1,26 @@
1
+ {# -*- coding: utf-8 -*-
2
+
3
+ This file is part of Invenio.
4
+ Copyright (C) 2025 CERN.
5
+
6
+ Invenio 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
+
10
+ {% extends "invenio_communities/base.html" %}
11
+
12
+ {% set title = page.title %}
13
+ {% set community_menu_active = True %}
14
+
15
+ {% block page_body %}
16
+ {% include "invenio_communities/details/header.html" %}
17
+ <div class="ui container rel-mt-2">
18
+ <div class="row">
19
+ <div class="col-xs-12 rich-input-content">
20
+ {% block content %}
21
+ {{ page.content|safe }}
22
+ {% endblock %}
23
+ </div>
24
+ </div>
25
+ </div>
26
+ {% endblock %}
@@ -52,7 +52,6 @@ theme = WebpackThemeBundle(
52
52
  "luxon": "^1.23.0",
53
53
  "path": "^0.12.7",
54
54
  "prop-types": "^15.7.2",
55
- "react-copy-to-clipboard": "^5.0.0",
56
55
  "react-dnd": "^11.1.0",
57
56
  "react-dnd-html5-backend": "^11.1.0",
58
57
  "react-dropzone": "^11.0.0",
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  # Copyright (C) 2023-2024 CERN.
4
- # Copyright (C) 2024 Graz University of Technology.
4
+ # Copyright (C) 2024-2025 Graz University of Technology.
5
5
  #
6
6
  # Invenio-App-RDM is free software; you can redistribute it and/or modify
7
7
  # it under the terms of the MIT License; see LICENSE file for more details.
@@ -20,86 +20,115 @@ This script has been tested with following data:
20
20
  - internal_notes
21
21
  """
22
22
 
23
- import sys
24
-
25
23
  from click import secho
24
+ from invenio_access.permissions import system_identity
26
25
  from invenio_db import db
27
- from invenio_rdm_records.records.api import RDMDraft, RDMRecord
28
-
29
-
30
- def execute_upgrade():
31
- """Execute the upgrade from InvenioRDM 12.0 to 13.0.0.
32
-
33
- Please read the disclaimer on this module before thinking about executing
34
- this function!
35
- THIS MODULE IS WORK IN PROGRESS, UNTIL official v13 release
36
- """
26
+ from invenio_rdm_records.proxies import current_rdm_records_service as records_service
27
+ from invenio_search.engine import dsl
28
+
29
+
30
+ def run_upgrade(has, migrate):
31
+ """Run upgrade."""
32
+ record_success_counter = 0
33
+ record_error_counter = 0
34
+ draft_success_counter = 0
35
+ draft_error_counter = 0
36
+
37
+ # Handle published records
38
+ published_records = records_service.search(
39
+ system_identity,
40
+ params={"allversions": True, "include_deleted": True},
41
+ extra_filter=has,
42
+ )
43
+ for result in published_records.hits:
44
+ record = records_service.record_cls.pid.resolve(result["id"])
45
+ try:
46
+ migrate(record)
47
+ record_success_counter += 1
48
+ except Exception as error:
49
+ secho(f"> Error {repr(error)}", fg="red")
50
+ error = f"Record {record.pid.pid_value} failed to update"
51
+ record_error_counter += 1
52
+
53
+ # Handle draft records
54
+ draft_records = records_service.search_drafts(
55
+ system_identity,
56
+ params={"allversions": True},
57
+ extra_filter=has,
58
+ )
59
+ for result in draft_records.hits:
60
+ draft = records_service.draft_cls.pid.resolve(
61
+ result["id"],
62
+ registered_only=False,
63
+ )
64
+ try:
65
+ migrate(draft)
66
+ draft_success_counter += 1
67
+ except Exception as error:
68
+ secho(f"> Error {repr(error)}", fg="red")
69
+ error = f"Draft {draft.pid.pid_value} failed to update"
70
+ draft_error_counter += 1
71
+
72
+ if draft_error_counter > 0 or record_error_counter > 0:
73
+ db.session.rollback()
74
+ secho(
75
+ f"{record_error_counter} records had failures and {draft_error_counter} drafts had failures",
76
+ fg="red",
77
+ )
78
+ secho(
79
+ "The changes have been rolled back. Please fix the above listed errors and try the upgrade again",
80
+ fg="yellow",
81
+ err=True,
82
+ )
83
+ elif draft_success_counter > 0 or record_success_counter > 0:
84
+ db.session.commit()
85
+ secho(
86
+ f"{record_success_counter} records have been updated and {draft_error_counter} drafts have been updated",
87
+ fg="green",
88
+ )
89
+ else:
90
+ secho("nothing has been updated")
37
91
 
38
- def update_record(record):
39
- # skipping deleted records because can't be committed
40
- if record.is_deleted:
41
- return
42
92
 
43
- try:
44
- secho(f"Updating record : {record.pid.pid_value}", fg="yellow")
93
+ def run_upgrade_for_thesis():
94
+ """Run upgrade for thesis."""
45
95
 
46
- # TODO: Add any record datamodel migration code here
47
- record.commit()
96
+ def migrate_thesis_university(record_or_draft):
97
+ custom_fields = record_or_draft.get("custom_fields", {})
98
+ university = custom_fields.get("thesis:university")
99
+ if university and "thesis:thesis" not in custom_fields:
100
+ custom_fields["thesis:thesis"] = {"university": university}
48
101
 
49
- secho(f"> Updated parent: {record.parent.pid.pid_value}", fg="green")
50
- secho(f"> Updated record: {record.pid.pid_value}\n", fg="green")
51
- return None
52
- except Exception as e:
53
- secho(f"> Error {repr(e)}", fg="red")
54
- error = f"Record {record.pid.pid_value} failed to update"
55
- return error
102
+ record_or_draft.commit()
56
103
 
57
- secho("Starting data migration...", fg="green")
104
+ # Common query filter
105
+ has_thesis = dsl.Q("exists", field="custom_fields.thesis:university")
58
106
 
59
- # Migrating records and drafts
60
- errors = []
61
- for record_metadata in RDMRecord.model_cls.query.all():
62
- record = RDMRecord(record_metadata.data, model=record_metadata)
63
- error = update_record(record)
107
+ secho("run upgrade for thesis has been started", fg="green")
64
108
 
65
- if error:
66
- errors.append(error)
109
+ run_upgrade(has_thesis, migrate_thesis_university)
67
110
 
68
- for draft_metadata in RDMDraft.model_cls.query.all():
69
- draft = RDMDraft(draft_metadata.data, model=draft_metadata)
70
- error = update_record(draft)
71
- if error:
72
- errors.append(error)
111
+ secho("run upgrade for thesis has been finished", fg="green")
73
112
 
74
- success = not errors
75
113
 
76
- if success:
77
- secho("Commiting to DB", nl=True)
78
- db.session.commit()
79
- secho(
80
- "Data migration completed, please rebuild the search indices now.",
81
- fg="green",
82
- )
114
+ def execute_upgrade():
115
+ """Execute the upgrade from InvenioRDM 12.0 to 13.0.0.
83
116
 
84
- else:
85
- secho("Rollback", nl=True)
86
- db.session.rollback()
87
- secho(
88
- "Upgrade aborted due to the following errors:",
89
- fg="red",
90
- err=True,
91
- )
117
+ Please read the disclaimer on this module before thinking about executing
118
+ this function!
119
+ THIS MODULE IS WORK IN PROGRESS, UNTIL official v13 release
92
120
 
93
- for error in errors:
94
- secho(error, fg="red", err=True)
121
+ NOTE:
122
+ since the data upgrade steps are more selective now, the approach how to do
123
+ it has been changed. now the records/drafts which should be updated are
124
+ searched by a filter and then the updates are applied to those
125
+ records/drafts explicitly. this should improve speed and should make it
126
+ easier to upgrade large instances
95
127
 
96
- msg = (
97
- "The changes have been rolled back. "
98
- "Please fix the above listed errors and try the upgrade again",
99
- )
100
- secho(msg, fg="yellow", err=True)
128
+ """
129
+ secho("Starting data migration...", fg="green")
101
130
 
102
- sys.exit(1)
131
+ run_upgrade_for_thesis()
103
132
 
104
133
 
105
134
  # if the script is executed on its own, perform the upgrade
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: invenio-app-rdm
3
- Version: 13.0.0rc4
3
+ Version: 13.0.0rc7
4
4
  Summary: Invenio Research Data Management.
5
5
  Home-page: https://github.com/inveniosoftware/invenio-app-rdm
6
6
  Author: CERN
@@ -60,7 +60,7 @@ Requires-Dist: invenio-search[opensearch1]<4.0.0,>=3.0.0; extra == "opensearch1"
60
60
  Provides-Extra: opensearch2
61
61
  Requires-Dist: invenio-search[opensearch2]<4.0.0,>=3.0.0; extra == "opensearch2"
62
62
  Provides-Extra: s3
63
- Requires-Dist: invenio-s3<3.0.0,>=2.0.0; extra == "s3"
63
+ Requires-Dist: invenio-s3<4.0.0,>=3.0.0; extra == "s3"
64
64
  Dynamic: license-file
65
65
 
66
66
  ..
@@ -101,6 +101,28 @@ https://inveniordm.docs.cern.ch
101
101
  Changes
102
102
  =======
103
103
 
104
+ Version v13.0.0rc7 (released 2025-07-22)
105
+
106
+ - fix: license due to copy pasting
107
+ - fix: import `overridable-registry.js` in `records_list` macro
108
+ - templates: added default_static_page for communties
109
+ - ui: log serialization exceptions
110
+
111
+ Version v13.0.0rc6 (released 2025-07-21)
112
+
113
+ - fix: package.json and package-lock mismatch
114
+
115
+ Version v13.0.0rc5 (released 2025-07-17)
116
+
117
+ - migration: optimize script
118
+ - upgrade_scripts: handle thesis custom field migration
119
+ - version: bumped invenio-s3 version to include multipart upload
120
+ - templates: macros: doi: Add copy button for DOIs
121
+ - semantic-ui: components: CopyButton: add size prop
122
+ - semantic-ui: landing_page: ExportButton: Add copy button
123
+ - semantic-ui: componenets: add url fetching in copy button
124
+ - semantic-ui: landing_page: add click event for cite all versions
125
+
104
126
  Version v13.0.0rc4 (released 2025-07-10)
105
127
 
106
128
  - pid-config: cast to bool RDM_(PARENT)_PERSISTENT_IDENTIFIERS required check