From bf0b546348f1d0e59007d54d243b2b483febf95a Mon Sep 17 00:00:00 2001 From: jh-RLI Date: Thu, 9 Apr 2026 11:31:18 +0200 Subject: [PATCH 1/7] formatting --- .../static/peer_review/opr_reviewer_logic.js | 138 +++++++++++------- 1 file changed, 86 insertions(+), 52 deletions(-) diff --git a/dataedit/static/peer_review/opr_reviewer_logic.js b/dataedit/static/peer_review/opr_reviewer_logic.js index bde1ec1d0..39ffc7422 100644 --- a/dataedit/static/peer_review/opr_reviewer_logic.js +++ b/dataedit/static/peer_review/opr_reviewer_logic.js @@ -1,74 +1,108 @@ // SPDX-FileCopyrightText: 2025 Reiner Lemoine Institut // SPDX-License-Identifier: AGPL-3.0-or-later -import {current_review, getAllFieldsAndValues, getErrorMsg, showToast} from "./peer_review.js"; -import {isEmptyValue, isEffectivelyEmpty, sendJson} from "./utilities.js";import {getFieldState} from "./state_current_review.js"; +import { + current_review, + getAllFieldsAndValues, + getErrorMsg, + showToast, +} from "./peer_review.js"; +import { isEmptyValue, isEffectivelyEmpty, sendJson } from "./utilities.js"; +import { getFieldState } from "./state_current_review.js"; export function finishPeerReview() { - $('#peer_review-submitting').removeClass('d-none'); + $("#peer_review-submitting").removeClass("d-none"); var selectedBadge = $('input[name="reviewer-option"]:checked').val(); console.log(selectedBadge); current_review.badge = selectedBadge; current_review.reviewFinished = true; - let json = JSON.stringify({reviewType: 'finished', reviewData: current_review, reviewBadge: selectedBadge}); - sendJson("POST", config.url_peer_review, json).then(function() { - window.location = config.url_table; - }).catch(function(err) { - // TODO evaluate error, show user message - $('#peer_review-submitting').addClass('d-none'); - alert(getErrorMsg(err)); + let json = JSON.stringify({ + reviewType: "finished", + reviewData: current_review, + reviewBadge: selectedBadge, }); + sendJson("POST", config.url_peer_review, json) + .then(function () { + window.location = config.url_table; + }) + .catch(function (err) { + // TODO evaluate error, show user message + $("#peer_review-submitting").addClass("d-none"); + alert(getErrorMsg(err)); + }); } export function check_if_review_finished() { - if (!checkFieldStates()) { - return; - } - - if (!clientSideReviewFinished) { - clientSideReviewFinished = true; - showToast("Review completed!", "You completed the review and can now award a suitable badge!", 'success'); + if (!checkFieldStates()) { + return; + } - var reviewerDiv = $('
'); - var bronzeRadio = $(' Bronze
'); - var silverRadio = $(' Silver
'); - var goldRadio = $(' Gold
'); - var platinRadio = $(' Platin
'); - var reviewText = $('

The review is complete. Please award a badge and finish the review.

'); - var finishButton = $(''); + if (!clientSideReviewFinished) { + clientSideReviewFinished = true; + showToast( + "Review completed!", + "You completed the review and can now award a suitable badge!", + "success" + ); - reviewerDiv.append(reviewText); - reviewerDiv.append(bronzeRadio); - reviewerDiv.append(silverRadio); - reviewerDiv.append(goldRadio); - reviewerDiv.append(platinRadio); - reviewerDiv.append(finishButton); + var reviewerDiv = $( + '
' + ); + var bronzeRadio = $( + ' Bronze
' + ); + var silverRadio = $( + ' Silver
' + ); + var goldRadio = $( + ' Gold
' + ); + var platinRadio = $( + ' Platin
' + ); + var reviewText = $( + "

The review is complete. Please award a badge and finish the review.

