From d5996c99b771114fdea36d0e6b7fa27da52a43cb Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Tue, 27 Aug 2019 20:06:48 +0200
Subject: [PATCH] OO-4198: add the warning in the score panel too

---
 .../ChoiceAssessmentItemBuilder.java          |  2 ++
 .../HottextAssessmentItemBuilder.java         |  5 +++++
 .../MultipleChoiceAssessmentItemBuilder.java  | 21 ++++++++++++++++++
 .../SingleChoiceAssessmentItemBuilder.java    | 20 +++++++++++++++++
 .../editor/_i18n/LocalStrings_de.properties   |  4 ++--
 .../editor/_i18n/LocalStrings_en.properties   |  4 ++--
 .../interactions/ChoiceScoreController.java   | 22 +++++++++++++++++--
 .../MultipleChoiceEditorController.java       | 21 ++----------------
 .../SingleChoiceEditorController.java         | 19 +---------------
 .../interactions/_content/choices_score.html  |  3 +++
 10 files changed, 78 insertions(+), 43 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti21/model/xml/interactions/ChoiceAssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/interactions/ChoiceAssessmentItemBuilder.java
index a2564bc9059..696814c6647 100644
--- a/src/main/java/org/olat/ims/qti21/model/xml/interactions/ChoiceAssessmentItemBuilder.java
+++ b/src/main/java/org/olat/ims/qti21/model/xml/interactions/ChoiceAssessmentItemBuilder.java
@@ -78,6 +78,8 @@ public abstract class ChoiceAssessmentItemBuilder extends AssessmentItemBuilder
 		scoreMapping.put(identifier, score);
 	}
 	
+	public abstract boolean scoreOfCorrectAnswerWarning();
+	
 	public abstract int getMaxPossibleCorrectAnswers();
 	
 	public abstract int getMaxChoices();
diff --git a/src/main/java/org/olat/ims/qti21/model/xml/interactions/HottextAssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/interactions/HottextAssessmentItemBuilder.java
index a59bda4ba95..4b775feb7c8 100644
--- a/src/main/java/org/olat/ims/qti21/model/xml/interactions/HottextAssessmentItemBuilder.java
+++ b/src/main/java/org/olat/ims/qti21/model/xml/interactions/HottextAssessmentItemBuilder.java
@@ -230,6 +230,11 @@ public class HottextAssessmentItemBuilder extends ChoiceAssessmentItemBuilder im
 		return correctAnswers.contains(choice.getIdentifier());
 	}
 	
+	@Override
+	public boolean scoreOfCorrectAnswerWarning() {
+		return false;
+	}
+
 	@Override
 	public int getMaxPossibleCorrectAnswers() {
 		return getChoices().size();
diff --git a/src/main/java/org/olat/ims/qti21/model/xml/interactions/MultipleChoiceAssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/interactions/MultipleChoiceAssessmentItemBuilder.java
index 3a4b0a90aa7..459c7695e96 100644
--- a/src/main/java/org/olat/ims/qti21/model/xml/interactions/MultipleChoiceAssessmentItemBuilder.java
+++ b/src/main/java/org/olat/ims/qti21/model/xml/interactions/MultipleChoiceAssessmentItemBuilder.java
@@ -165,6 +165,27 @@ public class MultipleChoiceAssessmentItemBuilder extends SimpleChoiceAssessmentI
 		return choices.size();
 	}
 
