This commit is contained in:
Andreas Svanberg 2024-01-09 14:24:27 +01:00
parent 60a70da3db
commit 59a215422f
6 changed files with 15 additions and 62 deletions
core/src/main/java/se/su/dsv/scipro/finalseminar
view/src
main/java/se/su/dsv/scipro
test/java/se/su/dsv/scipro

@ -39,7 +39,7 @@ public interface FinalSeminarService extends GenericService<FinalSeminar, Long>,
Iterable<FinalSeminar> findByStartDateAfter(Date date);
List<FinalSeminar> findProjectOpposing(Project project);
List<FinalSeminarOpposition> getOppositionsByProjectAuthors(Project project);
FinalSeminar deleteThesis(FinalSeminar seminar);

@ -4,7 +4,6 @@ import com.google.common.eventbus.EventBus;
import com.google.inject.persist.Transactional;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQuery;
import jakarta.persistence.EntityManager;
import org.springframework.data.domain.Pageable;
import se.su.dsv.scipro.file.FileReference;
@ -18,21 +17,16 @@ import se.su.dsv.scipro.report.OppositionReportService;
import se.su.dsv.scipro.reviewing.RoughDraftApproval;
import se.su.dsv.scipro.reviewing.RoughDraftApprovalService;
import se.su.dsv.scipro.system.AbstractServiceImpl;
import se.su.dsv.scipro.system.ProjectType;
import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.util.Either;
import javax.inject.Inject;
import javax.inject.Provider;
import java.time.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import static com.querydsl.core.types.dsl.Expressions.allOf;
import static com.querydsl.core.types.dsl.Expressions.anyOf;
public class FinalSeminarServiceImpl extends AbstractServiceImpl<FinalSeminar, Long> implements FinalSeminarService {
@Inject
@ -421,8 +415,12 @@ public class FinalSeminarServiceImpl extends AbstractServiceImpl<FinalSeminar, L
}
@Override
public List<FinalSeminar> findProjectOpposing(Project project) {
return findAll(projectOpposing(project));
public List<FinalSeminarOpposition> getOppositionsByProjectAuthors(Project project) {
return project.getProjectParticipants()
.stream()
.map(author -> findUserOpposing(project, author))
.flatMap(List::stream)
.toList();
}
@Override
@ -495,30 +493,6 @@ public class FinalSeminarServiceImpl extends AbstractServiceImpl<FinalSeminar, L
return QFinalSeminar.finalSeminar.deleted.eq(deleted);
}
private BooleanExpression projectOpposing(Project project) {
List<BooleanExpression> booleanExpressions = new ArrayList<>();
for (User projectParticipant : project.getProjectParticipants()) {
final BooleanExpression booleanExpression = QFinalSeminar.finalSeminar.oppositions.any()
.in(getFinalSeminarOppositions(projectParticipant, project.getProjectType()));
booleanExpressions.add(booleanExpression);
}
return anyOf(booleanExpressions.toArray(new BooleanExpression[0]));
}
private List<FinalSeminarOpposition> getFinalSeminarOppositions(User projectParticipant, ProjectType projectType) {
return new JPAQuery<FinalSeminarOpposition>(em())
.from(QFinalSeminarOpposition.finalSeminarOpposition)
.where(QFinalSeminarOpposition.finalSeminarOpposition.project.projectType.eq(projectType),
QFinalSeminarOpposition.finalSeminarOpposition.user.eq(projectParticipant))
.fetch();
}
private BooleanExpression projectParticipating(Project project) {
return allOf(
QFinalSeminar.finalSeminar.activeParticipations.any().user.in(project.getProjectParticipants()),
QFinalSeminar.finalSeminar.activeParticipations.any().project.projectType.eq(project.getProjectType()));
}
private BooleanExpression startDateIsAfter(Date date) {
return QFinalSeminar.finalSeminar.startDate.after(date);
}

