Almost done with saving schedules as templates

This commit is contained in:
Fredrik Norberg 2011-07-20 17:17:38 +02:00
parent 85480e30f2
commit f6bff289b9
10 changed files with 121 additions and 22 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,7 @@ 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,9 +52,9 @@ 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;
if(isSysAdminView){
responseClass = AdminScheduleTemplatesPage.class;
@ -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());
}

@ -4,12 +4,11 @@ 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 org.joda.time.DateTimeConstants;
import org.joda.time.Days;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
@ -20,7 +19,7 @@ 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 { //shamelessly taken alot from ScheduleGenerator
public class TemplateGenerator { //based on ScheduleGenerator
@SpringBean
private ProjectScheduleDao scheduleTemplateDao;
@ -30,20 +29,17 @@ public class TemplateGenerator { //shamelessly taken alot from ScheduleGenerator
private Project project;
private ProjectSchedule schedule;
private Set<ProjectEvent> projectEvents;
private TreeSet<ProjectEvent> projectEvents;
private List<ProjectEventTemplate> projectEventTemplate;
private int templateEstimatedDays = 0;
private int durationInDays = 0;
private DateMidnight startDate;
private DateMidnight endDate;
public TemplateGenerator(Long templateId, Long projectId, Date startDate, Date endDate){
public TemplateGenerator(Long projectId){
InjectorHolder.getInjector().inject(this);
this.startDate = new DateMidnight(startDate);
this.endDate = new DateMidnight(endDate);
project = projectDao.load(projectId);
if(project == null){
@ -51,10 +47,58 @@ public class TemplateGenerator { //shamelessly taken alot from ScheduleGenerator
}
schedule = project.getProjectSchedule();
projectEvents = schedule.getProjectEvents();
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;
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());
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 ScheduleTemplate generate(){
ScheduleTemplate template;
@ -90,7 +134,7 @@ public class TemplateGenerator { //shamelessly taken alot from ScheduleGenerator
return template;
}
}*/
public boolean isMilestone(ProjectEvent pe){ // events from templates have no participants and such events are milestones
return pe.getParticipants().isEmpty();
@ -104,11 +148,5 @@ public class TemplateGenerator { //shamelessly taken alot from ScheduleGenerator
this.startDate = new DateMidnight(startDate);
}
public Date getEndDate() {
return endDate.toDate();
}
public void setEndDate(Date endDate) {
this.endDate = new DateMidnight(endDate);
}
}

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