Allows admins to manage grading report templates #14
@ -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;
|
||||||
|
@ -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(
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
ALTER TABLE `grading_criterion_template`
|
||||||
|
ADD COLUMN `flag` VARCHAR(64);
|
||||||
|
ALTER TABLE `GradingCriterion`
|
||||||
|
ADD COLUMN `flag` VARCHAR(64);
|
@ -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() {}
|
||||||
|
@ -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
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user