@ -26,7 +26,7 @@ public class ProjectOppositionsListPanel extends GenericPanel<Project> {
public ProjectOppositionsListPanel(final String id, final IModel<Project> model) {
super(id, model);
add(new AutoHidingListView<>("oppositions", getOpponents(getSeminars())) {
add(new AutoHidingListView<>("oppositions", getOpponents(model)) {
@Override
protected void populateItem(final ListItem<FinalSeminarOpposition> item) {
PageParameters pp = new PageParameters();
@ -51,28 +51,16 @@ public class ProjectOppositionsListPanel extends GenericPanel<Project> {
.add(new OppositeVisibility(get("oppositions"))));
}
private IModel<? extends List<FinalSeminarOpposition>> getOpponents(final IModel<List<FinalSeminar>> seminars) {
private IModel<? extends List<FinalSeminarOpposition>> getOpponents(final IModel<Project> project) {
return new LoadableDetachableModel<>() {
@Override
protected List<FinalSeminarOpposition> load() {
return seminars.getObject().stream()
.flatMap(input -> input.getOppositions().stream())
.filter(input -> getModelObject().isParticipant(input.getUser()))
.toList();
return finalSeminarService.getOppositionsByProjectAuthors(project.getObject());
}
@Override
protected void onDetach() {
seminars.detach();
}
};
}
private IModel<List<FinalSeminar>> getSeminars() {
return new LoadableDetachableModel<>() {
@Override
protected List<FinalSeminar> load() {
return finalSeminarService.findProjectOpposing(getModelObject());
project.detach();
}
};
}

@ -169,9 +169,8 @@ public class CriteriaPanel extends GenericPanel<SupervisorGradingReport> {
public OppositionFeedbackPanel(final String id, final IModel<User> author, final IModel<GradingCriterion> gradingCriterion) {
super(id, author);
this.gradingCriterion = gradingCriterion;
final IModel<List<FinalSeminar>> allOppositions = LoadableDetachableModel.of(() ->
finalSeminarService.findProjectOpposing(CriteriaPanel.this.getModelObject().getProject()));
final IModel<List<FinalSeminarOpposition>> authorOppositions = allOppositions.map(this::getAuthorsOppositions);
final IModel<List<FinalSeminarOpposition>> authorOppositions = LoadableDetachableModel.of(() ->
finalSeminarService.findUserOpposing(CriteriaPanel.this.getModelObject().getProject(), author.getObject()));
modal = new ModalWindowPlus("modal");
modal.setTitle("Opposition feedback");
@ -199,14 +198,6 @@ public class CriteriaPanel extends GenericPanel<SupervisorGradingReport> {
setVisibilityAllowed(isOppositionCriteria && isEnabledInHierarchy());
}
private List<FinalSeminarOpposition> getAuthorsOppositions(final List<FinalSeminar> seminars) {
return seminars.stream()
.map(FinalSeminar::getOppositions)
.flatMap(Collection::stream)
.filter(opposition -> Objects.equals(opposition.getUser(), getModelObject()))
.toList();
}
private class OppositionFeedbackList extends Fragment {
public OppositionFeedbackList(final String id, final IModel<List<FinalSeminarOpposition>> authorOppositions) {
super(id, "oppositionFeedback", OppositionFeedbackPanel.this, authorOppositions);

@ -34,7 +34,7 @@ public class ProjectOppositionsListPanelTest extends SciProTest {
billsOpposition = newOpposition(bill, finalSeminar, bills);
finalSeminar.addOpposition(billsOpposition);
finalSeminar.addOpposition(newOpposition(bob, finalSeminar, bobs));
when(finalSeminarService.findProjectOpposing(eq(bills))).thenReturn(Collections.singletonList(finalSeminar));
when(finalSeminarService.getOppositionsByProjectAuthors(eq(bills))).thenReturn(List.of(billsOpposition));
}
@Test

@ -40,7 +40,7 @@ public class SupervisorProjectDetailsPageTest extends PageTest {
FileDescription fileDescription = new FileDescription();
fileDescription.setMimeType("pdf");
fileDescription.setId(1L);
when(finalSeminarService.findProjectOpposing(any(Project.class))).thenReturn(Collections.emptyList());
when(finalSeminarService.getOppositionsByProjectAuthors(any(Project.class))).thenReturn(Collections.emptyList());
}
@Test