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
9 changed files with 76 additions and 35 deletions
Showing only changes of commit 4e9e35a99a - Show all commits

View File

@ -25,6 +25,8 @@ import se.su.dsv.scipro.report.GradingReportTemplateRepo;
import se.su.dsv.scipro.report.GradingReportTemplateRepoImpl; import se.su.dsv.scipro.report.GradingReportTemplateRepoImpl;
import se.su.dsv.scipro.report.OppositionReportRepo; import se.su.dsv.scipro.report.OppositionReportRepo;
import se.su.dsv.scipro.report.OppositionReportRepoImpl; import se.su.dsv.scipro.report.OppositionReportRepoImpl;
import se.su.dsv.scipro.report.SupervisorGradingReportRepository;
import se.su.dsv.scipro.report.SupervisorGradingReportRepositoryImpl;
import se.su.dsv.scipro.reviewing.DecisionRepository; import se.su.dsv.scipro.reviewing.DecisionRepository;
import se.su.dsv.scipro.reviewing.DecisionRepositoryImpl; import se.su.dsv.scipro.reviewing.DecisionRepositoryImpl;
import se.su.dsv.scipro.reviewing.ReviewerTargetRepository; import se.su.dsv.scipro.reviewing.ReviewerTargetRepository;
@ -59,5 +61,6 @@ public class RepositoryModule extends AbstractModule {
bind(FinalSeminarRepository.class).to(FinalSeminarRepositoryImpl.class); bind(FinalSeminarRepository.class).to(FinalSeminarRepositoryImpl.class);
bind(ReviewerTargetRepository.class).to(ReviewerTargetRepositoryImpl.class); bind(ReviewerTargetRepository.class).to(ReviewerTargetRepositoryImpl.class);
bind(DecisionRepository.class).to(DecisionRepositoryImpl.class); bind(DecisionRepository.class).to(DecisionRepositoryImpl.class);
bind(SupervisorGradingReportRepository.class).to(SupervisorGradingReportRepositoryImpl.class);
} }
} }

View File

