Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions REUSE.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2687,6 +2687,15 @@ SPDX-FileCopyrightText = [
"2025 Jonas Huber <https://github.com/jh-RLI> © Reiner Lemoine Institut",
]

[[annotations]]
path = "dataedit/templates/partials/review_item_snippet.html"
precedence = "override"
SPDX-License-Identifier = "AGPL-3.0-or-later"
SPDX-FileCopyrightText = [
"2025 Jonas Huber <https://github.com/jh-RLI> © Reiner Lemoine Institut",
]


[[annotations]]
path = "oedb/script.py.mako"
precedence = "override"
Expand Down
138 changes: 86 additions & 52 deletions dataedit/static/peer_review/opr_reviewer_logic.js
Original file line number Diff line number Diff line change
@@ -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 = $('<div class="bg-warning" id="finish-review-div"></div>');
var bronzeRadio = $('<input type="radio" name="reviewer-option" value="bronze"> Bronze<br>');
var silverRadio = $('<input type="radio" name="reviewer-option" value="silver"> Silver<br>');
var goldRadio = $('<input type="radio" name="reviewer-option" value="gold"> Gold<br>');
var platinRadio = $('<input type="radio" name="reviewer-option" value="platin"> Platin <br>');
var reviewText = $('<p>The review is complete. Please award a badge and finish the review.</p>');
var finishButton = $('<button type="button" id="review-finish-button">Finish</button>');
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 = $(
'<div class="bg-warning" id="finish-review-div"></div>'
);
var bronzeRadio = $(
'<input type="radio" name="reviewer-option" value="bronze"> Bronze<br>'
);
var silverRadio = $(
'<input type="radio" name="reviewer-option" value="silver"> Silver<br>'
);
var goldRadio = $(
'<input type="radio" name="reviewer-option" value="gold"> Gold<br>'
);
var platinRadio = $(
'<input type="radio" name="reviewer-option" value="platin"> Platin <br>'
);
var reviewText = $(
"<p>The review is complete. Please award a badge and finish the review.</p>"
);
var finishButton = $(
'<button type="button" id="review-finish-button">Finish</button>'
);

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;
}
}
return true;
}
12 changes: 6 additions & 6 deletions dataedit/templates/dataedit/opr_contributor.html
Original file line number Diff line number Diff line change
Expand Up @@ -190,14 +190,14 @@ <h5 class="modal-title" id="exampleModalLabel">
role="tabpanel"
aria-labelledby="general-tab">
<div class="review__items">
{% if meta.grouped_meta %}
{% if meta.general.flat is not None or meta.general.grouped is not None %}
{# Flat items #}
{% for item in meta.grouped_meta.general.flat %}
{% include "dataedit/templates/partials/review_item_snippet.html" with item=item category="general" only %}
{% for item in meta.general.flat %}
{% include "partials/review_item_snippet.html" with item=item category="general" only %}
{% endfor %}
{# Grouped items #}
<div class="accordion" id="generalAccordion">
{% for group_key, group in meta.grouped_meta.general.grouped.items %}
{% for group_key, group in meta.general.grouped.items %}
<div class="accordion-item">
<h2 class="accordion-header" id="heading-general-{{ forloop.counter }}">
<button class="accordion-button collapsed"
Expand All @@ -212,7 +212,7 @@ <h2 class="accordion-header" id="heading-general-{{ forloop.counter }}">
data-bs-parent="#generalAccordion">
<div class="accordion-body">
{% for item in group.flat %}
{% include "dataedit/templates/partials/review_item_snippet.html" with item=item category="general" only %}
{% include "partials/review_item_snippet.html" with item=item category="general" only %}
{% endfor %}
{% if group.grouped %}
<div class="accordion" id="generalInnerAccordion_{{ group_key|slugify }}">
Expand All @@ -231,7 +231,7 @@ <h2 class="accordion-header" id="heading-general-{{ forloop.counter }}">
class="accordion-collapse collapse">
<div class="accordion-body">
{% for item in sub_items %}
{% include "dataedit/templates/partials/review_item_snippet.html" with item=item category="general" only %}
{% include "partials/review_item_snippet.html" with item=item category="general" only %}
{% endfor %}
</div>
</div>
Expand Down
12 changes: 12 additions & 0 deletions dataedit/templates/partials/review_item_snippet.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<div id="field_{{ item.field|default:'undefined' }}"
class="field review__item"
data-fieldkey="{{ item.field|default:'' }}"
data-fieldvalue="{{ item.value|default:'' }}"
data-category="{{ category }}">
<p class="review__item-content">
<span class="key">{{ item.display_field|default:item.field }}</span>
<span class="value">{{ item.newValue|default:item.value }}</span>
<span class="suggestion suggestion--highlight">{{ item.reviewer_suggestion }}</span>
<span class="comment">{{ item.suggestion_comment }}</span>
</p>
</div>
16 changes: 8 additions & 8 deletions dataedit/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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),
Expand All @@ -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")
Expand All @@ -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)
5 changes: 5 additions & 0 deletions versions/changelogs/current.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ SPDX-License-Identifier: CC0-1.0
Individuals. The API path is now correctly set
[(#2237)](https://github.com/OpenEnergyPlatform/oeplatform/pull/2277).

- Cleanup incomplete updates to the OpenPeerReview. Some parts of the code are
incomplete due to a messi code refactoring where some code snippets have been
lost due to merge conflicts in commits that are not pushed to remote.
[(#2289)](https://github.com/OpenEnergyPlatform/oeplatform/pull/2289)

## Documentation updates

## Code Quality
Loading