Merge branch 'activityplan' into develop

* activityplan:
  implemented the functionality to save activityplans as templates
  Almost done with saving schedules as templates
  daily commit
This commit is contained in:
Fredrik Norberg 2011-07-21 11:06:43 +02:00
commit ef1b67701f
10 changed files with 228 additions and 4 deletions

@ -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() {

@ -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);
}
}

@ -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>
@ -8,8 +12,15 @@ import org.junit.Ignore;
*/
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration
@Ignore
//@Ignore
public class TestProjectScheduleDaoJPA {
@Test @Transactional
@Rollback
public void testDBChange() {
//For deploy! added a date column to projectSchedule
Assert.assertEquals(true, false);
}
}