@ -3,14 +3,13 @@ package se.su.dsv.scipro.report;
import se.su.dsv.scipro.finalseminar.FinalSeminarOpposition; import se.su.dsv.scipro.finalseminar.FinalSeminarOpposition;
import se.su.dsv.scipro.grading.GradingBasis; import se.su.dsv.scipro.grading.GradingBasis;
import se.su.dsv.scipro.project.Project; import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.GenericService;
import se.su.dsv.scipro.system.User; import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.util.Either; import se.su.dsv.scipro.util.Either;
import java.time.Instant; import java.time.Instant;
import java.util.List; import java.util.List;
public interface GradingReportService extends GenericService<GradingReport, Long> { public interface GradingReportService {
SupervisorGradingReport getSupervisorGradingReport(Project project, User student); SupervisorGradingReport getSupervisorGradingReport(Project project, User student);

View File

@ -2,43 +2,42 @@ package se.su.dsv.scipro.report;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
import com.google.inject.persist.Transactional; import com.google.inject.persist.Transactional;
import jakarta.persistence.EntityManager;
import se.su.dsv.scipro.finalseminar.FinalSeminarOpposition; import se.su.dsv.scipro.finalseminar.FinalSeminarOpposition;
import se.su.dsv.scipro.grading.GradingBasis; import se.su.dsv.scipro.grading.GradingBasis;
import se.su.dsv.scipro.grading.ThesisSubmissionHistoryService; import se.su.dsv.scipro.grading.ThesisSubmissionHistoryService;
import se.su.dsv.scipro.project.Project; import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.AbstractServiceImpl;
import se.su.dsv.scipro.system.Language; import se.su.dsv.scipro.system.Language;
import se.su.dsv.scipro.system.User; import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.util.Either; import se.su.dsv.scipro.util.Either;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.inject.Provider;
import java.time.Clock; import java.time.Clock;
import java.time.Instant; import java.time.Instant;
import java.util.*; import java.util.*;
@Named public class GradingReportServiceImpl implements GradingReportService {
public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport, Long> implements GradingReportService {
public static final String OPPOSITION_SWEDISH = "Ö1 Oppositionsrapport"; public static final String OPPOSITION_SWEDISH = "Ö1 Oppositionsrapport";
public static final String OPPOSITION_ENGLISH = "Ö1 Opposition report"; 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;
private final SupervisorGradingReportRepository supervisorGradingReportRepository;
private final GradingReportTemplateRepo gradingReportTemplateRepo;
@Inject @Inject
public GradingReportServiceImpl( public GradingReportServiceImpl(
Provider<EntityManager> em,
EventBus eventBus, EventBus eventBus,
ThesisSubmissionHistoryService thesisSubmissionHistoryService, ThesisSubmissionHistoryService thesisSubmissionHistoryService,
Clock clock) Clock clock,
SupervisorGradingReportRepository supervisorGradingReportRepository,
GradingReportTemplateRepo gradingReportTemplateRepo)
{ {
super(em, GradingReport.class, QGradingReport.gradingReport);
this.eventBus = eventBus; this.eventBus = eventBus;
this.thesisSubmissionHistoryService = thesisSubmissionHistoryService; this.thesisSubmissionHistoryService = thesisSubmissionHistoryService;
this.clock = clock; this.clock = clock;
this.supervisorGradingReportRepository = supervisorGradingReportRepository;
this.gradingReportTemplateRepo = gradingReportTemplateRepo;
} }
@Override @Override
@ -49,7 +48,7 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
if (isOppositionCriterion && betterGrade) { if (isOppositionCriterion && betterGrade) {
gradingCriterion.setFeedback(opposition.getFeedback()); gradingCriterion.setFeedback(opposition.getFeedback());
gradingCriterion.setPoints(opposition.getPoints()); gradingCriterion.setPoints(opposition.getPoints());
save(report); supervisorGradingReportRepository.save(report);
return true; return true;
} }
} }
@ -88,7 +87,7 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
} }
supervisorGradingReport.setMotivation(gradingBasis.getOverallMotivation()); supervisorGradingReport.setMotivation(gradingBasis.getOverallMotivation());
supervisorGradingReport.setRejectionCommentFeedback(gradingBasis.getRejectionCommentFeedback()); supervisorGradingReport.setRejectionCommentFeedback(gradingBasis.getRejectionCommentFeedback());
save(supervisorGradingReport); supervisorGradingReportRepository.save(supervisorGradingReport);
} }
return getGradingBasis(project); return getGradingBasis(project);
} }
@ -138,22 +137,18 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
@Override @Override
@Transactional @Transactional
public SupervisorGradingReport getSupervisorGradingReport(Project project, User user) { public SupervisorGradingReport getSupervisorGradingReport(Project project, User user) {
SupervisorGradingReport supervisorGradingReport = from(QSupervisorGradingReport.supervisorGradingReport) SupervisorGradingReport supervisorGradingReport = supervisorGradingReportRepository.getReport(project, user);
.where(QSupervisorGradingReport.supervisorGradingReport.user.eq(user).and(
QSupervisorGradingReport.supervisorGradingReport.project.eq(project)))
.fetchOne();
if (supervisorGradingReport == null) { if (supervisorGradingReport == null) {
supervisorGradingReport = save(getTemplate(project).createSupervisorReport(project, user)); GradingReportTemplate template = getTemplate(project);
SupervisorGradingReport supervisorReport = template.createSupervisorReport(project, user);
supervisorGradingReport = supervisorGradingReportRepository.save(supervisorReport);
} }
return supervisorGradingReport; return supervisorGradingReport;
} }
@Override @Override
public GradingReportTemplate getTemplate(Project project) { public GradingReportTemplate getTemplate(Project project) {
QGradingReportTemplate template = QGradingReportTemplate.gradingReportTemplate; return gradingReportTemplateRepo.getTemplate(project);
return from(template)
.where(template.projectType.eq(project.getProjectType()).and(template.credits.eq(project.getCredits())))
.fetchOne();
} }
@Override @Override
@ -192,7 +187,7 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
rejectionCommentFeedback); rejectionCommentFeedback);
} }
save(supervisorGradingReport); supervisorGradingReportRepository.save(supervisorGradingReport);
return Either.right(supervisorGradingReport); return Either.right(supervisorGradingReport);
} }

View File

@ -1,8 +1,8 @@
package se.su.dsv.scipro.report; package se.su.dsv.scipro.report;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import se.su.dsv.scipro.system.ProjectType; import se.su.dsv.scipro.project.Project;
public interface GradingReportTemplateRepo extends JpaRepository<GradingReportTemplate, Long> { public interface GradingReportTemplateRepo extends JpaRepository<GradingReportTemplate, Long> {
GradingReportTemplate findByProjectTypeAndCredits(ProjectType projectType, int credits); GradingReportTemplate getTemplate(Project project);
} }

View File

@ -1,12 +1,11 @@
package se.su.dsv.scipro.report; package se.su.dsv.scipro.report;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.GenericRepo; import se.su.dsv.scipro.system.GenericRepo;
import se.su.dsv.scipro.system.ProjectType;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.inject.Provider; import jakarta.inject.Provider;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
public class GradingReportTemplateRepoImpl extends GenericRepo<GradingReportTemplate, Long> implements GradingReportTemplateRepo { public class GradingReportTemplateRepoImpl extends GenericRepo<GradingReportTemplate, Long> implements GradingReportTemplateRepo {
@Inject @Inject
@ -15,10 +14,8 @@ public class GradingReportTemplateRepoImpl extends GenericRepo<GradingReportTemp
} }
@Override @Override
public GradingReportTemplate findByProjectTypeAndCredits(ProjectType projectType, int credits) { public GradingReportTemplate getTemplate(Project project) {
TypedQuery<GradingReportTemplate> query = em().createQuery("select distinct template from GradingReportTemplate template where template.projectType = :projectType and template.credits = :credits", GradingReportTemplate.class); QGradingReportTemplate template = QGradingReportTemplate.gradingReportTemplate;
query.setParameter("projectType", projectType); return findOne(template.projectType.eq(project.getProjectType()).and(template.credits.eq(project.getCredits())));
query.setParameter("credits", credits);
return query.getSingleResult();
} }
} }

