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