+	@Override
+	public boolean scoreOfCorrectAnswerWarning() {
+		boolean warning;
+		if(getScoreEvaluationMode() == ScoreEvaluation.perAnswer) {
+			boolean wrongAnswerHasPoint = false;
+			boolean correctAnswerHasNotPoint = true;
+			for(SimpleChoice choice:getChoices()) {
+				Double score = getMapping(choice.getIdentifier());
+				if(isCorrect(choice)) {
+					correctAnswerHasNotPoint &= (score == null || score.doubleValue() < 0.000001);
+				} else {
+					wrongAnswerHasPoint |= (score != null && score.doubleValue() > 0.6);
+				}	
+			}
+			warning = wrongAnswerHasPoint && correctAnswerHasNotPoint;
+		} else {
+			warning = false;
+		}
+		return warning;
+	}
+
 	@Override
 	public void clearSimpleChoices() {
 		if(correctAnswers != null) {
diff --git a/src/main/java/org/olat/ims/qti21/model/xml/interactions/SingleChoiceAssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/interactions/SingleChoiceAssessmentItemBuilder.java
index b7ef3eaeccf..fce63be87aa 100644
--- a/src/main/java/org/olat/ims/qti21/model/xml/interactions/SingleChoiceAssessmentItemBuilder.java
+++ b/src/main/java/org/olat/ims/qti21/model/xml/interactions/SingleChoiceAssessmentItemBuilder.java
@@ -149,6 +149,26 @@ public class SingleChoiceAssessmentItemBuilder extends SimpleChoiceAssessmentIte
 		correctAnswer = null;
 		super.clearSimpleChoices();
 	}
+	
+	@Override
+	public boolean scoreOfCorrectAnswerWarning() {
+		boolean warning = false;
+		if(getScoreEvaluationMode() == ScoreEvaluation.perAnswer) {
+			boolean wrongAnswerHasPoint = false;
+			boolean correctAnswerHasNotPoint = false;
+			
+			for(SimpleChoice choiceWrapper:getChoices()) {
+				Double score = getMapping(choiceWrapper.getIdentifier());
+				if(isCorrect(choiceWrapper)) {
+					correctAnswerHasNotPoint = (score == null || score.doubleValue() < 0.000001);
+				} else {
+					wrongAnswerHasPoint |= (score != null && score.doubleValue() > 0.6);
+				}	
+			}
+			warning |= wrongAnswerHasPoint && correctAnswerHasNotPoint;
+		}
+		return warning;
+	}
 
 	@Override
 	protected void buildResponseAndOutcomeDeclarations() {
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties
index 63b2de809c9..77ac21517fe 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties
@@ -273,8 +273,8 @@ warning.atleastone=Bitte w\u00E4hlen Sie mindestens ein Element.
 warning.atleastonesection=Diese Sektion kann nicht gel\u00F6scht werden. Ein Test oder ein Test-Part muss mindestens eine Sektion enthalten.
 warning.conversion.list=Es wurde Inkompatibilit\u00E4ten gefunden\:
 warning.conversion.standard=Es gibt ein Risiko, dass sie Daten verlieren, obwohl kein Inkompatibilit\u00E4ten entdeckt wurden.
-warning.correct.answer.score=Die korrekte Antwort gibt kein Punkt zu, aber eine inkorrekte schon.
-warning.correct.answers.score=Korrekte Antwort geben keine Punkte zu, aber inkorrekte schon.
+warning.correct.answer.score=Es wurden keine Punkte f\u00FCr die korrekte Antwort definiert, aber f\u00FCr die inkorrekte Antwort.
+warning.correct.answers.score=Es wurden keine Punkte f\u00FCr die korrekte(n) Antwort(en) definiert, aber f\u00FCr die inkorrekte(n) Antwort(en).
 warning.copy.from.pool=Die Frage wurde vom Fragenpool kopiert. Sie k\u00F6nnen die Originalfrage unter Master ID finden.
 warning.custom.operator=Es wurde eine her\u00ADstel\u00ADler\u00ADspe\u00ADzi\u00ADfische Erweiterung gefunden. Diese ist nicht von Editor unterst\u00FCtzt.
 warning.feedback.cutvalue=Feedback wird aktiviert, sobald bei "Notwendige Punktzahl f\u00FCr 'Bestanden'" eine Punktzahl eingegeben wurde.
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties
index 3e22af185a2..16b6798e6d0 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties
@@ -274,8 +274,8 @@ warning.atleastonesection=The section cannot be deleted. A test or a test part m
 warning.conversion.list=Some incompatibilities was found\:
 warning.conversion.standard=There is a risk that some data got lost after conversion but no flagrant incompatibilities was found.
 warning.copy.from.pool=The question was copied from the question bank. You can find the original question under the master id.
-warning.correct.answer.score=Correct answers don't give any points but wrong one(s) do.
-warning.correct.answers.score=Correct answer doesn't give any point but wrong one do.
+warning.correct.answer.score=No points have been defined for the correct answer, but for the incorrect answer.
+warning.correct.answers.score=No points have been defined for the correct answer(s), but for the incorrect answer(s).
 warning.custom.operator=This question contains creator specific extension which are currently not supported by OpenOlat.
 warning.feedback.cutvalue=The feedback is based on the cut value. You need to define it first.
 warning.in.use=The resource is already used for assessment purpose. Editing is limited.
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/ChoiceScoreController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/ChoiceScoreController.java
index 7264dda4c14..635cfd7a9d9 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/ChoiceScoreController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/ChoiceScoreController.java
@@ -71,7 +71,8 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
 	private TextElement minScoreEl;
 	private TextElement maxScoreEl;
 	private SingleSelection assessmentModeEl;
-	private SingleSelection maxChoicesEl, minChoicesEl;
+	private SingleSelection minChoicesEl;
+	private SingleSelection maxChoicesEl;
 	private FormLayoutContainer scoreCont;
 	private final List<ChoiceWrapper> wrappers = new ArrayList<>();
 	
@@ -97,6 +98,7 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
 				new ResourcesMapper(assessmentObjectUri));
 		
 		initForm(ureq);
+		validateScoreOfCorrectAnswer();
 	}
 
 	@Override
@@ -229,6 +231,7 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
 			
 			updateMinMaxChoices();
 		}
+		validateScoreOfCorrectAnswer();
 	}
 	
 	private ChoiceWrapper createChoiceWrapper(Choice choice) {
@@ -264,9 +267,23 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
 				allOk &= validateDouble(wrapper.getPointsEl());
 			}
 		}
-		
+
+		validateScoreOfCorrectAnswer();// only a warning
 		return allOk;
 	}
