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
4 changed files with 49 additions and 3 deletions
Showing only changes of commit e96ce9b0ff - Show all commits

View File

@ -36,12 +36,19 @@ public record GradingReportTemplateUpdate(
} }
} }
public record Criteria(LocalizedString title, @Nullable Flag flag, List<Requirement> requirements) public record Criteria(
LocalizedString title,
Type type,
int minimumPointsRequiredToPass,
@Nullable Flag flag,
List<Requirement> requirements)
{ {
public enum Type {THESIS, INDIVIDUAL}
public enum Flag {OPPOSITION, REFLECTION} public enum Flag {OPPOSITION, REFLECTION}
public Criteria { public Criteria {
Objects.requireNonNull(title, "Title must not be null"); Objects.requireNonNull(title, "Title must not be null");
Objects.requireNonNull(type, "Type must not be null");
Objects.requireNonNull(requirements, "Requirements must not be null"); Objects.requireNonNull(requirements, "Requirements must not be null");
} }

View File

@ -25,7 +25,7 @@ public class GradingReportTemplate extends DomainObject {
@OneToOne(optional = false) @OneToOne(optional = false)
private ProjectType projectType; private ProjectType projectType;
@OneToMany(mappedBy = "gradingReportTemplate", cascade = {CascadeType.ALL}) @OneToMany(mappedBy = "gradingReportTemplate", cascade = {CascadeType.ALL}, orphanRemoval = true)
private Collection<GradingCriterionTemplate> criteria = new HashSet<>(); private Collection<GradingCriterionTemplate> criteria = new HashSet<>();
@Temporal(TemporalType.DATE) @Temporal(TemporalType.DATE)

View File

@ -65,6 +65,40 @@ public class GradingReportTemplateRepoImpl extends GenericRepo<GradingReportTemp
@Transactional @Transactional
public GradingReportTemplate updateTemplate(long templateId, GradingReportTemplateUpdate update) { public GradingReportTemplate updateTemplate(long templateId, GradingReportTemplateUpdate update) {
GradingReportTemplate gradingReportTemplate = findOne(templateId); GradingReportTemplate gradingReportTemplate = findOne(templateId);
return gradingReportTemplate; gradingReportTemplate.setValidFrom(update.validFrom());
gradingReportTemplate.getCriteria().clear();
for (var criteria : update.criteria()) {
final List<GradingCriterionPointTemplate> pointTemplates = criteria.requirements()
.stream()
.map(this::toPointTemplate)
.toList();
switch (criteria.type()) {
case THESIS -> {
gradingReportTemplate.addProjectCriterion(
criteria.title().swedish(),
criteria.title().english(),
criteria.minimumPointsRequiredToPass(),
pointTemplates);
}
case INDIVIDUAL -> {
gradingReportTemplate.addIndividualCriterion(
criteria.title().swedish(),
criteria.title().english(),
criteria.minimumPointsRequiredToPass(),
pointTemplates);
}
}
}
return save(gradingReportTemplate);
}
private GradingCriterionPointTemplate toPointTemplate(GradingReportTemplateUpdate.Criteria.Requirement requirement) {
return new GradingCriterionPointTemplate.Builder()
.point(requirement.points())
.description(requirement.description().swedish())
.descriptionEn(requirement.description().english())
.build();
} }
} }

View File

@ -97,6 +97,11 @@ public class AdminGradingTemplateEditPage extends AbstractAdminProjectPage imple
} }
return new GradingReportTemplateUpdate.Criteria( return new GradingReportTemplateUpdate.Criteria(
new LocalizedString(criteria.getTitleEn(), criteria.getTitleSv()), new LocalizedString(criteria.getTitleEn(), criteria.getTitleSv()),
switch (criteria.getType()) {
case PROJECT -> GradingReportTemplateUpdate.Criteria.Type.THESIS;
case INDIVIDUAL -> GradingReportTemplateUpdate.Criteria.Type.INDIVIDUAL;
},
criteria.getPointsRequiredToPass(),
getFlag(criteria), getFlag(criteria),
requirements); requirements);
} }