3064 PO review 2) give more detailed information about active participations performed by authors to the supervisor

This commit is contained in:
Andreas Svanberg 2023-09-27 13:14:07 +02:00
parent 0492746493
commit 3a66ffdf0f
7 changed files with 60 additions and 71 deletions

@ -27,7 +27,6 @@ public interface FinalSeminarService extends GenericService<FinalSeminar, Long>,
List<FinalSeminar> findProjectOpposing(Project project);
List<FinalSeminar> findProjectParticipating(Project project, Pageable pageable);
FinalSeminar deleteThesis(FinalSeminar seminar);
@Override

@ -387,11 +387,6 @@ public class FinalSeminarServiceImpl extends AbstractServiceImpl<FinalSeminar, L
return findAll(projectOpposing(project));
}
@Override
public List<FinalSeminar> findProjectParticipating(Project project, Pageable pageable) {
return findAll(projectParticipating(project), pageable);
}
@Override
public boolean isActiveParticipant(FinalSeminar seminar, User activeParticipant) {
return alreadyParticipant(activeParticipant, seminar);

@ -2,15 +2,23 @@
<html xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
<wicket:enclosure child="active.participations">
<ul class="list-unstyled">
<li wicket:id="active.participations">
<a wicket:id="finalSeminar"><span wicket:id="finalSeminar.startDate"></span></a>
<span wicket:id="user"></span>
</li>
</ul>
</wicket:enclosure>
<p wicket:id="no.active.participation">No authors of this project have performed an active participation.</p>
<ul class="list-unstyled">
<li wicket:id="authors">
<span wicket:id="author">[Stina Student]</span>
(<wicket:message key="count_performed_explanation">
<strong wicket:id="count_approved">[0]</strong> approved out of
<strong wicket:id="count_required">[2]</strong> mandatory
</wicket:message>)
<ul>
<li wicket:id="participations">
<span wicket:id="seminar">[Title of seminars project]</span>
<wicket:enclosure>
(<em wicket:id="grade">[(not) approved]</em>)
</wicket:enclosure>
</li>
</ul>
</li>
</ul>
</wicket:panel>
</body>
</html>

@ -1,23 +1,20 @@
package se.su.dsv.scipro.finalseminar;
import org.apache.wicket.markup.html.basic.EnumLabel;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.springframework.data.domain.PageRequest;
import se.su.dsv.scipro.components.AutoHidingListView;
import se.su.dsv.scipro.components.DateLabel;
import se.su.dsv.scipro.components.OppositeVisibility;
import se.su.dsv.scipro.data.enums.DateStyle;
import se.su.dsv.scipro.profile.UserLinkPanel;
import se.su.dsv.scipro.profile.UserLabel;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.util.PageParameterKeys;
import se.su.dsv.scipro.system.ProjectType;
import se.su.dsv.scipro.system.ProjectTypeSettings;
import se.su.dsv.scipro.system.User;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
public class ProjectActiveParticipationListPanel extends GenericPanel<Project> {
@ -26,46 +23,39 @@ public class ProjectActiveParticipationListPanel extends GenericPanel<Project> {
public ProjectActiveParticipationListPanel(final String id, final IModel<Project> model) {
super(id, model);
add(new AutoHidingListView<>("active.participations", getActiveParticipants(getSeminars())) {
add(new ListView<>("authors", model.map(Project::getProjectParticipants).map(ArrayList::new)) {
@Override
protected void populateItem(final ListItem<FinalSeminarActiveParticipation> item) {
PageParameters pp = new PageParameters();
pp.add(PageParameterKeys.MAP.get(Project.class), item.getModelObject().getFinalSeminar().getProject().getId());
protected void populateItem(ListItem<User> item) {
IModel<List<FinalSeminarActiveParticipation>> participations = LoadableDetachableModel.of(() ->
finalSeminarService.findUserParticipating(
ProjectActiveParticipationListPanel.this.getModelObject(),
item.getModelObject()));
BookmarkablePageLink<Void> finalSeminarLink = new BookmarkablePageLink<>("finalSeminar", ProjectFinalSeminarDetailsPage.class, pp);
finalSeminarLink.add(new DateLabel("finalSeminar.startDate", item.getModel().map(p -> p.getFinalSeminar().getStartDate()), DateStyle.DATE));
item.add(finalSeminarLink);
item.add(new UserLinkPanel("user", item.getModel().map(FinalSeminarParticipation::getUser)));
item.add(new UserLabel("author", item.getModel()));
IModel<Integer> countRequired = model
.map(Project::getProjectType)
.map(ProjectType::getProjectTypeSettings)
.map(ProjectTypeSettings::getMinimumActiveParticipationsToBeGraded);
item.add(new Label("count_required", countRequired));
IModel<Long> countPerformed = participations.map(this::countApproved);
item.add(new Label("count_approved", countPerformed));
item.add(new ListView<>("participations", participations) {
@Override
protected void populateItem(ListItem<FinalSeminarActiveParticipation> item) {
item.add(new Label("seminar", item.getModel()
.map(FinalSeminarParticipation::getFinalSeminar)
.map(FinalSeminar::getProjectTitle)));
item.add(new EnumLabel<>("grade", item.getModel()
.map(FinalSeminarActiveParticipation::getGrade)));
}
});
}
private long countApproved(List<FinalSeminarActiveParticipation> p) {
return p.stream().filter(FinalSeminarParticipation::isApproved).count();
}
});
add(new Label("no.active.participation", new ResourceModel("no.active.participation"))
.add(new OppositeVisibility(get("active.participations"))));
}
private IModel<? extends List<FinalSeminarActiveParticipation>> getActiveParticipants(final IModel<List<FinalSeminar>> seminars) {
return new LoadableDetachableModel<>() {
@Override
protected List<FinalSeminarActiveParticipation> load() {
return seminars.getObject().stream()
.flatMap(input -> input.getActiveParticipations().stream())
.filter(input -> getModelObject().isParticipant(input.getUser()))
.toList();
}
@Override
protected void onDetach() {
seminars.detach();
}
};
}
private IModel<List<FinalSeminar>> getSeminars() {
return new LoadableDetachableModel<>() {
@Override
protected List<FinalSeminar> load() {
return finalSeminarService.findProjectParticipating(getModelObject(), new PageRequest(0, Integer.MAX_VALUE));
}
};
}
}

@ -1 +1,3 @@
no.active.participation= No authors of this project have performed an active participation.
FinalSeminarGrade.APPROVED=approved
FinalSeminarGrade.NOT_APPROVED=failed
count_performed_explanation=${count_approved} out of ${count_required} mandatory

@ -3,7 +3,6 @@ package se.su.dsv.scipro.finalseminar;
import org.apache.wicket.model.Model;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.data.domain.Pageable;
import se.su.dsv.scipro.SciProTest;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.DegreeType;
@ -12,9 +11,8 @@ import se.su.dsv.scipro.system.User;
import java.time.LocalDate;
import java.util.Collections;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
public class ProjectActiveParticipationListPanelTest extends SciProTest {
@ -34,14 +32,13 @@ public class ProjectActiveParticipationListPanelTest extends SciProTest {
FinalSeminar finalSeminar = new FinalSeminar(bobs);
billsParticipation = newActiveParticipation(bill, finalSeminar, bills);
finalSeminar.addActiveParticipant(billsParticipation);
finalSeminar.addActiveParticipant(newActiveParticipation(bob, finalSeminar, bobs));
when(finalSeminarService.findProjectParticipating(eq(bills), any(Pageable.class))).thenReturn(Collections.singletonList(finalSeminar));
when(finalSeminarService.findUserParticipating(bills, bill)).thenReturn(List.of(billsParticipation));
}
@Test
public void lists_correct_oppositions() {
ProjectActiveParticipationListPanel panel = tester.startComponentInPage(new ProjectActiveParticipationListPanel("id", Model.of(bills)));
tester.assertModelValue(path(panel, "active.participations"), Collections.singletonList(billsParticipation));
tester.assertModelValue(path(panel, "authors", 0, "participations"), Collections.singletonList(billsParticipation));
}
private FinalSeminarActiveParticipation newActiveParticipation(final User author, final FinalSeminar finalSeminar, final Project authors) {

@ -4,7 +4,6 @@ import org.apache.wicket.Page;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.data.domain.Pageable;
import se.su.dsv.scipro.PageTest;
import se.su.dsv.scipro.file.FileDescription;
import se.su.dsv.scipro.group.Group;
@ -42,7 +41,6 @@ public class SupervisorProjectDetailsPageTest extends PageTest {
fileDescription.setMimeType("pdf");
fileDescription.setId(1L);
when(finalSeminarService.findProjectOpposing(any(Project.class))).thenReturn(Collections.emptyList());
when(finalSeminarService.findProjectParticipating(any(Project.class), any(Pageable.class))).thenReturn(Collections.emptyList());
}
@Test