" + ); + var finishButton = $( + '' + ); - finishButton.on('click', finishPeerReview); + reviewerDiv.append(reviewText); + reviewerDiv.append(bronzeRadio); + reviewerDiv.append(silverRadio); + reviewerDiv.append(goldRadio); + reviewerDiv.append(platinRadio); + reviewerDiv.append(finishButton); - if (!config.review_finished) { - reviewerDiv.show(); - $('#submit_summary').prop('disabled', true); - } else { - reviewerDiv.hide(); - $('#submit_summary').hide(); - $('#peer_review-save').hide(); - $('#review-window').css('visibility', 'hidden'); - } + finishButton.on("click", finishPeerReview); - $('.content-finish-review').append(reviewerDiv); + if (!config.review_finished) { + reviewerDiv.show(); + $("#submit_summary").prop("disabled", true); + } else { + reviewerDiv.hide(); + $("#submit_summary").hide(); + $("#peer_review-save").hide(); + $("#review-window").css("visibility", "hidden"); } + + $(".content-finish-review").append(reviewerDiv); + } } export function checkFieldStates() { - const allFields = getAllFieldsAndValues(); - for (const { fieldName, fieldValue } of allFields) { - console.log(fieldName, fieldValue) - if (!isEffectivelyEmpty(fieldName, fieldValue)) { - const fieldState = getFieldState(fieldName); + const allFields = getAllFieldsAndValues(); + for (const { fieldName, fieldValue } of allFields) { + console.log(fieldName, fieldValue); + if (!isEffectivelyEmpty(fieldName, fieldValue)) { + const fieldState = getFieldState(fieldName); - if (fieldState !== 'ok' && fieldState !== 'rejected' && fieldState !== 'suggestion') { - return false; - } - } + if ( + fieldState !== "ok" && + fieldState !== "rejected" && + fieldState !== "suggestion" + ) { + return false; + } } - return true; -} \ No newline at end of file + } + return true; +} From 657c84efa2310d84a8b0f13931294f613acd78b6 Mon Sep 17 00:00:00 2001 From: jh-RLI Date: Thu, 9 Apr 2026 11:36:25 +0200 Subject: [PATCH 2/7] as topics do not include draft new tables will not hold any topic information. Drop it from the frontend context --- dataedit/views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dataedit/views.py b/dataedit/views.py index 2509e50d7..91d357367 100644 --- a/dataedit/views.py +++ b/dataedit/views.py @@ -728,7 +728,7 @@ def iter_oem_key_order(metadata: dict): opr_result_context = {} if reviews.exists(): - latest_review: PeerReview = reviews.last() # type: ignore (reviews.exists()) + latest_review: PeerReview = reviews.last() # type: ignore (reviews.exists()) # noqa: E501 opr_manager.update_open_since(opr=latest_review) current_reviewer = opr_manager.load(latest_review).current_reviewer opr_context.update( @@ -1545,7 +1545,7 @@ def post(self, request: HttpRequest, table: str, review_id=None) -> HttpResponse # Set new review values and update existing review active_peer_review.review = merged_review_data - active_peer_review.reviewer = user # type: ignore TODO why type warning? + active_peer_review.reviewer = user # type: ignore TODO warning? active_peer_review.contributor = contributor # type: ignore TODO active_peer_review.update(review_type=review_post_type) else: @@ -1637,12 +1637,12 @@ def get(self, request: HttpRequest, table: str, review_id: int) -> HttpResponse: "url_table": reverse( "dataedit:view", kwargs={"table": table_obj.name} ), - "topic": table_obj.topics, + # "topic": table_obj.topics, "table": table_obj.name, } ), "table": table_obj.name, - "topic": table_obj.topics, + # "topic": table_obj.topics, "meta": metadata, "json_schema": json_schema, "field_descriptions_json": json.dumps(field_descriptions), From fb804deacfce09df47b68c208b59d2707753a1e2 Mon Sep 17 00:00:00 2001 From: jh-RLI Date: Thu, 9 Apr 2026 11:57:14 +0200 Subject: [PATCH 3/7] Use json response to avoid frontend handling issues of redirecting after submit --- dataedit/views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dataedit/views.py b/dataedit/views.py index 91d357367..d4d7d3422 100644 --- a/dataedit/views.py +++ b/dataedit/views.py @@ -1495,7 +1495,7 @@ def post(self, request: HttpRequest, table: str, review_id=None) -> HttpResponse """ table_obj = table_or_404(table=table) - context = {} + # context = {} user: login_models.myuser = request.user # type: ignore # get the review data and additional application metadata @@ -1574,7 +1574,7 @@ def post(self, request: HttpRequest, table: str, review_id=None) -> HttpResponse # TODO: also update reviewFinished in review datamodel json - return render(request, "dataedit/opr_review.html", context=context) + return JsonResponse({"status": "success"}, status=200) class TablePeerRreviewContributorView(TablePeerReviewView): @@ -1667,7 +1667,7 @@ def post(self, request: HttpRequest, table: str, review_id: int) -> HttpResponse # table_obj = table_or_404(table=table) # TODO: why unused argument "table"? - context = {} + # context = {} if request.method == "POST": review_data = json.loads(request.body) review_post_type = review_data.get("reviewType") @@ -1681,4 +1681,4 @@ def post(self, request: HttpRequest, table: str, review_id: int) -> HttpResponse current_opr.review = merged_review current_opr.update(review_type=review_post_type) - return render(request, "dataedit/opr_contributor.html", context=context) + return JsonResponse({"status": "success"}, status=200) From d656bd5d7b8509e4f8f3c32af634f6a018c5968d Mon Sep 17 00:00:00 2001 From: jh-RLI Date: Thu, 9 Apr 2026 11:57:39 +0200 Subject: [PATCH 4/7] fix broken html --- dataedit/templates/dataedit/opr_contributor.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dataedit/templates/dataedit/opr_contributor.html b/dataedit/templates/dataedit/opr_contributor.html index 44f1ebb20..2063ffa7b 100644 --- a/dataedit/templates/dataedit/opr_contributor.html +++ b/dataedit/templates/dataedit/opr_contributor.html @@ -190,14 +190,14 @@