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

View File

@ -1,8 +1,8 @@
package se.su.dsv.scipro.report;
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> {
GradingReportTemplate findByProjectTypeAndCredits(ProjectType projectType, int credits);
GradingReportTemplate getTemplate(Project project);
}

View File

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

View File

@ -33,7 +33,7 @@ public class OppositionReportServiceImpl implements OppositionReportService {
if (oppositionReport != null) {
return oppositionReport;
} else {
OppositionReport newReport = gradingReportTemplateRepo.findByProjectTypeAndCredits(finalSeminarOpposition.getProjectType(), finalSeminarOpposition.getProject().getCredits())
OppositionReport newReport = gradingReportTemplateRepo.getTemplate(finalSeminarOpposition.getProject())
.createOppositionReport(finalSeminarOpposition);
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.FinalSeminarOpposition;
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.ProjectType;
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.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@ExtendWith(MockitoExtension.class)
public class OppositionReportServiceImplTest {
@ -73,7 +73,7 @@ public class OppositionReportServiceImplTest {
public void create_report_if_not_existing() {
GradingReportTemplate template = Mockito.mock(GradingReportTemplate.class);
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);
assertEquals(oppositionReport, oppositionReportService.findOrCreateReport(createFinalSeminarOpposition()));
}