Allow supervisors to request improvements from final seminar opponents #78
@ -2,8 +2,10 @@ package se.su.dsv.scipro.finalseminar;
|
|||||||
|
|
||||||
import com.google.common.eventbus.EventBus;
|
import com.google.common.eventbus.EventBus;
|
||||||
import com.querydsl.core.BooleanBuilder;
|
import com.querydsl.core.BooleanBuilder;
|
||||||
|
import com.querydsl.core.types.SubQueryExpressionImpl;
|
||||||
import com.querydsl.core.types.dsl.BooleanExpression;
|
import com.querydsl.core.types.dsl.BooleanExpression;
|
||||||
import com.querydsl.core.types.dsl.Expressions;
|
import com.querydsl.core.types.dsl.Expressions;
|
||||||
|
import com.querydsl.jpa.JPAExpressions;
|
||||||
import jakarta.inject.Inject;
|
import jakarta.inject.Inject;
|
||||||
import jakarta.inject.Provider;
|
import jakarta.inject.Provider;
|
||||||
import jakarta.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
@ -543,8 +545,15 @@ public class FinalSeminarServiceImpl extends AbstractServiceImpl<FinalSeminar, L
|
|||||||
|
|
||||||
private BooleanExpression unfinishedSeminars(Date after, Date before) {
|
private BooleanExpression unfinishedSeminars(Date after, Date before) {
|
||||||
QFinalSeminar seminar = QFinalSeminar.finalSeminar;
|
QFinalSeminar seminar = QFinalSeminar.finalSeminar;
|
||||||
|
QFinalSeminarOpposition opposition = QFinalSeminarOpposition.finalSeminarOpposition;
|
||||||
BooleanExpression ungradedParticipant = Expressions.anyOf(
|
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.activeParticipations.any().grade.isNull(),
|
||||||
seminar.respondents.any().grade.isNull()
|
seminar.respondents.any().grade.isNull()
|
||||||
);
|
);
|
||||||
|
@ -8,6 +8,7 @@ import static se.su.dsv.scipro.test.Matchers.isRight;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import jakarta.inject.Inject;
|
import jakarta.inject.Inject;
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.Month;
|
import java.time.Month;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
@ -30,6 +31,9 @@ public class FinalSeminarServiceImplIntegrationTest extends IntegrationTest {
|
|||||||
@Inject
|
@Inject
|
||||||
private FinalSeminarService finalSeminarService;
|
private FinalSeminarService finalSeminarService;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private FinalSeminarOppositionService finalSeminarOppositionService;
|
||||||
|
|
||||||
private ProjectType projectType;
|
private ProjectType projectType;
|
||||||
private FinalSeminar futureFinalSeminar;
|
private FinalSeminar futureFinalSeminar;
|
||||||
private User user;
|
private User user;
|
||||||
@ -309,6 +313,43 @@ public class FinalSeminarServiceImplIntegrationTest extends IntegrationTest {
|
|||||||
assertThat(finalSeminarService.canOppose(user, finalSeminar, otherProject), isRight(anything()));
|
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) {
|
private FinalSeminar createFutureFinalSeminarSomeDaysAgo(final int daysAgo) {
|
||||||
FinalSeminar finalSeminar = initFinalSeminar(createProject(), 5);
|
FinalSeminar finalSeminar = initFinalSeminar(createProject(), 5);
|
||||||
final Date dateCreated = Date.from(ZonedDateTime.now().minusDays(daysAgo).toInstant());
|
final Date dateCreated = Date.from(ZonedDateTime.now().minusDays(daysAgo).toInstant());
|
||||||
@ -340,10 +381,10 @@ public class FinalSeminarServiceImplIntegrationTest extends IntegrationTest {
|
|||||||
save(seminar);
|
save(seminar);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addOpposition(FinalSeminar seminar, FinalSeminarGrade grade) {
|
private FinalSeminarOpposition addOpposition(FinalSeminar seminar, FinalSeminarGrade grade) {
|
||||||
FinalSeminarOpposition opposition = createOpposition(seminar);
|
FinalSeminarOpposition opposition = createOpposition(seminar);
|
||||||
opposition.setGrade(grade);
|
opposition.setGrade(grade);
|
||||||
save(opposition);
|
return save(opposition);
|
||||||
}
|
}
|
||||||
|
|
||||||
private OppositionReport createOppositionReport(FinalSeminarOpposition opposition) {
|
private OppositionReport createOppositionReport(FinalSeminarOpposition opposition) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user