View File

@ -33,7 +33,7 @@ public class OppositionReportServiceImpl implements OppositionReportService {
if (oppositionReport != null) { if (oppositionReport != null) {
return oppositionReport; return oppositionReport;
} else { } else {
OppositionReport newReport = gradingReportTemplateRepo.findByProjectTypeAndCredits(finalSeminarOpposition.getProjectType(), finalSeminarOpposition.getProject().getCredits()) OppositionReport newReport = gradingReportTemplateRepo.getTemplate(finalSeminarOpposition.getProject())
.createOppositionReport(finalSeminarOpposition); .createOppositionReport(finalSeminarOpposition);
return oppositionReportRepo.save(newReport); return oppositionReportRepo.save(newReport);
} }

View File

@ -0,0 +1,10 @@
package se.su.dsv.scipro.report;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.User;
public interface SupervisorGradingReportRepository {
SupervisorGradingReport save(SupervisorGradingReport report);
SupervisorGradingReport getReport(Project project, User author);
}

View File

@ -0,0 +1,37 @@
package se.su.dsv.scipro.report;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.persistence.EntityManager;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.AbstractRepository;
import se.su.dsv.scipro.system.User;
public class SupervisorGradingReportRepositoryImpl extends AbstractRepository
implements SupervisorGradingReportRepository
{
@Inject
public SupervisorGradingReportRepositoryImpl(Provider<EntityManager> em) {
super(em);
}
@Override
public SupervisorGradingReport save(SupervisorGradingReport report) {
EntityManager entityManager = em();
if (entityManager.contains(report)) {
return entityManager.merge(report);
}
else {
entityManager.persist(report);
return report;
}
}
@Override
public SupervisorGradingReport getReport(Project project, User author) {
return from(QSupervisorGradingReport.supervisorGradingReport)
.where(QSupervisorGradingReport.supervisorGradingReport.user.eq(author).and(
QSupervisorGradingReport.supervisorGradingReport.project.eq(project)))
.fetchOne();
}
}

View File

@ -13,6 +13,7 @@ import se.su.dsv.scipro.file.FileService;
import se.su.dsv.scipro.finalseminar.FinalSeminar; import se.su.dsv.scipro.finalseminar.FinalSeminar;
import se.su.dsv.scipro.finalseminar.FinalSeminarOpposition; import se.su.dsv.scipro.finalseminar.FinalSeminarOpposition;
import se.su.dsv.scipro.finalseminar.FinalSeminarOppositionRepo; import se.su.dsv.scipro.finalseminar.FinalSeminarOppositionRepo;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.DegreeType; import se.su.dsv.scipro.system.DegreeType;
import se.su.dsv.scipro.system.ProjectType; import se.su.dsv.scipro.system.ProjectType;
import se.su.dsv.scipro.system.User; import se.su.dsv.scipro.system.User;
@ -25,7 +26,6 @@ import java.util.*;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
public class OppositionReportServiceImplTest { public class OppositionReportServiceImplTest {
@ -73,7 +73,7 @@ public class OppositionReportServiceImplTest {
public void create_report_if_not_existing() { public void create_report_if_not_existing() {
GradingReportTemplate template = Mockito.mock(GradingReportTemplate.class); GradingReportTemplate template = Mockito.mock(GradingReportTemplate.class);
Mockito.when(template.createOppositionReport(any(FinalSeminarOpposition.class))).thenReturn(oppositionReport); Mockito.when(template.createOppositionReport(any(FinalSeminarOpposition.class))).thenReturn(oppositionReport);
Mockito.when(gradingReportTemplateRepo.findByProjectTypeAndCredits(any(ProjectType.class), anyInt())).thenReturn(template); Mockito.when(gradingReportTemplateRepo.getTemplate(any(Project.class))).thenReturn(template);
Mockito.when(oppositionReportRepo.save(oppositionReport)).thenReturn(oppositionReport); Mockito.when(oppositionReportRepo.save(oppositionReport)).thenReturn(oppositionReport);
assertEquals(oppositionReport, oppositionReportService.findOrCreateReport(createFinalSeminarOpposition())); assertEquals(oppositionReport, oppositionReportService.findOrCreateReport(createFinalSeminarOpposition()));
} }