Merge branch 'peer_reviewdate_feature' into develop

This commit is contained in:
Emil Siverhall 2011-07-19 09:00:02 +02:00
commit 770f87b600
9 changed files with 291 additions and 4 deletions

@ -14,9 +14,17 @@
<td><input type="checkbox" wicket:id="peerRatingsEnabled" name="peerRatingsEnabled"></td>
</tr>
<tr>
<td><label for="peerDisplayNumberOfReviewsPerformed">Display users number of reviews performed on portal page</label></td>
<td><label for="peerDisplayNumberOfReviewsPerformed">Display users number of reviews performed on portal page:</label></td>
<td><input type="checkbox" wicket:id="peerDisplayNumberOfReviewsPerformed" name="peerDisplayNumberOfReviewsPerformed"></td>
</tr>
<tr>
<td><label for="peerDisplayLatestReviews">Display the latest submitted reviews on portal page:</label></td>
<td><input type="checkbox" wicket:id="peerDisplayLatestReviews" name="peerDisplayLatestReviews"></td>
</tr>
<tr>
<td><label for="numberOfLatestReviewsDisplayed">Number of reviews to show in the "Latest reviewers" panel: </label></td>
<td><input type="text" wicket:id="numberOfLatestReviewsDisplayed" name="numberOfLatestReviewsDisplayed" /></td>
</tr>
</table>
</form>
<h5 class="peer-title">Settings for levels</h5>

