97: Get grade with limits from database instead of hardcoding in UI-layer

This commit is contained in:
Tom Zhao 2025-02-19 12:25:54 +01:00
parent 1b6fd8a17b
commit 655e6a3420
2 changed files with 97 additions and 61 deletions
view/src/main/java/se/su/dsv/scipro/grading

@ -3,65 +3,13 @@
<body>
<wicket:panel>
<wicket:container wicket:id="from202411">
<div wicket:id="bachelorContainer">
<div class="card mb-3 bg-light">
<div class="card-body p-2">
<p>
<strong>Conversion from points to grades is done according to the following schema:</strong>
</p>
<p>[A] 31-29</p>
<p>[B] 28-26</p>
<p>[C] 25-22</p>
<p>[D] 21-19</p>
<p>[E] 18-16</p>
</div>
</div>
</div>
<div wicket:id="master15Container">
<div class="card mb-3 bg-light">
<div class="card-body p-2">
<p>
<strong>Conversion from points to grades is done according to the following schema:</strong>
</p>
<p>[A] 33-31</p>
<p>[B] 30-28</p>
<p>[C] 27-24</p>
<p>[D] 23-21</p>
<p>[E] 20-19</p>
</div>
</div>
</div>
<div wicket:id="master30Container">
<div class="card mb-3 bg-light">
<div class="card-body p-2">
<p>
<strong>Conversion from points to grades is done according to the following schema:</strong>
</p>
<p>[A] 37-35</p>
<p>[B] 34-32</p>
<p>[C] 31-28</p>
<p>[D] 27-25</p>
<p>[E] 25-23</p>
<div class="card mb-3 bg-light">
<div class="card-body p-2">
<p>
<strong>Conversion from points to grades is done according to the following schema:</strong>
</p>
<div wicket:id="gradewithlimits_list">
<p wicket:id="gradewithlimits"></p>
</div>
</div>
</div>

@ -1,11 +1,23 @@
package se.su.dsv.scipro.grading;
import jakarta.inject.Inject;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.report.GradeLimit;
import se.su.dsv.scipro.report.GradingCriterionTemplate;
import se.su.dsv.scipro.report.GradingReportTemplate;
import se.su.dsv.scipro.system.DegreeType;
import se.su.dsv.scipro.system.ProjectType;
public class TemplatePanel extends Panel {
@ -30,6 +42,9 @@ public class TemplatePanel extends Panel {
}
}
@Inject
private GradingReportTemplateService gradingReportTemplateService;
public TemplatePanel(String id, final IModel<Project> projectIModel) {
super(id, projectIModel);
final DegreeType degreeType = projectIModel.getObject().getProjectType().getDegreeType();
@ -60,17 +75,17 @@ public class TemplatePanel extends Panel {
addTemplates(degreeType, between2017_202410);
add(between2017_202410);
final WebMarkupContainer from202411 = new WebMarkupContainer("from202411") {
final GradeLimitsContainer from202411 = new GradeLimitsContainer("from202411", projectIModel) {
@Override
protected void onConfigure() {
super.onConfigure();
setVisibilityAllowed(
GradingCategory.fromProjectStartDate(projectIModel.getObject().getStartDate()) ==
GradingCategory.FROM_202411
);
}
};
addTemplates(degreeType, from202411);
add(from202411);
}
@ -103,4 +118,77 @@ public class TemplatePanel extends Panel {
}
);
}
private List<GradeWithPointRange> getGradeWithPointRanges(ProjectType projectType) {
GradingReportTemplate grt = gradingReportTemplateService.getCurrentTemplate(projectType);
GradeLimit[] gradeLimits = grt.getGradeLimits().toArray(GradeLimit[]::new);
List<GradeWithPointRange> list = Arrays.stream(gradeLimits)
.map(gradeLimit -> new GradeWithPointRange(gradeLimit.getGrade(), gradeLimit.getLowerLimit()))
.collect(Collectors.toList());
for (int i = 1; i < list.size(); i++) {
list.get(i).setUpperLimit(gradeLimits[i - 1].getLowerLimit() - 1);
}
list
.get(0)
.setUpperLimit(
grt.getCriteria().stream().map(GradingCriterionTemplate::getMaxPoints).reduce(0, Integer::sum)
);
return list;
}
private class GradeWithPointRange implements Serializable {
private String grade;
private int lowerLimit;
private int upperLimit;
public GradeWithPointRange(String grade, int lowerLimit) {
this.grade = grade;
this.lowerLimit = lowerLimit;
}
public String getGrade() {
return grade;
}
public int getLowerLimit() {
return lowerLimit;
}
public int getUpperLimit() {
return upperLimit;
}
public void setUpperLimit(int upperLimit) {
this.upperLimit = upperLimit;
}
@Override
public String toString() {
return "[" + grade + "]: " + lowerLimit + " - " + upperLimit;
}
}
private class GradeLimitsContainer extends WebMarkupContainer {
public GradeLimitsContainer(String id, IModel<Project> projectIModel) {
super(id, projectIModel);
List<GradeWithPointRange> list = getGradeWithPointRanges(projectIModel.getObject().getProjectType());
add(
new ListView<>("gradewithlimits_list", list) {
@Override
protected void populateItem(ListItem<GradeWithPointRange> item) {
GradeWithPointRange gpr = item.getModelObject();
String s = "[" + gpr.getGrade() + "] " + gpr.getLowerLimit() + " - " + gpr.getUpperLimit();
item.add(new Label("gradewithlimits", s));
add(item);
}
}
);
}
}
}