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; package se.su.dsv.scipro.report;
import jakarta.persistence.Basic; import jakarta.persistence.Basic;
import jakarta.persistence.Column;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.MappedSuperclass; import jakarta.persistence.MappedSuperclass;
@MappedSuperclass @MappedSuperclass
public abstract class AbstractGradingCriterion extends AbstractCriterion { public abstract class AbstractGradingCriterion extends AbstractCriterion {
public enum Flag {
/**
* Criterion marked with this flag will extra functionality related
* 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) @Basic(optional = false)
protected int pointsRequiredToPass; protected int pointsRequiredToPass;
@Basic @Basic
private boolean fx = true; private boolean fx = true;
@Basic
@Column(name = "flag")
@Enumerated(EnumType.STRING)
private Flag flag;
protected AbstractGradingCriterion() { protected AbstractGradingCriterion() {
} }
@ -21,6 +46,17 @@ public abstract class AbstractGradingCriterion extends AbstractCriterion {
this.pointsRequiredToPass = pointsRequiredToPass; 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 isProjectCriterion();
public abstract boolean isIndividualCriterion(); public abstract boolean isIndividualCriterion();
@ -35,6 +71,14 @@ public abstract class AbstractGradingCriterion extends AbstractCriterion {
return this.fx; return this.fx;
} }
public Flag getFlag() {
return flag;
}
public void setFlag(Flag flag) {
this.flag = flag;
}
@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

@ -30,7 +30,7 @@ public abstract class GradingCriterion extends AbstractGradingCriterion {
} }
GradingCriterion(GradingReport gradingReport, GradingCriterionTemplate gradingCriterionTemplate) { 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; this.gradingReport = gradingReport;
for (GradingCriterionPointTemplate pointTemplate : gradingCriterionTemplate.getGradingCriterionPointTemplates()) { for (GradingCriterionPointTemplate pointTemplate : gradingCriterionTemplate.getGradingCriterionPointTemplates()) {
gradingCriterionPoints.add(new GradingCriterionPoint( 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) { 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 gradingCriterionTemplate = new ProjectGradingCriterionTemplate(this, criteria.size(), title, titleEn, pointsRequiredToPass, gradingCriterionPointTemplates);
gradingCriterionTemplate.setFlag(flag);
criteria.add(gradingCriterionTemplate); criteria.add(gradingCriterionTemplate);
return gradingCriterionTemplate; return gradingCriterionTemplate;
} }
public GradingCriterionTemplate addIndividualCriterion(String title, String titleEn, int pointsRequiredToPass, List<GradingCriterionPointTemplate> gradingCriterionPointTemplates) { 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 gradingCriterionTemplate = new IndividualGradingCriterionTemplate(this, criteria.size(), title, titleEn, pointsRequiredToPass, gradingCriterionPointTemplates);
gradingCriterionTemplate.setFlag(flag);
criteria.add(gradingCriterionTemplate); criteria.add(gradingCriterionTemplate);
return gradingCriterionTemplate; return gradingCriterionTemplate;
} }

View File

@ -75,20 +75,27 @@ public class GradingReportTemplateRepoImpl extends GenericRepo<GradingReportTemp
.stream() .stream()
.map(this::toPointTemplate) .map(this::toPointTemplate)
.toList(); .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()) { switch (criteria.type()) {
case THESIS -> { case THESIS -> {
gradingReportTemplate.addProjectCriterion( gradingReportTemplate.addProjectCriterion(
criteria.title().swedish(), criteria.title().swedish(),
criteria.title().english(), criteria.title().english(),
criteria.minimumPointsRequiredToPass(), criteria.minimumPointsRequiredToPass(),
pointTemplates); pointTemplates,
flag);
} }
case INDIVIDUAL -> { case INDIVIDUAL -> {
gradingReportTemplate.addIndividualCriterion( gradingReportTemplate.addIndividualCriterion(
criteria.title().swedish(), criteria.title().swedish(),
criteria.title().english(), criteria.title().english(),
criteria.minimumPointsRequiredToPass(), 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); Point editingPoint = new Point(point);
this.points.add(editingPoint); this.points.add(editingPoint);
} }
this.flag = criteria.getFlag() == null ? null : switch (criteria.getFlag()) {
case OPPOSITION -> Flag.OPPOSITION;
case REFLECTION -> Flag.REFLECTION;
};
} }
private Criteria() {} private Criteria() {}

View File

@ -10,3 +10,4 @@ Type.PROJECT=Once per thesis
Type.INDIVIDUAL=Individually for each author Type.INDIVIDUAL=Individually for each author
minimum.Required=You must set the minimum number of points for each grade minimum.Required=You must set the minimum number of points for each grade
grade.Required=You must set the letter 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(pf);
grading.add(new Label("pfCriteria", item.getModel().combineWith(language, (gc, lang) -> gc.getGradingCriterionPoints().get(1).getDescription(lang)))); 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); 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") { 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 @Override
protected void onConfigure() { protected void onConfigure() {
super.onConfigure(); super.onConfigure();
final boolean isOppositionCriteria = gradingCriterion.getObject().getTitle().startsWith("Ö1 "); final boolean isOppositionCriteria = gradingCriterion.getObject().getFlag() == AbstractGradingCriterion.Flag.OPPOSITION;
setVisibilityAllowed(isOppositionCriteria && isEnabledInHierarchy()); setVisibilityAllowed(isOppositionCriteria && isEnabledInHierarchy());
} }