Merge branch 'develop' of ssh://git.dsv.su.se/git/scipro/scipro into develop

This commit is contained in:
joha-asc 2011-07-21 13:49:18 +02:00
commit 51e8477b64
16 changed files with 280 additions and 15 deletions

@ -63,7 +63,6 @@
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>runtime</scope>
</dependency>
<dependency>
@ -77,7 +76,6 @@
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.13</version>
<scope>runtime</scope>
</dependency>
<!-- Spring Deps -->
@ -85,7 +83,6 @@
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
@ -112,7 +109,6 @@
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
@ -164,7 +160,6 @@
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Jackrabbit dependencies -->
@ -187,7 +182,6 @@
<groupId>eu.medsea.mimeutil</groupId>
<artifactId>mime-util</artifactId>
<version>2.1.3</version>
<scope>runtime</scope>
</dependency>
<!-- Additional dependencies -->
@ -195,7 +189,6 @@
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-extensions</artifactId>
<version>${wicket.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.odlabs.wiquery</groupId>

@ -1,5 +1,6 @@
package se.su.dsv.scipro.data.dataobjects;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
@ -38,6 +39,8 @@ public class ProjectSchedule extends DomainObject {
private boolean locked = false;
private Date startDate;
public ProjectSchedule() {}
public Long getId() {
@ -79,6 +82,14 @@ public class ProjectSchedule extends DomainObject {
public void setGroupEvents(Set<GroupEvent> groupEvents) {
this.groupEvents = groupEvents;
}
public void setStartDate(Date startDate){
this.startDate = startDate;
}
public Date getStartDate(){
return startDate;
}
@Override
public int hashCode() {

@ -49,6 +49,8 @@ public interface PeerReviewDao extends LazyDeleteDao<PeerReview> {
public List<PeerReview> findReviewsSortedByDate(final int firstResult, final Integer limit);
public List<PeerReview> findReviewsSortedByDate();
/**
* Find given peer reviews for a given project and student
*

@ -414,8 +414,13 @@ public class PeerReviewDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<PeerReview>
}
});
}
@Transactional
public List<PeerReview> findReviewsSortedByDate() {
return findReviewsSortedByDate(0, 3);
}
@Override
@Transactional
public int countSubmittedReviews() {
return getJpaTemplate().execute(new JpaCallback<Integer>() {
public Integer doInJpa(EntityManager em)

@ -289,6 +289,7 @@ public abstract class ScheduleGeneratorPanel extends Panel {
public void onClick() {
ProjectSchedule ps = new ProjectSchedule();
ps.setProject(project);
ps.setStartDate(res.getStartDate());
ps = projectScheduleDao.save(ps);
for(ProjectEvent e : res.getEventList()){
e.setProjectSchedule(ps);

@ -22,6 +22,9 @@
<a href="#" wicket:id="addGroupEventLink">
<img wicket:id="addGroupEventLinkIcon" /> Add group event
</a>
<a href="#" wicket:id="saveAsTemplateLink">
<img wicket:id="saveTemplateLinkIcon" /> Save as template
</a>
</div>
<div wicket:id="monthPicker" class="span-18 last prepend-top"></div>
<div wicket:id="eventListContainer" class="span-18 last">

@ -11,6 +11,7 @@ import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
@ -27,9 +28,11 @@ import se.su.dsv.scipro.components.monthpicker.IMonthChangedListener;
import se.su.dsv.scipro.components.monthpicker.MonthPicker;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleDao;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.Event;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.ProjectSchedule;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.icons.AjaxActionIcon;
@ -38,7 +41,10 @@ import se.su.dsv.scipro.schedule.baseevent.panels.EventSchedulePanel;
import se.su.dsv.scipro.schedule.groupevent.panels.CreateGroupEventPanel;
import se.su.dsv.scipro.schedule.models.EventListModel;
import se.su.dsv.scipro.schedule.projectevent.panels.CreateProjectEventPanel;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplateDetailsPage;
import se.su.dsv.scipro.supervisor.pages.SupervisorScheduleTemplatesEditorPage;
import se.su.dsv.scipro.util.SelectOption;
import se.su.dsv.scipro.util.TemplateGenerator;
import se.su.dsv.scipro.util.WiQueryCoreEffectsHelper;
@ -51,7 +57,10 @@ public abstract class SchedulePlannerPanel extends Panel {//implements ISchedule
@SpringBean
private ProjectScheduleDao projectScheduleDao;
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
private Project project;
private User user;
private WebMarkupContainer dialogContainer;
@ -190,6 +199,24 @@ public abstract class SchedulePlannerPanel extends Panel {//implements ISchedule
scheduleContainer.add(addGroupEventLink);
AjaxLink<Void> saveAsTemplateLink = new AjaxLink<Void>("saveAsTemplateLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
TemplateGenerator tg = new TemplateGenerator(project.getId());
ScheduleTemplate scheduleTemplate = tg.generate();
setResponsePage(new SupervisorScheduleTemplatesEditorPage(scheduleTemplate));
}
};
saveAsTemplateLink.add(new ImageIcon("saveTemplateLinkIcon", ImageIcon.ICON_EDIT));
scheduleContainer.add(saveAsTemplateLink);
final List<SelectOption<User>> participantOptions = new ArrayList<SelectOption<User>>();
for(Student s : project.getProjectParticipants()){

@ -8,7 +8,6 @@ import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.exceptions.PageNotFoundException;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplateDetailsPanel;
import se.su.dsv.scipro.security.auth.Authorization;
public class ScheduleTemplateDetailsPage extends MenuPage {

@ -33,6 +33,8 @@ public class ScheduleTemplateDetailsPanel extends Panel {
public ScheduleTemplateDetailsPanel(String id, final ScheduleTemplate st){
super(id);
template = scheduleTemplateDao.reLoad(st);
add(new Label("templateName", template.getTemplateName()));

@ -52,7 +52,7 @@ public class ScheduleTemplateFormPanel extends Panel {
template = new ScheduleTemplate();
template.setCreator(SciProSession.get().getUser());
template.setSysAdminTemplate(isSysAdminView);
} else {
} else { //test, might not be able to remove this
template = scheduleTemplateDao.reLoad(template);
}
Class<? extends MenuPage> responseClass = null;
@ -64,6 +64,8 @@ public class ScheduleTemplateFormPanel extends Panel {
add(new ScheduleTemplateForm("templateForm", template, responseClass));
}
class ScheduleTemplateForm extends Form<ScheduleTemplate> {
private static final long serialVersionUID = 1L;

@ -34,6 +34,12 @@ public class SupervisorScheduleTemplatesEditorPage extends AbstractSupervisorSch
add(new ScheduleTemplateFormPanel("scheduleTemplateFormPanel", template, false));
}
public SupervisorScheduleTemplatesEditorPage(ScheduleTemplate st) {
super(new PageParameters());
add(new ScheduleTemplateFormPanel("scheduleTemplateFormPanel", st, false));
}
public SupervisorScheduleTemplatesEditorPage(){
this(new PageParameters());
}

@ -0,0 +1,162 @@
package se.su.dsv.scipro.util;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.apache.wicket.injection.web.InjectorHolder;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.joda.time.DateMidnight;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleDao;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.ProjectEvent;
import se.su.dsv.scipro.data.dataobjects.ProjectEventTemplate;
import se.su.dsv.scipro.data.dataobjects.ProjectSchedule;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
public class TemplateGenerator { //based on ScheduleGenerator
/*@SpringBean
private ProjectScheduleDao projectscheduleDao;*/
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
@SpringBean
private ProjectDao projectDao;
private Project project;
private ProjectSchedule schedule;
private TreeSet<ProjectEvent> projectEvents;
private List<ProjectEventTemplate> projectEventTemplate;
private int templateEstimatedDays = 0;
private int durationInDays = 0;
private DateMidnight startDate;
public TemplateGenerator(Long projectId){
InjectorHolder.getInjector().inject(this);
project = projectDao.load(projectId);
if(project == null){
throw new IllegalArgumentException("The template generator did not find the provided project from db");
}
schedule = project.getProjectSchedule();
projectEvents = new TreeSet<ProjectEvent>(schedule.getProjectEvents());
if(schedule.getStartDate() != null){
this.startDate = new DateMidnight(schedule.getStartDate());
}else{
this.startDate = new DateMidnight(projectEvents.first().getDueDate());
}
}
public ScheduleTemplate generate(){
ScheduleTemplate template;
DateMidnight datePointer = new DateMidnight(startDate);
projectEventTemplate = new ArrayList<ProjectEventTemplate>();
int counter = 0;
template = new ScheduleTemplate();
template.setCreator(SciProSession.get().getUser());
template.setSysAdminTemplate(false);
template.setTemplateName("");
for(ProjectEvent pe : projectEvents){
counter ++;
if(isMilestone(pe)){
durationInDays = ((new DateMidnight(pe.getDueDate()).getDayOfYear() - datePointer.getDayOfYear()));
}else{
durationInDays = 0;
}
ProjectEventTemplate pet = new ProjectEventTemplate();
pet.setTitle(pe.getTitle());
pet.setDescription(pe.getDescription());
pet.setTemplateCreator(SciProSession.get().getUser());
pet.setEstimatedTimeConsumption(durationInDays);
pet.setNumberInOrder(counter);
pet.setRequireHandIn(pe.isRequireHandIn());
pet.setScheduleTemplate(template);
datePointer = datePointer.plusDays(durationInDays);
templateEstimatedDays += durationInDays;
projectEventTemplate.add(pet);
}
template.setProjectEventTemplates(projectEventTemplate);
template = scheduleTemplateDao.save(template);
return template;
}
/*public ScheduleTemplate generate(){
ScheduleTemplate template;
DateMidnight datePointer = new DateMidnight(startDate);
projectEventTemplate = new ArrayList<ProjectEventTemplate>();
int counter = 0;
for(ProjectEvent pe : projectEvents){
counter ++;
if(isMilestone(pe)){
durationInDays = (startDate.getDayOfYear() - (new DateMidnight(pe.getDueDate()).getDayOfYear()));
}else{
durationInDays = 0;
}
ProjectEventTemplate pet = new ProjectEventTemplate();
pet.setTitle(pe.getTitle());
pet.setDescription(pe.getDescription());
pet.setTemplateCreator(SciProSession.get().getUser());
pet.setEstimatedTimeConsumption(durationInDays);
pet.setNumberInOrder(counter);
pet.setRequireHandIn(pe.isRequireHandIn());
datePointer = datePointer.plusDays(durationInDays);
templateEstimatedDays += durationInDays;
projectEventTemplate.add(pet);
}
template = new ScheduleTemplate();
template.setCreator(SciProSession.get().getUser());
template.setSysAdminTemplate(false);
template.setProjectEventTemplates(projectEventTemplate);
return template;
}*/
public boolean isMilestone(ProjectEvent pe){ // events from templates have no participants and such events are milestones
return pe.getParticipants().isEmpty();
}
public Date getStartDate() {
return startDate.toDate();
}
public void setStartDate(Date startDate) {
this.startDate = new DateMidnight(startDate);
}
}

@ -88,8 +88,8 @@
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"></property>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/scipro"></property>
<property name="hibernate.connection.username" value="root"></property>
<property name="hibernate.connection.password" value="juju"></property>
<property name="hibernate.connection.username" value="scipro"></property>
<property name="hibernate.connection.password" value="pighleef"></property>
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"></property>
<property name="hibernate.c3p0.min_size" value="3"></property>
<property name="hibernate.c3p0.max_size" value="6"></property>

@ -64,8 +64,8 @@
<!-- Use deployment for production, development for development -->
<context-param>
<param-name>configuration</param-name>
<param-value>development</param-value>
<!--<param-value>deployment</param-value>-->
<!--param-value>development</param-value-->
<param-value>deployment</param-value>
</context-param>

@ -491,5 +491,46 @@ public class TestPeerReviewDaoJPA {
list.add(review1);
Assert.assertEquals(list, peerReviewDao.findPeerReviewsByStudentAndProject(reviewerRole, reviewerProject));
}
@Test
@Transactional
@Rollback
public void testFindLatestReviewers(){
PeerRequest request1 = new PeerRequest();
request1.setComment("plz b gentle!");
request1.setRequester(requesterRole);
request1.setProject(requesterProject);
request1 = peerRequestDao.save(request1);
PeerReview review1 = new PeerReview();
review1.setReviewer(reviewerRole);
review1.setProject(reviewerProject);
review1.setComment("Overall ok!");
review1.setPeerRequest(request1);
request1.setStatus(RequestStatus.FINISHED);
request1 = peerRequestDao.save(request1);
review1.setSubmitted(true);
review1 = peerReviewDao.save(review1);
PeerRequest request2 = new PeerRequest();
request2.setComment("plz b gentle!");
request2.setRequester(requesterRole);
request2.setProject(requesterProject);
request2 = peerRequestDao.save(request2);
PeerReview review2 = new PeerReview();
review2.setReviewer(reviewerRole);
review2.setProject(reviewerProject);
review2.setComment("Overall ok!");
review2.setPeerRequest(request2);
request2.setStatus(RequestStatus.FINISHED);
request2 = peerRequestDao.save(request2);
review2.setSubmitted(true);
review2 = peerReviewDao.save(review2);
List<PeerReview> sortedByDate = peerReviewDao.findReviewsSortedByDate();
Assert.assertEquals(review2, sortedByDate.get(0));
Assert.assertEquals(2, peerReviewDao.countSubmittedReviews());
}
}

@ -1,6 +1,10 @@
package se.su.dsv.scipro.dao.jpa;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
/**
* @author Dan Kjellman <dan-kjel@dsv.su.se>
@ -10,6 +14,13 @@ import org.junit.Ignore;
//@ContextConfiguration
@Ignore
public class TestProjectScheduleDaoJPA {
@Test @Transactional
@Rollback
public void testDBChange() {
//For deploy! added a date column to projectSchedule
Assert.assertEquals(true, false);
}
}