Skip to content
Snippets Groups Projects
Commit 95745272 authored by srosse's avatar srosse
Browse files

OO-2923: validate the total score of the sections against the configuration of the course element

parent 49c3c646
No related branches found
No related tags found
No related merge requests found
......@@ -39,15 +39,19 @@ public class BinderConfiguration {
private final boolean timeline;
private final boolean shareable;
private final boolean options;
private final Float maxScore;
private final Float minScore;
public BinderConfiguration(boolean assessable, boolean withScore, boolean withPassed,
boolean timeline, boolean shareable, boolean options) {
public BinderConfiguration(boolean assessable, boolean withScore, Float maxScore, Float minScore,
boolean withPassed, boolean timeline, boolean shareable, boolean options) {
this.assessable = assessable;
this.withScore = withScore;
this.withPassed = withPassed;
this.timeline = timeline;
this.shareable = shareable;
this.options = options;
this.maxScore = maxScore;
this.minScore = minScore;
}
public boolean isAssessable() {
......@@ -57,6 +61,14 @@ public class BinderConfiguration {
public boolean isWithScore() {
return withScore;
}
public Float getMaxScore() {
return maxScore;
}
public Float getMinScore() {
return minScore;
}
public boolean isWithPassed() {
return withPassed;
......@@ -84,29 +96,31 @@ public class BinderConfiguration {
}
public static BinderConfiguration createBusinessGroupConfig() {
return new BinderConfiguration(false, false, false, true, false, false);
return new BinderConfiguration(false, false, null, null, false, true, false, false);
}
public static BinderConfiguration createTemplateConfig(boolean optionsEditable) {
return new BinderConfiguration(false, false, false, false, false, optionsEditable);
return new BinderConfiguration(false, false, null, null, false, false, false, optionsEditable);
}
public static BinderConfiguration createInvitationConfig() {
return new BinderConfiguration(false, false, false, true, false, false);
return new BinderConfiguration(false, false, null, null, false, true, false, false);
}
public static BinderConfiguration createMyPagesConfig() {
return new BinderConfiguration(false, false, false, true, true, false);
return new BinderConfiguration(false, false, null, null, false, true, true, false);
}
public static BinderConfiguration createDeletedPagesConfig() {
return new BinderConfiguration(false, false, false, false, false, false);
return new BinderConfiguration(false, false, null, null, false, false, false, false);
}
public static BinderConfiguration createConfig(Binder binder) {
boolean withScore = false;
boolean withPassed = false;
boolean assessable = false;
Float maxScore = null;
Float minScore = null;
RepositoryEntry entry = binder.getEntry();
if(binder.getSubIdent() != null) {
......@@ -115,6 +129,10 @@ public class BinderConfiguration {
if(courseNode instanceof PortfolioCourseNode) {
PortfolioCourseNode pfNode = (PortfolioCourseNode)courseNode;
withScore = pfNode.hasScoreConfigured();
if(withScore) {
maxScore = pfNode.getMaxScoreConfiguration();
minScore = pfNode.getMinScoreConfiguration();
}
withPassed = pfNode.hasPassedConfigured();
assessable = withPassed || withScore;
} else {
......@@ -129,6 +147,6 @@ public class BinderConfiguration {
} else {
withPassed = withScore = assessable = false;
}
return new BinderConfiguration(assessable, withScore, withPassed, true, true, false);
return new BinderConfiguration(assessable, withScore, maxScore, minScore, withPassed, true, true, false);
}
}
......@@ -95,6 +95,7 @@ public class BinderAssessmentController extends FormBasicController {
private boolean withScore;
private boolean withPassed;
private Float minScore, maxScore;
@Autowired
private PortfolioService portfolioService;
......@@ -104,8 +105,10 @@ public class BinderAssessmentController extends FormBasicController {
super(ureq, wControl, "section_assessment");
this.binder = binder;
this.secCallback = secCallback;
this.withPassed = config.isWithPassed();
this.withScore = config.isWithScore();
withPassed = config.isWithPassed();
withScore = config.isWithScore();
minScore = config.getMinScore();
maxScore = config.getMaxScore();
initForm(ureq);
loadModel();
}
......@@ -296,6 +299,37 @@ public class BinderAssessmentController extends FormBasicController {
super.formInnerEvent(ureq, source, event);
}
@Override
protected boolean validateFormLogic(UserRequest ureq) {
boolean allOk = true;
flc.contextRemove("scoreError");
if(withScore && (maxScore != null || minScore != null)) {
double scoreTotal = 0.0d;
List<AssessmentSectionWrapper> rows = model.getObjects();
for(AssessmentSectionWrapper row:rows) {
BigDecimal score = row.getScore();
if(row.getScoreEl() != null) {
String value = row.getScoreEl().getValue();
if(StringHelper.containsNonWhitespace(value)) {
score = new BigDecimal(value);
}
}
if(score != null) {
scoreTotal += score.doubleValue();
}
}
if(maxScore != null && (maxScore.doubleValue() < scoreTotal)) {
flc.contextPut("scoreError", translate("error.score", new String[] { "0", AssessmentHelper.getRoundedScore(maxScore)}));
} else if(minScore != null && (minScore.doubleValue() > scoreTotal)) {
flc.contextPut("scoreError", translate("error.score", new String[] { "0", AssessmentHelper.getRoundedScore(maxScore)}));
}
}
return allOk & super.validateFormLogic(ureq);
}
@Override
protected void formOK(UserRequest ureq) {
commitChanges();
......
......@@ -2,6 +2,9 @@
$r.contextHelpWithWrapper("Portfolio assignment: Grading")
</div>
$r.render("section-list")
#if($r.isNotEmpty($scoreError))
<div class="o_error">$scoreError</div>
#end
<div class="o_button_group">
$r.render("buttons")
</div>
\ No newline at end of file
......@@ -153,6 +153,7 @@ error.invalid.type=Dieser Dateityp ist nicht unters\u00FCtzt.
error.invitation.mail.used=Diese E-Mailadresse wird bereits von einem OpenOLAT-Benutzer verwendet.
error.mail.invalid=Bitte geben Sie eine g\u00FCltige E-Mailadresse an.
error.mimetype=$org.olat.core.commons.modules.bc\:WrongMimeType
error.score=Punkte müssen zwischen {0} und {1} sein.
fileupload=Titelbild
filter.show.all=Alle anzeigen
firstName=Vorname
......
......@@ -153,6 +153,7 @@ error.invalid.type=This file type is not supported.
error.invitation.mail.used=This e-mail address is already used by an OpenOLAT user.
error.mail.invalid=Please provide a valid e-mail address.
error.mimetype=$org.olat.core.commons.modules.bc\:WrongMimeType
error.score=Score is not between {0} and {1}.
fileupload=Teaser Image
filter.show.all=Show all
firstName=First name
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment