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
8 changed files with 75 additions and 5 deletions
Showing only changes of commit 9a839579fc - Show all commits

View File

@ -1,17 +1,42 @@
package se.su.dsv.scipro.report;
import jakarta.persistence.Basic;
import jakarta.persistence.Column;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class AbstractGradingCriterion extends AbstractCriterion {
public enum Flag {
/**
* Criterion marked with this flag will extra functionality related
niat8586 marked this conversation as resolved Outdated

"Criterion marked with this flag will extra functionality related ..." should it say "Criterion marked with this flag will add extra functionality related

Same with the other comments i'm guessing.

"Criterion marked with this flag will extra functionality related ..." should it say "Criterion marked with this flag will **add** extra functionality related Same with the other comments i'm guessing.
* to the authors submitted reflection. It should only be used on
* individual criteria.
*/
REFLECTION,
/**
* Criterion marked with this flag will extra functionality related
* to the authors performed opposition. For example, it will have its
* points and feedback filled in when the seminar supervisor assesses
* their opposition and submitted report. It should only be used on
* individual criteria.
*/
OPPOSITION
}
@Basic(optional = false)
protected int pointsRequiredToPass;
@Basic
private boolean fx = true;
@Basic
@Column(name = "flag")
@Enumerated(EnumType.STRING)
private Flag flag;
protected AbstractGradingCriterion() {
}
@ -21,6 +46,17 @@ public abstract class AbstractGradingCriterion extends AbstractCriterion {
this.pointsRequiredToPass = pointsRequiredToPass;
}
protected AbstractGradingCriterion(
String title,
String titleEn,
Integer sortOrder,
int pointsRequiredToPass,
Flag flag)
{
this(title, titleEn, sortOrder, pointsRequiredToPass);
this.flag = flag;
}
public abstract boolean isProjectCriterion();
public abstract boolean isIndividualCriterion();
@ -35,6 +71,14 @@ public abstract class AbstractGradingCriterion extends AbstractCriterion {
return this.fx;
}
public Flag getFlag() {
return flag;
}
public void setFlag(Flag flag) {
this.flag = flag;
}
@Override
public boolean equals(final Object o) {
if (o == this) return true;

View File

@ -30,7 +30,7 @@ public abstract class GradingCriterion extends AbstractGradingCriterion {
}
GradingCriterion(GradingReport gradingReport, GradingCriterionTemplate gradingCriterionTemplate) {
super(gradingCriterionTemplate.getTitle(), gradingCriterionTemplate.getTitleEn(), gradingCriterionTemplate.getSortOrder(), gradingCriterionTemplate.getPointsRequiredToPass());
super(gradingCriterionTemplate.getTitle(), gradingCriterionTemplate.getTitleEn(), gradingCriterionTemplate.getSortOrder(), gradingCriterionTemplate.getPointsRequiredToPass(), gradingCriterionTemplate.getFlag());
this.gradingReport = gradingReport;
for (GradingCriterionPointTemplate pointTemplate : gradingCriterionTemplate.getGradingCriterionPointTemplates()) {
gradingCriterionPoints.add(new GradingCriterionPoint(

View File

@ -69,13 +69,23 @@ public class GradingReportTemplate extends DomainObject {
}
public GradingCriterionTemplate addProjectCriterion(String title, String titleEn, int pointsRequiredToPass, List<GradingCriterionPointTemplate> gradingCriterionPointTemplates) {
return addProjectCriterion(title, titleEn, pointsRequiredToPass, gradingCriterionPointTemplates, null);
}
public GradingCriterionTemplate addProjectCriterion(String title, String titleEn, int pointsRequiredToPass, List<GradingCriterionPointTemplate> gradingCriterionPointTemplates, AbstractGradingCriterion.Flag flag) {
GradingCriterionTemplate gradingCriterionTemplate = new ProjectGradingCriterionTemplate(this, criteria.size(), title, titleEn, pointsRequiredToPass, gradingCriterionPointTemplates);
gradingCriterionTemplate.setFlag(flag);
criteria.add(gradingCriterionTemplate);
return gradingCriterionTemplate;
}
public GradingCriterionTemplate addIndividualCriterion(String title, String titleEn, int pointsRequiredToPass, List<GradingCriterionPointTemplate> gradingCriterionPointTemplates) {
return addIndividualCriterion(title, titleEn, pointsRequiredToPass, gradingCriterionPointTemplates, null);
}
public GradingCriterionTemplate addIndividualCriterion(String title, String titleEn, int pointsRequiredToPass, List<GradingCriterionPointTemplate> gradingCriterionPointTemplates, AbstractGradingCriterion.Flag flag) {
GradingCriterionTemplate gradingCriterionTemplate = new IndividualGradingCriterionTemplate(this, criteria.size(), title, titleEn, pointsRequiredToPass, gradingCriterionPointTemplates);
gradingCriterionTemplate.setFlag(flag);
criteria.add(gradingCriterionTemplate);
return gradingCriterionTemplate;
}

View File

@ -75,20 +75,27 @@ public class GradingReportTemplateRepoImpl extends GenericRepo<GradingReportTemp
.stream()
.map(this::toPointTemplate)
.toList();
AbstractGradingCriterion.Flag flag = criteria.flag() == null ? null : switch (criteria.flag()) {
case OPPOSITION -> AbstractGradingCriterion.Flag.OPPOSITION;
case REFLECTION -> AbstractGradingCriterion.Flag.REFLECTION;
//case null -> null; sigh java 17
};
switch (criteria.type()) {
case THESIS -> {
gradingReportTemplate.addProjectCriterion(
criteria.title().swedish(),
criteria.title().english(),
criteria.minimumPointsRequiredToPass(),
pointTemplates);
pointTemplates,
flag);
}
case INDIVIDUAL -> {
gradingReportTemplate.addIndividualCriterion(
criteria.title().swedish(),
criteria.title().english(),
criteria.minimumPointsRequiredToPass(),
pointTemplates);
pointTemplates,
flag);
}
}
}

View File

@ -0,0 +1,4 @@
ALTER TABLE `grading_criterion_template`
ADD COLUMN `flag` VARCHAR(64);
ALTER TABLE `GradingCriterion`
ADD COLUMN `flag` VARCHAR(64);

View File

@ -85,6 +85,10 @@ class EditingGradingTemplate implements Serializable {
Point editingPoint = new Point(point);
this.points.add(editingPoint);
}
this.flag = criteria.getFlag() == null ? null : switch (criteria.getFlag()) {
case OPPOSITION -> Flag.OPPOSITION;
case REFLECTION -> Flag.REFLECTION;
};
}
private Criteria() {}

View File

@ -10,3 +10,4 @@ Type.PROJECT=Once per thesis
Type.INDIVIDUAL=Individually for each author
minimum.Required=You must set the minimum number of points for each grade
grade.Required=You must set the letter for each grade
flag.nullValid=None

View File

@ -121,7 +121,7 @@ public class CriteriaPanel extends GenericPanel<SupervisorGradingReport> {
grading.add(pf);
grading.add(new Label("pfCriteria", item.getModel().combineWith(language, (gc, lang) -> gc.getGradingCriterionPoints().get(1).getDescription(lang))));
if (item.getModelObject().getTitle().startsWith("Ö1 ")) {
if (item.getModelObject().getFlag() == AbstractGradingCriterion.Flag.OPPOSITION) {
grading.setEnabled(false);
}
item.add(new AjaxConfirmationLink<>("enable", "Are you sure you want to grade this criteria? It is usually filled in by the seminar supervisor") {
@ -194,7 +194,7 @@ public class CriteriaPanel extends GenericPanel<SupervisorGradingReport> {
@Override
protected void onConfigure() {
super.onConfigure();
final boolean isOppositionCriteria = gradingCriterion.getObject().getTitle().startsWith("Ö1 ");
final boolean isOppositionCriteria = gradingCriterion.getObject().getFlag() == AbstractGradingCriterion.Flag.OPPOSITION;
setVisibilityAllowed(isOppositionCriteria && isEnabledInHierarchy());
}