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 21 additions and 20 deletions
Showing only changes of commit 24b88c1d12 - Show all commits

View File

@ -10,6 +10,7 @@ import se.su.dsv.scipro.milestones.service.MilestoneActivityTemplateService;
import se.su.dsv.scipro.profiles.CurrentProfile; import se.su.dsv.scipro.profiles.CurrentProfile;
import se.su.dsv.scipro.profiles.Profiles; import se.su.dsv.scipro.profiles.Profiles;
import se.su.dsv.scipro.project.Project; import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.report.AbstractGradingCriterion;
import se.su.dsv.scipro.report.GradingCriterionPointTemplate; import se.su.dsv.scipro.report.GradingCriterionPointTemplate;
import se.su.dsv.scipro.report.GradingReportTemplate; import se.su.dsv.scipro.report.GradingReportTemplate;
import se.su.dsv.scipro.security.auth.roles.Roles; import se.su.dsv.scipro.security.auth.roles.Roles;
@ -403,7 +404,7 @@ public class DataInitializer implements Lifecycle {
.description("För 2 poäng krävs dessutom: att oppositionsrapporten ingående och välbalanserat beskriver styrkor och svagheter hos det utvärderade arbetet ur flera aspekter samt att den innehåller tydliga och välmotiverade förslag till förbättringar.") .description("För 2 poäng krävs dessutom: att oppositionsrapporten ingående och välbalanserat beskriver styrkor och svagheter hos det utvärderade arbetet ur flera aspekter samt att den innehåller tydliga och välmotiverade förslag till förbättringar.")
.descriptionEn("For 2 points the following is also required: that the opposition report thoroughly and in a well-balanced way describes from numerous aspects the strengths and weaknesses of the evaluated thesis and that it offers clear and well-motivated suggestions for improvements.") .descriptionEn("For 2 points the following is also required: that the opposition report thoroughly and in a well-balanced way describes from numerous aspects the strengths and weaknesses of the evaluated thesis and that it offers clear and well-motivated suggestions for improvements.")
.build()); .build());
gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, gradingCriterionPointTemplates); gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, gradingCriterionPointTemplates, AbstractGradingCriterion.Flag.OPPOSITION);
gradingCriterionPointTemplates = initPointTemplates(); gradingCriterionPointTemplates = initPointTemplates();
gradingCriterionPointTemplates.add(new GradingCriterionPointTemplate.Builder() gradingCriterionPointTemplates.add(new GradingCriterionPointTemplate.Builder()
@ -632,7 +633,8 @@ public class DataInitializer implements Lifecycle {
.description("För 2 poäng krävs dessutom: att oppositionsrapporten ingående och välbalanserat beskriver styrkor och svagheter hos det utvärderade arbetet ur flera aspekter samt att den innehåller tydliga och välmotiverade förslag till förbättringar.") .description("För 2 poäng krävs dessutom: att oppositionsrapporten ingående och välbalanserat beskriver styrkor och svagheter hos det utvärderade arbetet ur flera aspekter samt att den innehåller tydliga och välmotiverade förslag till förbättringar.")
.descriptionEn("For 2 points the following is also required: that the opposition report thoroughly and in a well-balanced way describes from numerous aspects the strengths and weaknesses of the evaluated thesis and that it offers clear and well-motivated suggestions for improvements.") .descriptionEn("For 2 points the following is also required: that the opposition report thoroughly and in a well-balanced way describes from numerous aspects the strengths and weaknesses of the evaluated thesis and that it offers clear and well-motivated suggestions for improvements.")
.build()); .build());
gradingReportTemplateMaster.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, gradingCriterionPointTemplates); gradingReportTemplateMaster.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, gradingCriterionPointTemplates,
AbstractGradingCriterion.Flag.OPPOSITION);
gradingCriterionPointTemplates = initPointTemplates(); gradingCriterionPointTemplates = initPointTemplates();
gradingCriterionPointTemplates.add(new GradingCriterionPointTemplate.Builder() gradingCriterionPointTemplates.add(new GradingCriterionPointTemplate.Builder()
@ -841,7 +843,8 @@ public class DataInitializer implements Lifecycle {
.description("För 2 poäng krävs dessutom: att oppositionsrapporten ingående och välbalanserat beskriver styrkor och svagheter hos det utvärderade arbetet ur flera aspekter samt att den innehåller tydliga och välmotiverade förslag till förbättringar.") .description("För 2 poäng krävs dessutom: att oppositionsrapporten ingående och välbalanserat beskriver styrkor och svagheter hos det utvärderade arbetet ur flera aspekter samt att den innehåller tydliga och välmotiverade förslag till förbättringar.")
.descriptionEn("For 2 points the following is also required: that the opposition report thoroughly and in a well-balanced way describes from numerous aspects the strengths and weaknesses of the evaluated thesis and that it offers clear and well-motivated suggestions for improvements.") .descriptionEn("For 2 points the following is also required: that the opposition report thoroughly and in a well-balanced way describes from numerous aspects the strengths and weaknesses of the evaluated thesis and that it offers clear and well-motivated suggestions for improvements.")
.build()); .build());
gradingReportTemplateMagister.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, gradingCriterionPointTemplates); gradingReportTemplateMagister.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, gradingCriterionPointTemplates,
AbstractGradingCriterion.Flag.OPPOSITION);
gradingCriterionPointTemplates = initPointTemplates(); gradingCriterionPointTemplates = initPointTemplates();
gradingCriterionPointTemplates.add(new GradingCriterionPointTemplate.Builder() gradingCriterionPointTemplates.add(new GradingCriterionPointTemplate.Builder()

View File

@ -23,8 +23,6 @@ import java.util.*;
public class GradingReportServiceImpl implements GradingReportTemplateService, GradingReportService { public class GradingReportServiceImpl implements GradingReportTemplateService, GradingReportService {
public static final String OPPOSITION_SWEDISH = "Ö1 Oppositionsrapport";
public static final String OPPOSITION_ENGLISH = "Ö1 Opposition report";
private final EventBus eventBus; private final EventBus eventBus;
private final ThesisSubmissionHistoryService thesisSubmissionHistoryService; private final ThesisSubmissionHistoryService thesisSubmissionHistoryService;
private final Clock clock; private final Clock clock;
@ -52,7 +50,7 @@ public class GradingReportServiceImpl implements GradingReportTemplateService, G
@Override @Override
public boolean updateOppositionCriteria(SupervisorGradingReport report, FinalSeminarOpposition opposition) { public boolean updateOppositionCriteria(SupervisorGradingReport report, FinalSeminarOpposition opposition) {
for (GradingCriterion gradingCriterion : report.getIndividualCriteria()) { for (GradingCriterion gradingCriterion : report.getIndividualCriteria()) {
boolean isOppositionCriterion = gradingCriterion.getTitle().equals(OPPOSITION_SWEDISH) || gradingCriterion.getTitle().equals(OPPOSITION_ENGLISH); boolean isOppositionCriterion = gradingCriterion.getFlag() == GradingCriterion.Flag.OPPOSITION;
boolean betterGrade = gradingCriterion.getPoints() == null || opposition.getPoints() > gradingCriterion.getPoints(); boolean betterGrade = gradingCriterion.getPoints() == null || opposition.getPoints() > gradingCriterion.getPoints();
if (isOppositionCriterion && betterGrade) { if (isOppositionCriterion && betterGrade) {
gradingCriterion.setFeedback(opposition.getFeedback()); gradingCriterion.setFeedback(opposition.getFeedback());

View File

@ -0,0 +1,2 @@
UPDATE `GradingCriterion` SET `flag` = 'OPPOSITION' WHERE title like 'Ö1 %';
UPDATE `grading_criterion_template` SET `flag` = 'OPPOSITION' WHERE title like 'Ö1 %';

View File

@ -22,8 +22,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static se.su.dsv.scipro.report.GradingReportServiceImpl.OPPOSITION_ENGLISH;
import static se.su.dsv.scipro.report.GradingReportServiceImpl.OPPOSITION_SWEDISH;
public class GradingReportServiceImplIntegrationTest extends IntegrationTest { public class GradingReportServiceImplIntegrationTest extends IntegrationTest {
@ -83,7 +81,7 @@ public class GradingReportServiceImplIntegrationTest extends IntegrationTest {
addOppositionCriterion(); addOppositionCriterion();
boolean updated = updateOppositionCriterion(); boolean updated = updateOppositionCriterion();
GradingCriterion oppositionCriterion = findOppositionCriterion(OPPOSITION_SWEDISH); GradingCriterion oppositionCriterion = findOppositionCriterion();
assert oppositionCriterion != null; assert oppositionCriterion != null;
assertEquals(FEEDBACK_ON_OPPOSITION, oppositionCriterion.getFeedback()); assertEquals(FEEDBACK_ON_OPPOSITION, oppositionCriterion.getFeedback());
assertEquals((Integer) OPPOSITION_CRITERION_POINTS, oppositionCriterion.getPoints()); assertEquals((Integer) OPPOSITION_CRITERION_POINTS, oppositionCriterion.getPoints());
@ -95,7 +93,7 @@ public class GradingReportServiceImplIntegrationTest extends IntegrationTest {
addOppositionCriterion(); addOppositionCriterion();
boolean updated = updateOppositionCriterion(); boolean updated = updateOppositionCriterion();
GradingCriterion oppositionCriterion = findEnglishOppositionCriterion(OPPOSITION_ENGLISH); GradingCriterion oppositionCriterion = findEnglishOppositionCriterion("Ö1 Opposition report");
assert oppositionCriterion != null; assert oppositionCriterion != null;
assertEquals(FEEDBACK_ON_OPPOSITION, oppositionCriterion.getFeedback()); assertEquals(FEEDBACK_ON_OPPOSITION, oppositionCriterion.getFeedback());
assertEquals((Integer) OPPOSITION_CRITERION_POINTS, oppositionCriterion.getPoints()); assertEquals((Integer) OPPOSITION_CRITERION_POINTS, oppositionCriterion.getPoints());
@ -108,7 +106,7 @@ public class GradingReportServiceImplIntegrationTest extends IntegrationTest {
assessAllCriteria(gradingReport); assessAllCriteria(gradingReport);
boolean updated = updateOppositionCriterion(); boolean updated = updateOppositionCriterion();
GradingCriterion oppositionCriterion = findOppositionCriterion(OPPOSITION_SWEDISH); GradingCriterion oppositionCriterion = findOppositionCriterion();
assert oppositionCriterion != null; assert oppositionCriterion != null;
assertEquals(FEEDBACK, oppositionCriterion.getFeedback()); assertEquals(FEEDBACK, oppositionCriterion.getFeedback());
assertEquals((Integer) oppositionCriterion.getMaxPoints(), oppositionCriterion.getPoints()); assertEquals((Integer) oppositionCriterion.getMaxPoints(), oppositionCriterion.getPoints());
@ -122,7 +120,7 @@ public class GradingReportServiceImplIntegrationTest extends IntegrationTest {
setPointsOnAllCriteria(gradingReport, 1); setPointsOnAllCriteria(gradingReport, 1);
updateOppositionCriterion(); updateOppositionCriterion();
GradingCriterion oppositionCriterion = findOppositionCriterion(OPPOSITION_SWEDISH); GradingCriterion oppositionCriterion = findOppositionCriterion();
assert oppositionCriterion != null; assert oppositionCriterion != null;
assertEquals(FEEDBACK_ON_OPPOSITION, oppositionCriterion.getFeedback()); assertEquals(FEEDBACK_ON_OPPOSITION, oppositionCriterion.getFeedback());
assertEquals(OPPOSITION_CRITERION_POINTS, oppositionCriterion.getPoints()); assertEquals(OPPOSITION_CRITERION_POINTS, oppositionCriterion.getPoints());
@ -135,7 +133,7 @@ public class GradingReportServiceImplIntegrationTest extends IntegrationTest {
setPointsOnAllCriteria(gradingReport, points); setPointsOnAllCriteria(gradingReport, points);
updateOppositionCriterion(); updateOppositionCriterion();
GradingCriterion oppositionCriterion = findOppositionCriterion(OPPOSITION_SWEDISH); GradingCriterion oppositionCriterion = findOppositionCriterion();
assert oppositionCriterion != null; assert oppositionCriterion != null;
assertEquals((Integer) points, oppositionCriterion.getPoints()); assertEquals((Integer) points, oppositionCriterion.getPoints());
assertNull(oppositionCriterion.getFeedback()); assertNull(oppositionCriterion.getFeedback());
@ -151,9 +149,9 @@ public class GradingReportServiceImplIntegrationTest extends IntegrationTest {
return gradingReportService.updateOppositionCriteria(gradingReport, opposition); return gradingReportService.updateOppositionCriteria(gradingReport, opposition);
} }
private GradingCriterion findOppositionCriterion(String title) { private GradingCriterion findOppositionCriterion() {
for (GradingCriterion gradingCriterion : gradingReport.getIndividualCriteria()) { for (GradingCriterion gradingCriterion : gradingReport.getIndividualCriteria()) {
if (gradingCriterion.getTitle().equals(title)) { if (gradingCriterion.getFlag() == AbstractGradingCriterion.Flag.OPPOSITION) {
return gradingCriterion; return gradingCriterion;
} }
} }
@ -247,7 +245,7 @@ public class GradingReportServiceImplIntegrationTest extends IntegrationTest {
private GradingReportTemplate createOppositionCriteria(GradingReportTemplate gradingReportTemplate, int maxPoints) { private GradingReportTemplate createOppositionCriteria(GradingReportTemplate gradingReportTemplate, int maxPoints) {
List<GradingCriterionPointTemplate> gradingCriterionPointTemplates = getPointTemplates(maxPoints, "Opposition"); List<GradingCriterionPointTemplate> gradingCriterionPointTemplates = getPointTemplates(maxPoints, "Opposition");
gradingReportTemplate.addIndividualCriterion(OPPOSITION_SWEDISH, OPPOSITION_ENGLISH, 0, gradingCriterionPointTemplates); gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 0, gradingCriterionPointTemplates, AbstractGradingCriterion.Flag.OPPOSITION);
return save(gradingReportTemplate); return save(gradingReportTemplate);
} }

View File

@ -74,7 +74,7 @@ public class SupervisorGradingReportTest {
gradingReportTemplate.addProjectCriterion("U12 Källhänvisningar och dokumentation", "U12 References and documentation", 1, getPointTemplates(1)).setFx(false); gradingReportTemplate.addProjectCriterion("U12 Källhänvisningar och dokumentation", "U12 References and documentation", 1, getPointTemplates(1)).setFx(false);
gradingReportTemplate.addProjectCriterion("U13 Originalitet och signifikans", "U13 Originality and significance", 0, getPointTemplates(3)).setFx(false); gradingReportTemplate.addProjectCriterion("U13 Originalitet och signifikans", "U13 Originality and significance", 0, getPointTemplates(3)).setFx(false);
gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, getPointTemplates(2)); gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, getPointTemplates(2), AbstractGradingCriterion.Flag.OPPOSITION);
gradingReportTemplate.addIndividualCriterion("Ö2 Presentationer", "Ö2 Presentations", 1, getPointTemplates(1)); gradingReportTemplate.addIndividualCriterion("Ö2 Presentationer", "Ö2 Presentations", 1, getPointTemplates(1));
gradingReportTemplate.addIndividualCriterion("Ö3 Aktivitet vid seminarier och möten", "Ö3 Participation in seminars and meetings", 1, getPointTemplates(1)); gradingReportTemplate.addIndividualCriterion("Ö3 Aktivitet vid seminarier och möten", "Ö3 Participation in seminars and meetings", 1, getPointTemplates(1));
gradingReportTemplate.addIndividualCriterion("Ö4 Deadlines", "Ö4 Deadlines", 0, getPointTemplates(1)).setFx(false); gradingReportTemplate.addIndividualCriterion("Ö4 Deadlines", "Ö4 Deadlines", 0, getPointTemplates(1)).setFx(false);

View File

@ -104,7 +104,7 @@ public class SupervisorBachelorGradeCalculatorTest extends GradeCalculatorTest {
gradingReportTemplate.addProjectCriterion("U12 Källhänvisningar och dokumentation", "U12 References and documentation", 1, getPointTemplates(1)); gradingReportTemplate.addProjectCriterion("U12 Källhänvisningar och dokumentation", "U12 References and documentation", 1, getPointTemplates(1));
gradingReportTemplate.addProjectCriterion("U13 Originalitet och signifikans", "U13 Originality and significance", 0, getPointTemplates(3)).setFx(false); gradingReportTemplate.addProjectCriterion("U13 Originalitet och signifikans", "U13 Originality and significance", 0, getPointTemplates(3)).setFx(false);
gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, getPointTemplates(2)); gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, getPointTemplates(2), AbstractGradingCriterion.Flag.OPPOSITION);
gradingReportTemplate.addIndividualCriterion("Ö2 Presentationer", "Ö2 Presentations", 1, getPointTemplates(1)); gradingReportTemplate.addIndividualCriterion("Ö2 Presentationer", "Ö2 Presentations", 1, getPointTemplates(1));
gradingReportTemplate.addIndividualCriterion("Ö3 Aktivitet vid seminarier och möten", "Ö3 Participation in seminars and meetings", 1, getPointTemplates(1)); gradingReportTemplate.addIndividualCriterion("Ö3 Aktivitet vid seminarier och möten", "Ö3 Participation in seminars and meetings", 1, getPointTemplates(1));
gradingReportTemplate.addIndividualCriterion("Ö4 Deadlines", "Ö4 Deadlines", 0, getPointTemplates(1)).setFx(false); gradingReportTemplate.addIndividualCriterion("Ö4 Deadlines", "Ö4 Deadlines", 0, getPointTemplates(1)).setFx(false);

View File

@ -91,7 +91,7 @@ public class SupervisorMaster15GradeCalculatorTest extends GradeCalculatorTest {
gradingReportTemplate.addProjectCriterion("U12 Källhänvisningar och dokumentation", "U12 References and documentation", 1, getPointTemplates(1)); gradingReportTemplate.addProjectCriterion("U12 Källhänvisningar och dokumentation", "U12 References and documentation", 1, getPointTemplates(1));
gradingReportTemplate.addProjectCriterion("U13 Originalitet och signifikans", "U13 Originality and significance", 1, getPointTemplates(3)); gradingReportTemplate.addProjectCriterion("U13 Originalitet och signifikans", "U13 Originality and significance", 1, getPointTemplates(3));
gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, getPointTemplates(2)); gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, getPointTemplates(2), AbstractGradingCriterion.Flag.OPPOSITION);
gradingReportTemplate.addIndividualCriterion("Ö2 Presentationer", "Ö2 Presentations", 1, getPointTemplates(1)); gradingReportTemplate.addIndividualCriterion("Ö2 Presentationer", "Ö2 Presentations", 1, getPointTemplates(1));
gradingReportTemplate.addIndividualCriterion("Ö3 Aktivitet vid seminarier och möten", "Ö3 Participation in seminars and meetings", 1, getPointTemplates(1)); gradingReportTemplate.addIndividualCriterion("Ö3 Aktivitet vid seminarier och möten", "Ö3 Participation in seminars and meetings", 1, getPointTemplates(1));
gradingReportTemplate.addIndividualCriterion("Ö4 Deadlines", "Ö4 Deadlines", 0, getPointTemplates(1)).setFx(false); gradingReportTemplate.addIndividualCriterion("Ö4 Deadlines", "Ö4 Deadlines", 0, getPointTemplates(1)).setFx(false);

View File

@ -91,7 +91,7 @@ public class SupervisorMaster30GradeCalculatorTest extends GradeCalculatorTest {
gradingReportTemplate.addProjectCriterion("U12 Källhänvisningar och dokumentation", "U12 References and documentation", 1, getPointTemplates(1)); gradingReportTemplate.addProjectCriterion("U12 Källhänvisningar och dokumentation", "U12 References and documentation", 1, getPointTemplates(1));
gradingReportTemplate.addProjectCriterion("U13 Originalitet och signifikans", "U13 Originality and significance", 2, getPointTemplates(4)); gradingReportTemplate.addProjectCriterion("U13 Originalitet och signifikans", "U13 Originality and significance", 2, getPointTemplates(4));
gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, getPointTemplates(2)); gradingReportTemplate.addIndividualCriterion("Ö1 Oppositionsrapport", "Ö1 Opposition report", 1, getPointTemplates(2), AbstractGradingCriterion.Flag.OPPOSITION);
gradingReportTemplate.addIndividualCriterion("Ö2 Presentationer", "Ö2 Presentations", 1, getPointTemplates(1)); gradingReportTemplate.addIndividualCriterion("Ö2 Presentationer", "Ö2 Presentations", 1, getPointTemplates(1));
gradingReportTemplate.addIndividualCriterion("Ö3 Aktivitet vid seminarier och möten", "Ö3 Participation in seminars and meetings", 1, getPointTemplates(1)); gradingReportTemplate.addIndividualCriterion("Ö3 Aktivitet vid seminarier och möten", "Ö3 Participation in seminars and meetings", 1, getPointTemplates(1));
gradingReportTemplate.addIndividualCriterion("Ö4 Deadlines", "Ö4 Deadlines", 0, getPointTemplates(1)); gradingReportTemplate.addIndividualCriterion("Ö4 Deadlines", "Ö4 Deadlines", 0, getPointTemplates(1));