@ -59,17 +59,36 @@ public class AdminPeerSettingsPage extends AbstractAdminSettingsPage {
private class PeerRatingsSettingsForm extends Form<GeneralSystemSettings> {
private static final long serialVersionUID = 1L;
private TextField<Integer> numberOfLatestReviewsDisplayed;
public PeerRatingsSettingsForm(String id, IModel<GeneralSystemSettings> model) {
super(id, model);
CheckBox peerRatingsEnabled = new CheckBox("peerRatingsEnabled");
add(peerRatingsEnabled);
CheckBox peerDisplayNumberOfReviewsPerformed = new CheckBox("peerDisplayNumberOfReviewsPerformed");
add(peerDisplayNumberOfReviewsPerformed);
add(peerDisplayNumberOfReviewsPerformed);
CheckBox peerDisplayLatestReviews = new CheckBox("peerDisplayLatestReviews");
add(peerDisplayLatestReviews);
numberOfLatestReviewsDisplayed =
new TextField<Integer>("numberOfLatestReviewsDisplayed");
numberOfLatestReviewsDisplayed.setRequired(true);
add(numberOfLatestReviewsDisplayed);
// Checkbox for activating/inactiviting links to reviews in the Latest reviewers panel.
//
/*CheckBox publicReviewsActivated = new CheckBox("publicReviewsActivated");
add(publicReviewsActivated);*/
}
@Override
public void onSubmit(){
setModelObject(generalSystemSettingsDao.save(getModelObject()));
if (getModelObject().getNumberOfLatestReviewsDisplayed() == 0) {
warn("Number of reviews to show has been changed to 1. If you don't want to show any reviews, please hide the panel.");
getModelObject().setNumberOfLatestReviewsDisplayed(1);
}
setModelObject(generalSystemSettingsDao.save(getModelObject()));
}
}

@ -51,6 +51,15 @@ public class GeneralSystemSettings extends DomainObject{
@Basic(optional=false)
private boolean peerDisplayNumberOfReviewsPerformed = true;
@Basic(optional=false)
private boolean peerDisplayLatestReviews = true;
@Basic(optional=false)
private int numberOfLatestReviewsDisplayed = 3;
@Basic(optional=false)
private boolean publicReviewsActivated = true;
public GeneralSystemSettings(){
}
/**
@ -116,6 +125,24 @@ public class GeneralSystemSettings extends DomainObject{
public boolean isPeerDisplayNumberOfReviewsPerformed() {
return peerDisplayNumberOfReviewsPerformed;
}
public void setPeerDisplayLatestReviews(boolean peerDisplayLatestReviews) {
this.peerDisplayLatestReviews = peerDisplayLatestReviews;
}
public boolean isPeerDisplayLatestReviews() {
return peerDisplayLatestReviews;
}
public int getNumberOfLatestReviewsDisplayed() {
return numberOfLatestReviewsDisplayed;
}
public void setNumberOfLatestReviewsDisplayed(int numberOfLatestReviewsDisplayed) {
this.numberOfLatestReviewsDisplayed = numberOfLatestReviewsDisplayed;
}
public boolean isPublicReviewsActivated() {
return publicReviewsActivated;
}
public void setPublicReviewsActivated(boolean publicReviewsActivated) {
this.publicReviewsActivated = publicReviewsActivated;
}
}

@ -44,6 +44,10 @@ public interface PeerReviewDao extends LazyDeleteDao<PeerReview> {
public int countStudentsWithReviews(final long minimumNumberOfReviews, final Date since);
public int countStudentsWithReviews();
public int countSubmittedReviews();
public List<PeerReview> findReviewsSortedByDate(final int firstResult, final Integer limit);
/**
* Find given peer reviews for a given project and student

@ -385,4 +385,55 @@ public class PeerReviewDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<PeerReview>
}
});
}
@Transactional
public List<PeerReview> findReviewsSortedByDate(final int firstResult, final Integer limit) {
return getJpaTemplate().execute(new JpaCallback<List<PeerReview>>() {
public List<PeerReview> doInJpa(EntityManager em)
throws PersistenceException {
String q = "select pr " +
"from PeerReview pr " +
"where pr.submitted = true " +
"and pr.deleted = false " +
"and pr.aborted = false " +
"order by pr.lastModified desc";
TypedQuery<PeerReview> query = em.createQuery(q, PeerReview.class);
query.setMaxResults(limit != null ? limit : 3);
query.setFirstResult(firstResult);
try {
return query.getResultList();
} catch (NoResultException e) {
return new LinkedList<PeerReview>();
}
}
});
}
@Override
public int countSubmittedReviews() {
return getJpaTemplate().execute(new JpaCallback<Integer>() {
public Integer doInJpa(EntityManager em)
throws PersistenceException {
String q = "select count(pr) " +
"from PeerReview pr " +
"where pr.submitted = true " +
"and pr.deleted = false " +
"and pr.aborted = false";
TypedQuery<Long> query = em.createQuery(q, Long.class);
try {
return query.getSingleResult().intValue();
} catch (NoResultException e) {
return 0;
}
}
}); }
}

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<div>
<table>
<tbody wicket:id="listView">
<tr>
<td wicket:id="reviewer"></td>
</tr>
<tr>
<td><a href="#" wicket:id="reviewLink">Review date: <span wicket:id="reviewDate"></span></a></td>
</tr>
</tbody>
</table>
<i><span wicket:id="noReviewersFoundMessage"></span></i>
</div>
<div>
<a href="#" wicket:id="showMore">Show more...</a>
</div>
</wicket:panel>
</body>
</html>

@ -0,0 +1,135 @@
package se.su.dsv.scipro.peer.panels;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebMarkupContainer;
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.Panel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.peer.data.dao.interfaces.PeerReviewDao;
import se.su.dsv.scipro.peer.data.dataobjects.PeerReview;
import se.su.dsv.scipro.peer.pages.ProjectPeerReviewPage;
public class LatestReviewPanel extends Panel {
private static final long serialVersionUID = 1L;
@SpringBean
private PeerReviewDao peerReviewDao;
/**
* @param id
* @param model
* the number of users to show by default - also defines how many
* users to show when clicking showmore
*/
public LatestReviewPanel(String id, final Model<Integer> model, final boolean publicLinks) {
super(id, model);
setOutputMarkupId(true);
final int totalCount = peerReviewDao.countSubmittedReviews();
final LoadableDetachableModel<List<PeerReview>> listModel = new LoadableDetachableModel<List<PeerReview>>() {
private static final long serialVersionUID = 1L;
@Override
protected List<PeerReview> load() {
return peerReviewDao.findReviewsSortedByDate(0, model.getObject());
}
};
final ListView<PeerReview> listView = new ListView<PeerReview>("listView", listModel) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<PeerReview> item) {
PeerReview pr = item.getModelObject();
item.add(pr.getReviewer().getUser().getDisplayComponent("reviewer"));
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Label dateLabel = new Label("reviewDate", df.format(pr.getLastModified()));
if(publicLinks) {
PageParameters pp = new PageParameters();
pp.put(PeerReview.PP_PEER_REVIEW_ID, pr.getId());
BookmarkablePageLink<Void> link = new BookmarkablePageLink<Void>("reviewLink", ProjectPeerReviewPage.class, pp);
link.add(dateLabel);
item.add(link);
} else {
LinkToSpanContainer ltsc = new LinkToSpanContainer("reviewLink");
ltsc.add(dateLabel);
item.add(ltsc);
}
add(item);
}
};
add(new Label("noReviewersFoundMessage", "No reviewers found") {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return listView.size() == 0;
}
});
add(listView);
add(new AjaxLink<Void>("showMore") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
Integer i = model.getObject();
i += model.getObject();
model.setObject(i);
target.addComponent(LatestReviewPanel.this);
}
@Override
public boolean isVisible() {
return listView.size() < totalCount;
}
});
}
public LatestReviewPanel(String id) {
this(id, new Model<Integer>(3), false);
}
/*
* Change html markup from a href to span when links are disabled.
* Used when publicly viewable peer reviews is activated/inactivated.
*/
class LinkToSpanContainer extends WebMarkupContainer {
private static final long serialVersionUID = 1L;
public LinkToSpanContainer(String id) {
super(id);
}
@Override
protected final void onComponentTag(final ComponentTag tag) {
tag.setName("span");
tag.remove("href");
super.onComponentTag(tag);
}
}
}

