Allows admins to manage grading report templates #14

Merged
niat8586 merged 41 commits from 3482-new-grading-criteria into develop 2024-10-30 10:05:23 +01:00
7 changed files with 96 additions and 13 deletions
Showing only changes of commit c76361caa9 - Show all commits

View File

@ -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");
} }
} }

View 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;
}
}

View File

@ -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;

View File

@ -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);
} }

View File

@ -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
);

View File

@ -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());
} }

View File

@ -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();
} }