+	
+	private void validateScoreOfCorrectAnswer() {
+		try {
+			Boolean warning = (Boolean)scoreCont.contextGet("scoreWarning");
+			Boolean newWarning = Boolean.valueOf(itemBuilder.scoreOfCorrectAnswerWarning());
+			if(warning == null || !warning.equals(newWarning)) {
+				scoreCont.contextPut("scoreWarning", newWarning);
+			}
+		} catch (Exception e) {
+			// not a critical feature, don't produce red screen
+			logError("", e);
+		}
+	}
 
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
@@ -310,6 +327,7 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
 		}
 
 		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), null));
+		validateScoreOfCorrectAnswer();
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java
index 3564403ca7d..637a1088732 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java
@@ -47,7 +47,6 @@ import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.AssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.AssessmentItemFactory;
 import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder;
-import org.olat.ims.qti21.model.xml.interactions.SimpleChoiceAssessmentItemBuilder.ScoreEvaluation;
 import org.olat.ims.qti21.ui.ResourcesMapper;
 import org.olat.ims.qti21.ui.components.FlowFormItem;
 import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController;
@@ -244,7 +243,7 @@ public class MultipleChoiceEditorController extends FormBasicController implemen
 	}
 
 	@Override
-	public void sync(UserRequest ureq, AssessmentItemBuilder itemBuilder) {
+	public void sync(UserRequest ureq, AssessmentItemBuilder builder) {
 		validateScoreOfCorrectAnswer();
 	}
 
@@ -273,23 +272,7 @@ public class MultipleChoiceEditorController extends FormBasicController implemen
 	private void validateScoreOfCorrectAnswer() {
 		try {
 			Boolean warning = (Boolean)answersCont.contextGet("scoreWarning");
-			Boolean newWarning;
-			if(itemBuilder.getScoreEvaluationMode() == ScoreEvaluation.perAnswer) {
-				boolean wrongAnswerHasPoint = false;
-				boolean correctAnswerHasNotPoint = true;
-				for(SimpleChoiceWrapper choiceWrapper:choiceWrappers) {
-					Double score = itemBuilder.getMapping(choiceWrapper.getIdentifier());
-					if(choiceWrapper.isCorrect()) {
-						correctAnswerHasNotPoint &= (score == null || score.doubleValue() < 0.000001);
-					} else {
-						wrongAnswerHasPoint |= (score != null && score.doubleValue() > 0.6);
-					}	
-				}
-				newWarning = Boolean.valueOf(wrongAnswerHasPoint && correctAnswerHasNotPoint);
-			} else {
-				newWarning = Boolean.FALSE;
-			}
-			
+			Boolean newWarning = Boolean.valueOf(itemBuilder.scoreOfCorrectAnswerWarning());
 			if(warning == null || !warning.equals(newWarning)) {
 				answersCont.contextPut("scoreWarning", newWarning);
 			}
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java
index 4033edadd1b..048eb7f2005 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java
@@ -45,7 +45,6 @@ import org.olat.ims.qti21.QTI21Constants;
 import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.AssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.AssessmentItemFactory;
-import org.olat.ims.qti21.model.xml.interactions.SimpleChoiceAssessmentItemBuilder.ScoreEvaluation;
 import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder;
 import org.olat.ims.qti21.ui.ResourcesMapper;
 import org.olat.ims.qti21.ui.components.FlowFormItem;
@@ -274,23 +273,7 @@ public class SingleChoiceEditorController extends FormBasicController implements
 	private void validateScoreOfCorrectAnswer() {
 		try {
 			Boolean warning = (Boolean)answersCont.contextGet("scoreWarning");
-			Boolean newWarning;
-			if(itemBuilder.getScoreEvaluationMode() == ScoreEvaluation.perAnswer) {
-				boolean wrongAnswerHasPoint = false;
-				boolean correctAnswerHasNotPoint = false;
-				for(SimpleChoiceWrapper choiceWrapper:choiceWrappers) {
-					Double score = itemBuilder.getMapping(choiceWrapper.getIdentifier());
-					if(choiceWrapper.isCorrect()) {
-						correctAnswerHasNotPoint = (score == null || score.doubleValue() < 0.000001);
-					} else {
-						wrongAnswerHasPoint |= (score != null && score.doubleValue() > 0.6);
-					}	
-				}
-				newWarning = Boolean.valueOf(wrongAnswerHasPoint && correctAnswerHasNotPoint);
-			} else {
-				newWarning = Boolean.FALSE;
-			}
-			
+			Boolean newWarning = Boolean.valueOf(itemBuilder.scoreOfCorrectAnswerWarning());
 			if(warning == null || !warning.equals(newWarning)) {
 				answersCont.contextPut("scoreWarning", newWarning);
 			}
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/_content/choices_score.html b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/_content/choices_score.html
index 8adeebdc235..3c2584896ba 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/_content/choices_score.html
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/_content/choices_score.html
@@ -1,3 +1,6 @@
+#if($r.isTrue($scoreWarning))
+	<div class="o_warning" role="alert">$r.translate("warning.correct.answer.score")</div>
+#end
 <table class="table o_sel_choices_scores">
 	<thead><tr>
 		<th>$r.translate("form.score.answer.correct")</th>
-- 
GitLab