Allows admins to manage grading report templates #14
@ -10,28 +10,28 @@ public record GradingReportTemplateUpdate(
|
|||||||
LocalDate validFrom,
|
LocalDate validFrom,
|
||||||
@Nullable String note,
|
@Nullable String note,
|
||||||
String failingGrade,
|
String failingGrade,
|
||||||
List<Grade> grades,
|
List<GradeLimit> gradeLimits,
|
||||||
List<Criteria> criteria)
|
List<Criteria> criteria)
|
||||||
{
|
{
|
||||||
public GradingReportTemplateUpdate {
|
public GradingReportTemplateUpdate {
|
||||||
Objects.requireNonNull(validFrom, "Valid from must not be null");
|
Objects.requireNonNull(validFrom, "Valid from must not be null");
|
||||||
Objects.requireNonNull(failingGrade, "Failing grade must not be null");
|
Objects.requireNonNull(failingGrade, "Failing grade must not be null");
|
||||||
Objects.requireNonNull(grades, "Grades must not be null");
|
Objects.requireNonNull(gradeLimits, "Grades must not be null");
|
||||||
Objects.requireNonNull(criteria, "Criteria must not be null");
|
Objects.requireNonNull(criteria, "Criteria must not be null");
|
||||||
|
|
||||||
for (Grade grade1 : grades) {
|
for (GradeLimit gradeLimit1 : gradeLimits) {
|
||||||
for (Grade grade2 : grades) {
|
for (GradeLimit gradeLimit2 : gradeLimits) {
|
||||||
if (grade1 != grade2 && grade1.minimumPoints() == grade2.minimumPoints()) {
|
if (gradeLimit1 != gradeLimit2 && gradeLimit1.minimumPoints() == gradeLimit2.minimumPoints()) {
|
||||||
throw new IllegalArgumentException("Duplicate minimum points on grades: %s and %s".formatted(
|
throw new IllegalArgumentException("Duplicate minimum points on grades: %s and %s".formatted(
|
||||||
grade1.grade(),
|
gradeLimit1.grade(),
|
||||||
grade2.grade()));
|
gradeLimit2.grade()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public record Grade(String grade, int minimumPoints) {
|
public record GradeLimit(String grade, int minimumPoints) {
|
||||||
public Grade {
|
public GradeLimit {
|
||||||
Objects.requireNonNull(grade, "Grade must not be null");
|
Objects.requireNonNull(grade, "Grade must not be null");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
46
core/src/main/java/se/su/dsv/scipro/report/GradeLimit.java
Normal file
46
core/src/main/java/se/su/dsv/scipro/report/GradeLimit.java
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package se.su.dsv.scipro.report;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.GeneratedValue;
|
||||||
|
import jakarta.persistence.GenerationType;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "grading_report_template_grade_limits")
|
||||||
|
public class GradeLimit {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(name = "grade")
|
||||||
|
private String grade;
|
||||||
|
|
||||||
|
@Column(name = "lower_limit")
|
||||||
|
private int lowerLimit;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGrade() {
|
||||||
|
return grade;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGrade(String grade) {
|
||||||
|
this.grade = grade;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLowerLimit() {
|
||||||
|
return lowerLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLowerLimit(int lowerLimit) {
|
||||||
|
this.lowerLimit = lowerLimit;
|
||||||
|
}
|
||||||
|
}
|
@ -9,6 +9,7 @@ import se.su.dsv.scipro.system.User;
|
|||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -40,6 +41,10 @@ public class GradingReportTemplate extends DomainObject {
|
|||||||
@Column(name = "failing_grade")
|
@Column(name = "failing_grade")
|
||||||
private String failingGrade;
|
private String failingGrade;
|
||||||
|
|
||||||
|
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
|
||||||
|
@JoinColumn(name = "grading_report_template_id")
|
||||||
|
private Collection<GradeLimit> gradeLimits = new ArrayList<>();
|
||||||
|
|
||||||
protected GradingReportTemplate() {
|
protected GradingReportTemplate() {
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -116,6 +121,14 @@ public class GradingReportTemplate extends DomainObject {
|
|||||||
this.failingGrade = failingGrade;
|
this.failingGrade = failingGrade;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Collection<GradeLimit> getGradeLimits() {
|
||||||
|
return gradeLimits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGradeLimits(Collection<GradeLimit> gradeLimits) {
|
||||||
|
this.gradeLimits = gradeLimits;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final Object o) {
|
public boolean equals(final Object o) {
|
||||||
if (o == this) return true;
|
if (o == this) return true;
|
||||||
|
@ -93,6 +93,14 @@ public class GradingReportTemplateRepoImpl extends GenericRepo<GradingReportTemp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gradingReportTemplate.getGradeLimits().clear();
|
||||||
|
for (var grade : update.gradeLimits()) {
|
||||||
|
GradeLimit gradeLimit = new GradeLimit();
|
||||||
|
gradeLimit.setGrade(grade.grade());
|
||||||
|
gradeLimit.setLowerLimit(grade.minimumPoints());
|
||||||
|
gradingReportTemplate.getGradeLimits().add(gradeLimit);
|
||||||
|
}
|
||||||
|
|
||||||
return save(gradingReportTemplate);
|
return save(gradingReportTemplate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
CREATE TABLE `grading_report_template_grade_limits` (
|
||||||
|
`id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||||
|
`grading_report_template_id` BIGINT, -- can't be NOT NULL because of Hibernate using an INSERT followed by an UPDATE
|
||||||
|
`grade` VARCHAR(32) NOT NULL,
|
||||||
|
`lower_limit` INT NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `UK_one_grade_per_template` (`grading_report_template_id`, `grade`),
|
||||||
|
FOREIGN KEY `FK_grade_limit_grading_report_template `(`grading_report_template_id`)
|
||||||
|
REFERENCES `grading_report_template` (`id`) ON DELETE CASCADE
|
||||||
|
);
|
@ -67,7 +67,7 @@ public class AdminGradingTemplateEditPage extends AbstractAdminProjectPage imple
|
|||||||
}
|
}
|
||||||
|
|
||||||
private GradingReportTemplateUpdate toUpdate(EditingGradingTemplate editingGradingTemplate) {
|
private GradingReportTemplateUpdate toUpdate(EditingGradingTemplate editingGradingTemplate) {
|
||||||
List<GradingReportTemplateUpdate.Grade> grades = editingGradingTemplate
|
List<GradingReportTemplateUpdate.GradeLimit> gradeLimits = editingGradingTemplate
|
||||||
.getGradeLimits()
|
.getGradeLimits()
|
||||||
.getGradeLimits()
|
.getGradeLimits()
|
||||||
.stream()
|
.stream()
|
||||||
@ -82,7 +82,7 @@ public class AdminGradingTemplateEditPage extends AbstractAdminProjectPage imple
|
|||||||
editingGradingTemplate.getValidFrom(),
|
editingGradingTemplate.getValidFrom(),
|
||||||
editingGradingTemplate.getNote(),
|
editingGradingTemplate.getNote(),
|
||||||
editingGradingTemplate.getGradeLimits().getFailingGrade(),
|
editingGradingTemplate.getGradeLimits().getFailingGrade(),
|
||||||
grades,
|
gradeLimits,
|
||||||
criteria);
|
criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,8 +117,8 @@ public class AdminGradingTemplateEditPage extends AbstractAdminProjectPage imple
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private GradingReportTemplateUpdate.Grade toGrade(GradeLimits.GradeLimit gradeLimit) {
|
private GradingReportTemplateUpdate.GradeLimit toGrade(GradeLimits.GradeLimit gradeLimit) {
|
||||||
return new GradingReportTemplateUpdate.Grade(
|
return new GradingReportTemplateUpdate.GradeLimit(
|
||||||
gradeLimit.getGrade(),
|
gradeLimit.getGrade(),
|
||||||
gradeLimit.getLowerLimit());
|
gradeLimit.getLowerLimit());
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,12 @@ class GradeLimits implements Serializable {
|
|||||||
|
|
||||||
GradeLimits(GradingReportTemplate template) {
|
GradeLimits(GradingReportTemplate template) {
|
||||||
this.gradeLimits = new ArrayList<>();
|
this.gradeLimits = new ArrayList<>();
|
||||||
|
for (var gradeLimit : template.getGradeLimits()) {
|
||||||
|
GradeLimit editableGradeLimit = new GradeLimit();
|
||||||
|
editableGradeLimit.setGrade(gradeLimit.getGrade());
|
||||||
|
editableGradeLimit.setLowerLimit(gradeLimit.getLowerLimit());
|
||||||
|
gradeLimits.add(editableGradeLimit);
|
||||||
|
}
|
||||||
this.failingGrade = template.getFailingGrade();
|
this.failingGrade = template.getFailingGrade();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user