@ -72,6 +72,12 @@
</div>
<!-- End left column -->
<div class="span-6 last">
<wicket:enclosure>
<div class="rounded-box">
<span class="box-title">Latest reviewers</span>
<div wicket:id="latestReviewPanel" class="append-bottom"></div>
</div>
</wicket:enclosure>
<wicket:enclosure>
<div class="rounded-box">
<span class="box-title">Most frequent reviewers</span>
@ -86,7 +92,6 @@
<div>
<i><span class="small right">Last 12 months</span></i>
</div>
</div>
</div>
</wicket:panel>

@ -216,7 +216,10 @@ public class PeerPortalPanel extends Panel {
GeneralSystemSettings gsettings = generalSystemSettingsDao.getGeneralSystemSettingsInstance();
final String mostFrequentPanel = "mostFrequentPanel";
final String latestReviewPanel ="latestReviewPanel";
final String bestRatedContainer = "bestRatedContainer";
int displayedReviews = gsettings.getNumberOfLatestReviewsDisplayed();
if(gsettings.isPeerDisplayNumberOfReviewsPerformed()){
add(new MostFrequentReviewersPanel(mostFrequentPanel));
@ -228,6 +231,18 @@ public class PeerPortalPanel extends Panel {
} else {
add(new InvisiblePanel(bestRatedContainer));
}
if(gsettings.isPeerDisplayLatestReviews()) {
// Checkbox on the AdminPeerSettingsPage is not visible since it's
// not decided what kind of info that should be public for students.
if (gsettings.isPublicReviewsActivated()) {
add(new LatestReviewPanel(latestReviewPanel, new Model<Integer>(displayedReviews), true));
} else {
add(new LatestReviewPanel(latestReviewPanel, new Model<Integer>(displayedReviews), false));
}
} else {
add(new InvisiblePanel(latestReviewPanel));
}
}
}