3204 View target history
This commit is contained in:
parent
aefad1c7b7
commit
e57f610311
core/src
main/java/se/su/dsv/scipro/reviewing
ReviewerCapacityService.javaReviewerCapacityServiceImpl.javaReviewerTargetRepository.javaReviewerTargetRepositoryImpl.java
test/java/se/su/dsv/scipro/reviewing
view/src/main/java/se/su/dsv/scipro/admin/pages
@ -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—2023-06-30: 2</li>
|
||||
<li>2022-07-01—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");
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user