Allow supervisors to request improvements from final seminar opponents #78

Merged
niat8586 merged 41 commits from opponent-completion into develop 2025-03-05 10:05:38 +01:00
2 changed files with 53 additions and 3 deletions
Showing only changes of commit 305142a862 - Show all commits

View File

@ -2,8 +2,10 @@ package se.su.dsv.scipro.finalseminar;
import com.google.common.eventbus.EventBus;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.SubQueryExpressionImpl;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.jpa.JPAExpressions;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.persistence.EntityManager;
@ -543,8 +545,15 @@ public class FinalSeminarServiceImpl extends AbstractServiceImpl<FinalSeminar, L
private BooleanExpression unfinishedSeminars(Date after, Date before) {
QFinalSeminar seminar = QFinalSeminar.finalSeminar;
QFinalSeminarOpposition opposition = QFinalSeminarOpposition.finalSeminarOpposition;
BooleanExpression ungradedParticipant = Expressions.anyOf(
seminar.oppositions.any().grade.isNull(),
seminar.oppositions
.any()
.id.in(
JPAExpressions.select(opposition.id)
.from(opposition)
.where(opposition.grade.isNull().and(opposition.improvementsRequestedAt.isNull()))
),
seminar.activeParticipations.any().grade.isNull(),
seminar.respondents.any().grade.isNull()
);

View File

@ -8,6 +8,7 @@ import static se.su.dsv.scipro.test.Matchers.isRight;
import com.google.common.collect.Lists;
import jakarta.inject.Inject;
import java.time.Duration;
import java.time.LocalDate;
import java.time.Month;
import java.time.ZonedDateTime;
@ -30,6 +31,9 @@ public class FinalSeminarServiceImplIntegrationTest extends IntegrationTest {
@Inject
private FinalSeminarService finalSeminarService;
@Inject
private FinalSeminarOppositionService finalSeminarOppositionService;
private ProjectType projectType;
private FinalSeminar futureFinalSeminar;
private User user;
@ -309,6 +313,43 @@ public class FinalSeminarServiceImplIntegrationTest extends IntegrationTest {
assertThat(finalSeminarService.canOppose(user, finalSeminar, otherProject), isRight(anything()));
}
@Test
public void seminar_is_not_unfinished_if_opponent_has_improvements_requested() {
FinalSeminar seminar = createFinalSeminar(createProject(), -6);
FinalSeminarOpposition finalSeminarOpposition = addOpposition(seminar, null);
addOppositionReport(finalSeminarOpposition);
Date after = Date.from(seminar.getStartDate().toInstant().minus(Duration.ofDays(1)));
Date before = Date.from(seminar.getStartDate().toInstant().plus(Duration.ofDays(1)));
List<FinalSeminar> unfinishedSeminars = finalSeminarService.findUnfinishedSeminars(
after,
before,
new PageRequest(0, 5)
);
assertThat(unfinishedSeminars, hasItem(seminar));
finalSeminarOppositionService.requestImprovements(finalSeminarOpposition, "improvements");
List<FinalSeminar> afterImprovements = finalSeminarService.findUnfinishedSeminars(
after,
before,
new PageRequest(0, 5)
);
assertThat(afterImprovements, not(hasItem(seminar)));
}
private static void addOppositionReport(FinalSeminarOpposition finalSeminarOpposition) {
GradingReportTemplate gradingReportTemplate = new GradingReportTemplate(
finalSeminarOpposition.getProjectType(),
LocalDate.now()
);
OppositionReport oppositionReport = new OppositionReport(gradingReportTemplate, finalSeminarOpposition);
finalSeminarOpposition.setOppositionReport(oppositionReport);
}
private FinalSeminar createFutureFinalSeminarSomeDaysAgo(final int daysAgo) {
FinalSeminar finalSeminar = initFinalSeminar(createProject(), 5);
final Date dateCreated = Date.from(ZonedDateTime.now().minusDays(daysAgo).toInstant());
@ -340,10 +381,10 @@ public class FinalSeminarServiceImplIntegrationTest extends IntegrationTest {
save(seminar);
}
private void addOpposition(FinalSeminar seminar, FinalSeminarGrade grade) {
private FinalSeminarOpposition addOpposition(FinalSeminar seminar, FinalSeminarGrade grade) {
FinalSeminarOpposition opposition = createOpposition(seminar);
opposition.setGrade(grade);
save(opposition);
return save(opposition);
}
private OppositionReport createOppositionReport(FinalSeminarOpposition opposition) {