|
4 | 4 | import tempfile |
5 | 5 | from datetime import datetime |
6 | 6 |
|
7 | | -from flask import abort, current_app, jsonify, make_response, redirect, render_template, request, send_file, url_for |
| 7 | +from flask import ( |
| 8 | + abort, |
| 9 | + current_app, |
| 10 | + flash, |
| 11 | + jsonify, |
| 12 | + make_response, |
| 13 | + redirect, |
| 14 | + render_template, |
| 15 | + request, |
| 16 | + send_file, |
| 17 | + url_for, |
| 18 | +) |
8 | 19 | from flask_login import current_user, login_required |
9 | 20 |
|
10 | 21 | from app.modules.apikeys.decorators import require_api_key |
11 | 22 | from app.modules.dataset import dataset_bp |
12 | 23 | from app.modules.dataset.decorators import is_dataset_owner |
13 | 24 | from app.modules.dataset.forms import DataSetForm |
14 | | -from app.modules.dataset.models import DataSet |
| 25 | +from app.modules.dataset.models import DataSet, PublicationType |
15 | 26 | from app.modules.dataset.services import ( |
16 | 27 | AuthorService, |
| 28 | + DatasetMetadataUpdateError, |
| 29 | + DatasetMetadataValidationError, |
17 | 30 | DataSetService, |
18 | 31 | DOIMappingService, |
19 | 32 | DSDownloadRecordService, |
@@ -118,6 +131,47 @@ def create_dataset(): |
118 | 131 | return render_template("dataset/create_and_edit_dataset.html", form=form) |
119 | 132 |
|
120 | 133 |
|
| 134 | +@dataset_bp.route("/dataset/edit/<int:dataset_id>", methods=["GET", "POST"]) |
| 135 | +@login_required |
| 136 | +def edit_metadata(dataset_id): |
| 137 | + dataset = dataset_service.get_or_404(dataset_id) |
| 138 | + form = DataSetForm() |
| 139 | + if dataset.user_id != current_user.id: |
| 140 | + abort(403) |
| 141 | + |
| 142 | + if request.method == "POST": |
| 143 | + is_ajax = request.headers.get("X-Requested-With") == "XMLHttpRequest" |
| 144 | + try: |
| 145 | + dataset_service.update_metadata_from_request(dataset, request.form, zenodo_service=zenodo_service) |
| 146 | + if is_ajax: |
| 147 | + return jsonify({"message": "Dataset updated successfully"}), 200 |
| 148 | + flash("Dataset updated successfully!", "success") |
| 149 | + except DatasetMetadataValidationError as exc: |
| 150 | + if is_ajax: |
| 151 | + return jsonify({"message": str(exc)}), 400 |
| 152 | + flash(str(exc), "danger") |
| 153 | + return redirect(url_for("dataset.edit_metadata", dataset_id=dataset_id)) |
| 154 | + except DatasetMetadataUpdateError as exc: |
| 155 | + if is_ajax: |
| 156 | + return jsonify({"message": f"Error updating metadata: {exc}"}), 400 |
| 157 | + flash(f"Error updating metadata: {exc}", "danger") |
| 158 | + except Exception as exc: |
| 159 | + logger.exception("[EDIT DATASET] Unexpected error updating dataset %s", dataset_id) |
| 160 | + if is_ajax: |
| 161 | + return jsonify({"message": f"Unexpected error updating metadata: {exc}"}), 400 |
| 162 | + flash(f"Unexpected error updating metadata: {exc}", "danger") |
| 163 | + |
| 164 | + return redirect(url_for("dataset.list_dataset")) |
| 165 | + |
| 166 | + return render_template( |
| 167 | + "dataset/create_and_edit_dataset.html", |
| 168 | + dataset=dataset, |
| 169 | + is_edit=True, |
| 170 | + form=form, |
| 171 | + PublicationType=PublicationType, |
| 172 | + ) |
| 173 | + |
| 174 | + |
121 | 175 | @dataset_bp.route("/datasets/list", methods=["GET"]) |
122 | 176 | @login_required |
123 | 177 | def list_dataset(): |
|
0 commit comments