3204 View target history

This commit is contained in:
Andreas Svanberg 2024-01-12 16:29:39 +01:00
parent aefad1c7b7
commit e57f610311
7 changed files with 71 additions and 20 deletions

@ -7,9 +7,9 @@ import java.time.Year;
import java.util.List;
public interface ReviewerCapacityService {
record Target(int spring, int autumn, String note) {}
record Target(Year year, int spring, int autumn, String note) {}
void assignTarget(User reviewer, Year year, Target target);
void assignTarget(User reviewer, Target target);
List<Unit> getUnitsWithReviewers();
@ -18,4 +18,13 @@ public interface ReviewerCapacityService {
List<User> getActiveReviewersOnUnit(Unit unit);
Target getTarget(User reviewer, Year year);
/**
* Returns the target for the given reviewer up to, but not including, the given year.
*
* @param reviewer the reviewer to get the targets for
* @param year the year to get the targets up to, but not including
* @return the entire history for the given reviewer up to the given year
*/
List<Target> getTargetHistory(User reviewer, Year year);
}

@ -42,8 +42,8 @@ class ReviewerCapacityServiceImpl implements ReviewerCapacityService, ReviewerAs
}
@Override
public void assignTarget(User reviewer, Year year, Target target) {
Optional<ReviewerTarget> reviewerTarget = reviewerTargetRepository.getReviewerTarget(reviewer, year);
public void assignTarget(User reviewer, Target target) {
Optional<ReviewerTarget> reviewerTarget = reviewerTargetRepository.getReviewerTarget(reviewer, target.year());
if (reviewerTarget.isPresent()) {
ReviewerTarget targetToUpdate = reviewerTarget.get();
targetToUpdate.setSpring(target.spring());
@ -54,7 +54,7 @@ class ReviewerCapacityServiceImpl implements ReviewerCapacityService, ReviewerAs
else {
ReviewerTarget reviewerTargetToSave = new ReviewerTarget();
reviewerTargetToSave.setReviewer(reviewer);
reviewerTargetToSave.setYear(year.getValue());
reviewerTargetToSave.setYear(target.year().getValue());
reviewerTargetToSave.setSpring(target.spring());
reviewerTargetToSave.setAutumn(target.autumn());
reviewerTargetToSave.setNote(target.note());
@ -88,8 +88,21 @@ class ReviewerCapacityServiceImpl implements ReviewerCapacityService, ReviewerAs
@Override
public Target getTarget(User reviewer, Year year) {
return reviewerTargetRepository.getReviewerTarget(reviewer, year)
.map(reviewerTarget -> new Target(reviewerTarget.getSpring(), reviewerTarget.getAutumn(), reviewerTarget.getNote()))
.orElse(new Target(0, 0, ""));
.map(reviewerTarget -> new Target(year, reviewerTarget.getSpring(), reviewerTarget.getAutumn(), reviewerTarget.getNote()))
.orElse(new Target(year, 0, 0, ""));
}
@Override
public List<Target> getTargetHistory(User reviewer, Year year) {
return reviewerTargetRepository.getReviewerTargetsBeforeYear(reviewer, year)
.stream()
.map(reviewerTarget -> new Target(
Year.of(reviewerTarget.getYear()),
reviewerTarget.getSpring(),
reviewerTarget.getAutumn(),
reviewerTarget.getNote()))
.sorted(Comparator.comparing(Target::year).reversed())
.toList();
}
private Optional<ReviewerTarget> getTarget(User reviewer, LocalDate date) {

@ -3,10 +3,13 @@ package se.su.dsv.scipro.reviewing;
import se.su.dsv.scipro.system.User;
import java.time.Year;
import java.util.List;
import java.util.Optional;
public interface ReviewerTargetRepository {
void save(ReviewerTarget reviewerTarget);
Optional<ReviewerTarget> getReviewerTarget(User reviewer, Year year);
List<ReviewerTarget> getReviewerTargetsBeforeYear(User reviewer, Year year);
}

@ -8,6 +8,7 @@ import se.su.dsv.scipro.system.User;
import javax.inject.Inject;
import javax.inject.Provider;
import java.time.Year;
import java.util.List;
import java.util.Optional;
public class ReviewerTargetRepositoryImpl extends AbstractRepository implements ReviewerTargetRepository {
@ -36,4 +37,12 @@ public class ReviewerTargetRepositoryImpl extends AbstractRepository implements
.fetchOne();
return Optional.ofNullable(current);
}
@Override
public List<ReviewerTarget> getReviewerTargetsBeforeYear(User reviewer, Year year) {
return from(QReviewerTarget.reviewerTarget)
.where(QReviewerTarget.reviewerTarget.reviewer.eq(reviewer))
.where(QReviewerTarget.reviewerTarget.year.lt(year.getValue()))
.fetch();
}
}

@ -85,7 +85,7 @@ class ReviewerCapacityServiceImplTest extends IntegrationTest {
// given
reviewer.setLanguages(EnumSet.noneOf(Language.class));
reviewer.addResearchArea(researchArea);
service.assignTarget(reviewer, YEAR_2024, autumnTarget(3));
service.assignTarget(reviewer, autumnTarget(3));
// when
ReviewerCandidates candidates = service.getCandidatesToReview(project, SOME_DATE_IN_AUTUMN);
@ -99,7 +99,7 @@ class ReviewerCapacityServiceImplTest extends IntegrationTest {
// given
reviewer.getResearchAreas().clear();
reviewer.setLanguages(EnumSet.allOf(Language.class));
service.assignTarget(reviewer, YEAR_2024, springTarget(1));
service.assignTarget(reviewer, springTarget(1));
// when
ReviewerCandidates candidates = service.getCandidatesToReview(project, SOME_DATE_IN_SPRING);
@ -113,7 +113,7 @@ class ReviewerCapacityServiceImplTest extends IntegrationTest {
// given
reviewer.setLanguages(EnumSet.allOf(Language.class));
reviewer.addResearchArea(researchArea);
service.assignTarget(reviewer, YEAR_2024, springTarget(2));
service.assignTarget(reviewer, springTarget(2));
// when
ReviewerCandidates candidates = service.getCandidatesToReview(project, SOME_DATE_IN_SPRING);
@ -129,8 +129,8 @@ class ReviewerCapacityServiceImplTest extends IntegrationTest {
reviewer.addResearchArea(researchArea);
// when
service.assignTarget(reviewer, YEAR_2024, springTarget(3));
service.assignTarget(reviewer, YEAR_2024, springTarget(2));
service.assignTarget(reviewer, springTarget(3));
service.assignTarget(reviewer, springTarget(2));
// then
int candidates = service.getTarget(reviewer, YEAR_2024).spring();
@ -138,10 +138,10 @@ class ReviewerCapacityServiceImplTest extends IntegrationTest {
}
private static Target springTarget(final int target) {
return new Target(target, 0, "");
return new Target(YEAR_2024, target, 0, "");
}
private static Target autumnTarget(final int target) {
return new Target(0, target, "");
return new Target(YEAR_2024, 0, target, "");
}
}

@ -90,10 +90,16 @@
</div>
<div class="col">
<h5>Target history</h5>
<ul>
<li>2023-01-01&mdash;2023-06-30: 2</li>
<li>2022-07-01&mdash;2022-12-31: 4</li>
</ul>
<dl>
<wicket:container wicket:id="history">
<dt wicket:id="year">[2024]</dt>
<dd>
Spring: <span wicket:id="spring">[2]</span>
<br>
Autumn: <span wicket:id="autumn">[2]</span>
</dd>
</wicket:container>
</dl>
</div>
</div>
</div>

@ -125,6 +125,17 @@ public class AdminReviewerCapacityManagementPage extends AbstractAdminProjectPag
add(new UserProfileImage("profile_image", reviewer, UserProfileImage.Size.MEDIUM));
add(new UserLabel("name", reviewer));
add(new AssignTargetForm("form", reviewer));
IModel<List<Target>> history = LoadableDetachableModel.of(() -> reviewerCapacityService.getTargetHistory(reviewer.getObject(), selectedPeriod.getObject()));
ListView<Target> historyComponent = new ListView<>("history", history) {
@Override
protected void populateItem(ListItem<Target> item) {
item.add(new Label("year", item.getModel().map(Target::year)));
item.add(new Label("spring", item.getModel().map(Target::spring)));
item.add(new Label("autumn", item.getModel().map(Target::autumn)));
}
};
historyComponent.setViewSize(3);
add(historyComponent);
}
private class AssignTargetForm extends Form<User> {
@ -169,8 +180,8 @@ public class AdminReviewerCapacityManagementPage extends AbstractAdminProjectPag
@Override
protected void onSubmit() {
Target target = new Target(springTarget.getObject(), autumnTarget.getObject(), note.getObject());
reviewerCapacityService.assignTarget(getModelObject(), selectedPeriod.getObject(), target);
Target target = new Target(selectedPeriod.getObject(), springTarget.getObject(), autumnTarget.getObject(), note.getObject());
reviewerCapacityService.assignTarget(getModelObject(), target);
success("Target assigned");
}
}