Merge branch 'm3_number_of_ideas' into develop

This commit is contained in:
Emil Siverhall 2012-08-01 10:49:04 +02:00
commit adaded1029
8 changed files with 264 additions and 104 deletions

@ -9,7 +9,6 @@ import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel; import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.time.Duration; import org.apache.wicket.util.time.Duration;
@ -17,6 +16,7 @@ import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.match.dataobject.SupervisorIdea; import se.su.dsv.scipro.match.dataobject.SupervisorIdea;
import se.su.dsv.scipro.peer.data.dao.controllers.Pair;
import se.su.dsv.scipro.reusable.AddRemoveStudentsPanel; import se.su.dsv.scipro.reusable.AddRemoveStudentsPanel;
import se.su.dsv.scipro.springdata.services.SupervisorIdeaService; import se.su.dsv.scipro.springdata.services.SupervisorIdeaService;
import se.su.dsv.scipro.util.JavascriptEventConfirmation; import se.su.dsv.scipro.util.JavascriptEventConfirmation;
@ -66,8 +66,14 @@ public class AcceptIdeaDialogPanel extends Panel {
@Override @Override
public void onSubmit(){ public void onSubmit(){
ideaService.partnerAcceptIdea(model, loggedInUser); Pair<Boolean, String> acceptance = ideaService.validatePartnerAcceptance(loggedInUser);
getSession().info("You have accepted to be a part of the project: "+ model.getObject().getTitle()); if(acceptance.head){
ideaService.partnerAcceptIdea(model.getObject(), loggedInUser);
getSession().info("You have accepted to be a part of the project: "+ model.getObject().getTitle());
} else {
getSession().error(acceptance.tail);
}
} }
}; };
EnclosureContainer cont = new EnclosureContainer("unconfirmedContainer", acceptButton); EnclosureContainer cont = new EnclosureContainer("unconfirmedContainer", acceptButton);
@ -78,7 +84,7 @@ public class AcceptIdeaDialogPanel extends Panel {
@Override @Override
public void onSubmit(){ public void onSubmit(){
ideaService.declineIdea(model); ideaService.declineIdea(model.getObject());
getSession().info("You have declined to be a part of the project: "+ model.getObject().getTitle()); getSession().info("You have declined to be a part of the project: "+ model.getObject().getTitle());
} }
}; };
@ -112,10 +118,12 @@ public class AcceptIdeaDialogPanel extends Panel {
@Override @Override
public void onSubmit() { public void onSubmit() {
if(ideaService.acceptIdea(model, loggedInUser, partnerPanel.getStudentSet())){ Pair<Boolean, String> acceptance = ideaService.validateIdeaAcceptance(model.getObject(), loggedInUser, partnerPanel.getStudentSet());
if(acceptance.head){
ideaService.acceptIdea(model.getObject(), loggedInUser, partnerPanel.getStudentSet());
getSession().info("You have successfully accepted this project idea"); getSession().info("You have successfully accepted this project idea");
} else { } else {
getSession().error("Something went wrong while trying to accept the project idea"); getSession().error(acceptance.tail);
} }

@ -41,7 +41,7 @@ public class CompleteIdeaDialogPanel extends Panel {
@Override @Override
public void onSubmit() { public void onSubmit() {
ideaService.updateIdea(model); ideaService.updateIdea(model.getObject());
getSession().info("Project idea updated"); getSession().info("Project idea updated");
} }
}; };
@ -56,7 +56,7 @@ public class CompleteIdeaDialogPanel extends Panel {
@Override @Override
public void onSubmit() { public void onSubmit() {
ideaService.declineIdea(model); ideaService.declineIdea(model.getObject());
getSession().info("Project idea participation cancelled"); getSession().info("Project idea participation cancelled");
} }
}; };

@ -22,6 +22,9 @@ public interface SupervisorIdeaRepo extends JpaRepository<SupervisorIdea, Long>,
@Query("select idea from SupervisorIdea idea, Student author join idea.ideaParticipations ideaPart join author.ideaParticipations authorPart where ideaPart = authorPart and author = ? and idea.ideaStatus = ?") @Query("select idea from SupervisorIdea idea, Student author join idea.ideaParticipations ideaPart join author.ideaParticipations authorPart where ideaPart = authorPart and author = ? and idea.ideaStatus = ?")
List<SupervisorIdea> findIdeasByAuthorAndStatus(Student author, IdeaStatus status); List<SupervisorIdea> findIdeasByAuthorAndStatus(Student author, IdeaStatus status);
@Query("select count(idea) from SupervisorIdea idea, Student author join idea.ideaParticipations ideaPart join author.ideaParticipations authorPart where ideaPart = authorPart and author = ? and idea.ideaStatus = ?")
Long countIdeasByAuthorAndStatus(Student author, IdeaStatus status);
@Query("select idea from SupervisorIdea idea, Student author join idea.ideaParticipations ideaPart join author.ideaParticipations authorPart where ideaPart = authorPart and author = ? and idea.ideaStatus = ? and ideaPart.confirmed = ?") @Query("select idea from SupervisorIdea idea, Student author join idea.ideaParticipations ideaPart join author.ideaParticipations authorPart where ideaPart = authorPart and author = ? and idea.ideaStatus = ? and ideaPart.confirmed = ?")
List<SupervisorIdea> findIdeas(Student author, IdeaStatus status, boolean confirmed); List<SupervisorIdea> findIdeas(Student author, IdeaStatus status, boolean confirmed);
} }

@ -7,7 +7,7 @@ import java.util.SortedSet;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.apache.wicket.model.IModel; import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@ -24,6 +24,7 @@ import se.su.dsv.scipro.match.dataobject.IdeaParticipation;
import se.su.dsv.scipro.match.dataobject.QSupervisorIdea; import se.su.dsv.scipro.match.dataobject.QSupervisorIdea;
import se.su.dsv.scipro.match.dataobject.SupervisorIdea; import se.su.dsv.scipro.match.dataobject.SupervisorIdea;
import se.su.dsv.scipro.match.dataobject.Watson; import se.su.dsv.scipro.match.dataobject.Watson;
import se.su.dsv.scipro.peer.data.dao.controllers.Pair;
import se.su.dsv.scipro.springdata.repos.SupervisorIdeaRepo; import se.su.dsv.scipro.springdata.repos.SupervisorIdeaRepo;
import se.su.dsv.scipro.springdata.services.ApplicationPeriodService; import se.su.dsv.scipro.springdata.services.ApplicationPeriodService;
import se.su.dsv.scipro.springdata.services.StudentService; import se.su.dsv.scipro.springdata.services.StudentService;
@ -46,7 +47,7 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
private SupervisorService supervisorService; private SupervisorService supervisorService;
@Resource @Resource
private ApplicationPeriodService applicationPeriodService; private ApplicationPeriodService applicationPeriodService;
private transient Logger logger = Logger.getLogger(SupervisorIdeaService.class);
private int MAX_PARTNERS = 1; private int MAX_PARTNERS = 1;
@Autowired @Autowired
@ -59,9 +60,7 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
@Override @Override
@Transactional ( readOnly = false ) @Transactional ( readOnly = false )
public void saveSupervisorCreatedIdea(IModel<SupervisorIdea> model, Employee creator, SortedSet<Student> students) { public void saveSupervisorCreatedIdea(SupervisorIdea idea, Employee creator, SortedSet<Student> students) {
SupervisorIdea idea = model.getObject();
if(!students.isEmpty()) { if(!students.isEmpty()) {
for(Student s : students) { for(Student s : students) {
@ -84,91 +83,133 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
@Override @Override
@Transactional ( readOnly = false ) @Transactional ( readOnly = false )
public void deleteWaitingIdea(IModel<SupervisorIdea> model) { public void deleteWaitingIdea(SupervisorIdea idea) {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId()); SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
if(!idea.getIdeaStatus().equals(IdeaStatus.WAITING)) //Should not be deleted if IdeaStatus is anything else than waiting. if(!reloadedIdea.getIdeaStatus().equals(IdeaStatus.WAITING)) //Should not be deleted if IdeaStatus is anything else than waiting.
return; return;
else else
supervisorIdeaRepo.delete(idea); supervisorIdeaRepo.delete(reloadedIdea);
} }
@Override @Override
@Transactional ( readOnly = false ) @Transactional ( readOnly = false )
public boolean acceptIdea(IModel<SupervisorIdea> model, User mainAuthor, public void acceptIdea(SupervisorIdea idea, User mainAuthor,
SortedSet<Student> studentSet) { SortedSet<Student> studentSet) {
if(studentSet.size()> MAX_PARTNERS){
return false; //You may not add more than a specified number of partners. SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
} else {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId());
if(idea.getProjectClass().getCode().equals(ProjectClass.BACHELOR) && studentSet.isEmpty()){
return false; //You need to select a partner if the idea is on bachelor level.
}
Student author = studentService.findByUser(mainAuthor); Student author = studentService.findByUser(mainAuthor);
if(studentSet.contains(author)) {
return false; //You may not select yourself as partner.
}
IdeaParticipation mainParticipation = new IdeaParticipation();
mainParticipation.setStudent(author);
mainParticipation.setSupervisorIdea(idea);
mainParticipation.setConfirmed(true);
author.addIdeaParticipation(mainParticipation);
for(Student s : studentSet) { for(Student s : studentSet) {
s = studentService.findOne(s.getId()); //Needed for lazy loading to work. s = studentService.findOne(s.getId()); //Needed for lazy loading to work.
IdeaParticipation ip = new IdeaParticipation(); IdeaParticipation ip = new IdeaParticipation();
ip.setStudent(s); ip.setStudent(s);
ip.setSupervisorIdea(idea); ip.setSupervisorIdea(reloadedIdea);
ip.setConfirmed(false); ip.setConfirmed(false);
s.addIdeaParticipation(ip); s.addIdeaParticipation(ip);
} }
idea.setIdeaStatus(IdeaStatus.TAKEN);
idea.setApplicationPeriod(applicationPeriodService.getCurrentPeriod(new Date(), idea.getProjectClass())); IdeaParticipation mainParticipation = new IdeaParticipation();
return true; mainParticipation.setStudent(author);
} mainParticipation.setSupervisorIdea(reloadedIdea);
mainParticipation.setConfirmed(true);
author.addIdeaParticipation(mainParticipation);
reloadedIdea.setIdeaStatus(IdeaStatus.TAKEN);
reloadedIdea.setApplicationPeriod(applicationPeriodService.getCurrentPeriod(new Date(), reloadedIdea.getProjectClass()));
} }
@Override
public Pair<Boolean, String> validateIdeaAcceptance(SupervisorIdea idea,
User mainAuthor, SortedSet<Student> students) {
if(students.size()> MAX_PARTNERS){
logger.error("Accepting user: "+mainAuthor.getEmailAddress()+ " Error: More than "+MAX_PARTNERS+" partner(s) added to project idea.");
return new Pair<Boolean, String>(false, "You may not add more than "+MAX_PARTNERS+" partner to the project idea"); //You may not add more than a specified number of partners.
}
SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
if(reloadedIdea.getProjectClass().getCode().equals(ProjectClass.BACHELOR) && students.isEmpty()){
logger.error("Accepting user: " + mainAuthor.getEmailAddress() + " Error: No partner selected on bachelor level thesis.");
return new Pair<Boolean, String>(false, "You need to select a partner when the idea is on bachelor level"); //You need to select a partner if the idea is on bachelor level.
}
Student author = studentService.findByUser(mainAuthor);
if(students.contains(author)) {
logger.error("Accepting user: " + mainAuthor.getEmailAddress() + " Error: Accepting user selected as his/her own partner.");
return new Pair<Boolean, String>(false, "You may not select yourself as partner"); //You may not select yourself as partner.
}
if(alreadyParticipatingOnIdea(author)) {
logger.error("Accepting user: " + mainAuthor.getEmailAddress() + " Error: Author already attached to a taken project idea.");
return new Pair<Boolean, String>(false, "You may only be part of one taken idea at once"); //You may only be part of one taken idea at once.
}
for(Student s : students) {
if(alreadyParticipatingOnIdea(s)) {
logger.error("Accepting user: " + mainAuthor.getEmailAddress() + " Error: Co-author already attached to a taken project idea.");
return new Pair<Boolean, String>(false, "Your project partner is already part of another project idea");
}
}
return new Pair<Boolean, String>(true, "Validation successful");
}
@Override
public Pair<Boolean, String> validatePartnerAcceptance(User user) {
Student author = studentService.findByUser(user);
if(partnerAlreadyParticipatingOnIdea(author)){
logger.error("Accepting user: " + user.getEmailAddress() + " Error: May not accept to be a partner if already participating in another idea.");
return new Pair<Boolean, String>(false, "You may not accept to be a partner if already participating in another idea");
}
return new Pair<Boolean, String>(true,"Validation passed");
}
@Override @Override
@Transactional (readOnly = false) @Transactional (readOnly = false)
public void partnerAcceptIdea(IModel<SupervisorIdea> model, User loggedInUser) { public void partnerAcceptIdea(SupervisorIdea idea, User loggedInUser) {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId()); SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
Student author = studentService.findByUser(loggedInUser); Student author = studentService.findByUser(loggedInUser);
for (IdeaParticipation ip : idea.getIdeaParticipations()) for (IdeaParticipation ip : reloadedIdea.getIdeaParticipations()) {
if(ip.getStudent().equals(author)) if(ip.getStudent().equals(author))
ip.setConfirmed(true); ip.setConfirmed(true);
if(idea.getApplicationPeriod()==null) { }
idea.setApplicationPeriod(applicationPeriodService.getCurrentPeriod(new Date(), idea.getProjectClass())); if(reloadedIdea.getApplicationPeriod()==null) {
reloadedIdea.setApplicationPeriod(applicationPeriodService.getCurrentPeriod(new Date(), reloadedIdea.getProjectClass()));
} }
} }
@Override @Override
@Transactional ( readOnly = false ) @Transactional ( readOnly = false )
public void declineIdea(IModel<SupervisorIdea> model) { public void declineIdea(SupervisorIdea idea) {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId()); SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
//Remove participations //Remove participations
for (IdeaParticipation ip : idea.getIdeaParticipations()) { for (IdeaParticipation ip : reloadedIdea.getIdeaParticipations()) {
Student s = ip.getStudent(); Student s = ip.getStudent();
s.removeIdeaParticipation(ip); s.removeIdeaParticipation(ip);
} }
//Erase watson boxes //Erase watson boxes
idea.setWatson(new Watson()); reloadedIdea.setWatson(new Watson());
//Remove application period association //Remove application period association
idea.setApplicationPeriod(null); reloadedIdea.setApplicationPeriod(null);
//Change status back to waiting //Change status back to waiting
idea.setIdeaStatus(IdeaStatus.WAITING); reloadedIdea.setIdeaStatus(IdeaStatus.WAITING);
} }
@Override @Override
@Transactional ( readOnly = false ) @Transactional ( readOnly = false )
public void updateIdea(IModel<SupervisorIdea> model) { public void updateIdea(SupervisorIdea idea) {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId()); SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
if(model.getObject().getWatson().getWhat()!=null) if(idea.getWatson().getWhat()!=null)
idea.getWatson().setWhat(model.getObject().getWatson().getWhat()); reloadedIdea.getWatson().setWhat(idea.getWatson().getWhat());
if(model.getObject().getWatson().getWhy()!=null) if(idea.getWatson().getWhy()!=null)
idea.getWatson().setWhy(model.getObject().getWatson().getWhy()); reloadedIdea.getWatson().setWhy(idea.getWatson().getWhy());
if(model.getObject().getWatson().getTheoryHow()!=null) if(idea.getWatson().getTheoryHow()!=null)
idea.getWatson().setTheoryHow(model.getObject().getWatson().getTheoryHow()); reloadedIdea.getWatson().setTheoryHow(idea.getWatson().getTheoryHow());
if(model.getObject().getWatson().getPracticalHow()!=null) if(idea.getWatson().getPracticalHow()!=null)
idea.getWatson().setPracticalHow(model.getObject().getWatson().getPracticalHow()); reloadedIdea.getWatson().setPracticalHow(idea.getWatson().getPracticalHow());
} }
@Override @Override
@ -187,8 +228,8 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
// Only editable if idea status is waiting and the current user is the creator // Only editable if idea status is waiting and the current user is the creator
@Override @Override
public boolean isIdeaEditable(IModel<SupervisorIdea> model, User currentUser) { public boolean isIdeaEditable(SupervisorIdea idea, User currentUser) {
return model.getObject().getIdeaStatus().equals(IdeaStatus.WAITING)&&model.getObject().getCreator().getUser().equals(currentUser); return idea.getIdeaStatus().equals(IdeaStatus.WAITING)&&idea.getCreator().getUser().equals(currentUser);
} }
@ -228,6 +269,21 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
return ideas; return ideas;
} }
@Override
public Long countByStatus(IdeaStatus status) {
return supervisorIdeaRepo.count(byStatus(status));
}
@Override
public Long countIdeas(IdeaStatus status, Employee supervisor, ProjectClass pc) {
return supervisorIdeaRepo.count(byStatus(status).and(bySupervisor(supervisor)).and(byLevel(pc)));
}
@Override
public Long countByAuthorAndStatus(Student author, IdeaStatus status) {
return supervisorIdeaRepo.countIdeasByAuthorAndStatus(author, status);
}
private Predicate predicateFromParams(FilterParams params) { private Predicate predicateFromParams(FilterParams params) {
return levelFilter(params.getLevels()).and(bySupervisor(params.getSupervisor())); return levelFilter(params.getLevels()).and(bySupervisor(params.getSupervisor()));
} }
@ -286,14 +342,19 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
return QSupervisorIdea.supervisorIdea.ideaStatus.eq(status); return QSupervisorIdea.supervisorIdea.ideaStatus.eq(status);
} }
@Override private boolean alreadyParticipatingOnIdea(Student author) {
public Long countByStatus(IdeaStatus status) { Long ideas = countByAuthorAndStatus(author, IdeaStatus.TAKEN);
return supervisorIdeaRepo.count(byStatus(status)); if(ideas==0)
return false;
else
return true;
} }
@Override private boolean partnerAlreadyParticipatingOnIdea(Student author) {
public Long countIdeas(IdeaStatus status, Employee supervisor, ProjectClass pc) { Long ideas = countByAuthorAndStatus(author, IdeaStatus.TAKEN);
return supervisorIdeaRepo.count(byStatus(status).and(bySupervisor(supervisor)).and(byLevel(pc))); if(ideas==1)
return false;
else
return true;
} }
} }

@ -5,7 +5,6 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.SortedSet; import java.util.SortedSet;
import org.apache.wicket.model.IModel;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@ -15,6 +14,7 @@ import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.match.dataobject.Idea.IdeaStatus; import se.su.dsv.scipro.match.dataobject.Idea.IdeaStatus;
import se.su.dsv.scipro.match.dataobject.SupervisorIdea; import se.su.dsv.scipro.match.dataobject.SupervisorIdea;
import se.su.dsv.scipro.peer.data.dao.controllers.Pair;
public interface SupervisorIdeaService extends GenericService<SupervisorIdea, Long>, QueryService<SupervisorIdea, Long> { public interface SupervisorIdeaService extends GenericService<SupervisorIdea, Long>, QueryService<SupervisorIdea, Long> {
@ -25,19 +25,23 @@ public interface SupervisorIdeaService extends GenericService<SupervisorIdea, Lo
List<SupervisorIdea> findByStatusAndAuthor(IdeaStatus status, Student author); List<SupervisorIdea> findByStatusAndAuthor(IdeaStatus status, Student author);
List<SupervisorIdea> findIdeas(IdeaStatus status, Student author, boolean confirmed); List<SupervisorIdea> findIdeas(IdeaStatus status, Student author, boolean confirmed);
Long countByAuthorAndStatus(Student author, IdeaStatus status);
Long countByStatus(IdeaStatus status); Long countByStatus(IdeaStatus status);
Long countIdeas(IdeaStatus status, Employee supervisor, ProjectClass pc); Long countIdeas(IdeaStatus status, Employee supervisor, ProjectClass pc);
void saveSupervisorCreatedIdea(IModel<SupervisorIdea> model, Employee creator, SortedSet<Student> students); void saveSupervisorCreatedIdea(SupervisorIdea idea, Employee creator, SortedSet<Student> students);
void deleteWaitingIdea(IModel<SupervisorIdea> model); void acceptIdea(SupervisorIdea idea, User mainAuthor, SortedSet<Student> sortedSet);
void partnerAcceptIdea(IModel<SupervisorIdea> model, User loggedInUser); void deleteWaitingIdea(SupervisorIdea idea);
void declineIdea(IModel<SupervisorIdea> model); void partnerAcceptIdea(SupervisorIdea idea, User loggedInUser);
void updateIdea(IModel<SupervisorIdea> model); void declineIdea(SupervisorIdea idea);
void updateIdea(SupervisorIdea idea);
boolean acceptIdea(IModel<SupervisorIdea> model, User mainAuthor, SortedSet<Student> sortedSet);
boolean hasTakenIdeas(User authorUser, boolean confirmed); boolean hasTakenIdeas(User authorUser, boolean confirmed);
boolean isIdeaEditable(IModel<SupervisorIdea> model, User currentUser); boolean isIdeaEditable(SupervisorIdea idea, User currentUser);
Pair<Boolean, String> validateIdeaAcceptance(SupervisorIdea idea, User loggedInUser, SortedSet<Student> students);
Pair<Boolean, String> validatePartnerAcceptance(User loggedInUser);
public static class FilterParams implements Serializable { public static class FilterParams implements Serializable {
private static final long serialVersionUID = 4981420721152104292L; private static final long serialVersionUID = 4981420721152104292L;
@ -61,4 +65,6 @@ public interface SupervisorIdeaService extends GenericService<SupervisorIdea, Lo
} }
} }
} }

@ -155,7 +155,7 @@ public class SupervisorEditIdeaPanel extends Panel {
target.addComponent(feedbackPanel); target.addComponent(feedbackPanel);
try { try {
ideaService.saveSupervisorCreatedIdea(model, ideaCreator, studentsPanel.getStudentSet()); ideaService.saveSupervisorCreatedIdea(model.getObject(), ideaCreator, studentsPanel.getStudentSet());
setResponsePage(SupervisorProjectIdeaStartPage.class); setResponsePage(SupervisorProjectIdeaStartPage.class);
getSession().info("Idea successfully submitted"); getSession().info("Idea successfully submitted");
} catch (Exception e) { } catch (Exception e) {

@ -111,7 +111,7 @@ public class SupervisorProjectIdeaOverviewPanel extends Panel {
@Override @Override
public boolean shouldBeVisible(IModel<SupervisorIdea> ideaModel) { public boolean shouldBeVisible(IModel<SupervisorIdea> ideaModel) {
return ideaService.isIdeaEditable(ideaModel, supervisor); return ideaService.isIdeaEditable(ideaModel.getObject(), supervisor);
} }
}; };
columns[6] = new ClickableIconColumn<SupervisorIdea>(Model.of("Delete"), null, ImageIcon.ICON_DELETE) { columns[6] = new ClickableIconColumn<SupervisorIdea>(Model.of("Delete"), null, ImageIcon.ICON_DELETE) {
@ -119,12 +119,12 @@ public class SupervisorProjectIdeaOverviewPanel extends Panel {
@Override @Override
protected void onClick(IModel<SupervisorIdea> ideaModel, protected void onClick(IModel<SupervisorIdea> ideaModel,
AjaxRequestTarget target) { AjaxRequestTarget target) {
ideaService.deleteWaitingIdea(ideaModel); ideaService.deleteWaitingIdea(ideaModel.getObject());
target.addComponent(getWMC()); target.addComponent(getWMC());
} }
@Override @Override
public boolean shouldBeVisible(IModel<SupervisorIdea> ideaModel) { public boolean shouldBeVisible(IModel<SupervisorIdea> ideaModel) {
return ideaService.isIdeaEditable(ideaModel, supervisor); return ideaService.isIdeaEditable(ideaModel.getObject(), supervisor);
} }
}; };

@ -6,12 +6,11 @@ import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet; import java.util.TreeSet;
import junit.framework.Assert; import junit.framework.Assert;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -36,6 +35,7 @@ import se.su.dsv.scipro.match.dataobject.Keyword;
import se.su.dsv.scipro.match.dataobject.KeywordType; import se.su.dsv.scipro.match.dataobject.KeywordType;
import se.su.dsv.scipro.match.dataobject.SupervisorIdea; import se.su.dsv.scipro.match.dataobject.SupervisorIdea;
import se.su.dsv.scipro.match.facade.ApplicationPeriodFacade; import se.su.dsv.scipro.match.facade.ApplicationPeriodFacade;
import se.su.dsv.scipro.peer.data.dao.controllers.Pair;
import se.su.dsv.scipro.springdata.services.ProjectClassService; import se.su.dsv.scipro.springdata.services.ProjectClassService;
import se.su.dsv.scipro.springdata.services.RoleService; import se.su.dsv.scipro.springdata.services.RoleService;
import se.su.dsv.scipro.springdata.services.SupervisorIdeaService; import se.su.dsv.scipro.springdata.services.SupervisorIdeaService;
@ -64,8 +64,8 @@ public class TestSupervisorIdea {
private KeywordDao keywordDao; private KeywordDao keywordDao;
private ProjectClass bachelor, master; private ProjectClass bachelor, master;
private User authorUser1, authorUser2, supervisorUser, supervisorUser2, unconfirmedUser; private User authorUser1, authorUser2, authorUser3, supervisorUser, supervisorUser2;
private Student author1, author2, unconfirmedAuthor; private Student author1, author2, author3;
private Employee supervisor, supervisor2; private Employee supervisor, supervisor2;
private SupervisorIdea waitingBachelorIdea, waitingMasterIdea, takenBachelorIdea, completedMasterIdea, waitingBachelor2, waitingMaster2, waitingBachelor3; private SupervisorIdea waitingBachelorIdea, waitingMasterIdea, takenBachelorIdea, completedMasterIdea, waitingBachelor2, waitingMaster2, waitingBachelor3;
private ApplicationPeriod bachelorPeriod, masterPeriod; private ApplicationPeriod bachelorPeriod, masterPeriod;
@ -88,13 +88,13 @@ public class TestSupervisorIdea {
supervisorUser2 = newUser(); supervisorUser2 = newUser();
authorUser1 = newUser(); authorUser1 = newUser();
authorUser2 = newUser(); authorUser2 = newUser();
unconfirmedUser = newUser(); authorUser3 = newUser();
supervisor = newEmployee(supervisorUser); supervisor = newEmployee(supervisorUser);
supervisor2 = newEmployee(supervisorUser2); supervisor2 = newEmployee(supervisorUser2);
author1 = newStudent(authorUser1); author1 = newStudent(authorUser1);
author2 = newStudent(authorUser2); author2 = newStudent(authorUser2);
unconfirmedAuthor = newStudent(unconfirmedUser); author3 = newStudent(authorUser3);
KeywordType type = new KeywordType("test type"); KeywordType type = new KeywordType("test type");
type = keywordTypeDao.save(type); type = keywordTypeDao.save(type);
@ -189,8 +189,12 @@ public class TestSupervisorIdea {
@Rollback @Rollback
public void testSaveSupervisorCreatedIdea() { public void testSaveSupervisorCreatedIdea() {
Assert.assertEquals(new Long(5), ideaService.countByStatus(IdeaStatus.WAITING)); Assert.assertEquals(new Long(5), ideaService.countByStatus(IdeaStatus.WAITING));
IModel<SupervisorIdea> model = newIdeaModel(bachelor); SupervisorIdea idea = new SupervisorIdea();
ideaService.saveSupervisorCreatedIdea(model, supervisor, new TreeSet<Student>()); idea.setProjectClass(bachelor);
idea.setTitle("Title");
idea.setDescription("Description");
idea.setRequirements("Reqs");
ideaService.saveSupervisorCreatedIdea(idea, supervisor, new TreeSet<Student>());
Assert.assertEquals(new Long(6), ideaService.countByStatus(IdeaStatus.WAITING)); Assert.assertEquals(new Long(6), ideaService.countByStatus(IdeaStatus.WAITING));
} }
@ -200,14 +204,14 @@ public class TestSupervisorIdea {
@Transactional @Transactional
@Rollback @Rollback
public void testIfIdeaIsEditable() { public void testIfIdeaIsEditable() {
boolean shouldBeTrue = ideaService.isIdeaEditable(Model.of(waitingBachelorIdea), supervisorUser); boolean shouldBeTrue = ideaService.isIdeaEditable(waitingBachelorIdea, supervisorUser);
Assert.assertTrue("Not true", shouldBeTrue); Assert.assertTrue("Not true", shouldBeTrue);
boolean shouldBeFalse = ideaService.isIdeaEditable(Model.of(takenBachelorIdea), supervisorUser); boolean shouldBeFalse = ideaService.isIdeaEditable(takenBachelorIdea, supervisorUser);
Assert.assertFalse("Not false", shouldBeFalse); Assert.assertFalse("Not false", shouldBeFalse);
waitingBachelorIdea.setCreator(supervisor2); waitingBachelorIdea.setCreator(supervisor2);
boolean shouldAlsoBeFalse = ideaService.isIdeaEditable(Model.of(waitingBachelorIdea), supervisorUser); boolean shouldAlsoBeFalse = ideaService.isIdeaEditable(waitingBachelorIdea, supervisorUser);
Assert.assertFalse("Not false", shouldAlsoBeFalse); Assert.assertFalse("Not false", shouldAlsoBeFalse);
} }
@ -219,12 +223,12 @@ public class TestSupervisorIdea {
List<SupervisorIdea> ideaList = constructList(ideas); List<SupervisorIdea> ideaList = constructList(ideas);
Assert.assertEquals(7, ideaList.size()); Assert.assertEquals(7, ideaList.size());
ideaService.deleteWaitingIdea(Model.of(takenBachelorIdea)); //Should not be deleted. ideaService.deleteWaitingIdea(takenBachelorIdea); //Should not be deleted.
ideas = ideaService.findAll(); ideas = ideaService.findAll();
ideaList = constructList(ideas); ideaList = constructList(ideas);
Assert.assertEquals(7, ideaList.size()); Assert.assertEquals(7, ideaList.size());
ideaService.deleteWaitingIdea(Model.of(waitingBachelorIdea)); //Should be deleted. ideaService.deleteWaitingIdea(waitingBachelorIdea); //Should be deleted.
ideas = ideaService.findAll(); ideas = ideaService.findAll();
ideaList = constructList(ideas); ideaList = constructList(ideas);
Assert.assertEquals(6, ideaList.size()); Assert.assertEquals(6, ideaList.size());
@ -319,6 +323,93 @@ public class TestSupervisorIdea {
Assert.assertEquals(Arrays.asList(new SupervisorIdea[]{waitingBachelorIdea, waitingMasterIdea}), ideas); Assert.assertEquals(Arrays.asList(new SupervisorIdea[]{waitingBachelorIdea, waitingMasterIdea}), ideas);
} }
@Test
@Transactional
@Rollback
public void testCountIdeasByAuthorAndStatus() {
Long numberOfWaitingIdeas = ideaService.countByAuthorAndStatus(author1, IdeaStatus.TAKEN);
Assert.assertTrue(numberOfWaitingIdeas==0);
IdeaParticipation participation = new IdeaParticipation();
participation.setStudent(author1);
participation.setSupervisorIdea(takenBachelorIdea);
participation.setConfirmed(true);
author1.addIdeaParticipation(participation);
numberOfWaitingIdeas = ideaService.countByAuthorAndStatus(author1, IdeaStatus.TAKEN);
Assert.assertTrue(numberOfWaitingIdeas==1);
}
@Test
@Transactional
@Rollback
public void testIdeaAcceptance() {
Pair<Boolean, String> acceptance = ideaService.validateIdeaAcceptance(waitingBachelorIdea, authorUser1, new TreeSet<Student>());
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept a bachelor idea without partner.
SortedSet<Student> partnerSet = new TreeSet<Student>();
partnerSet.add(author2);
partnerSet.add(author3);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelorIdea, authorUser1, partnerSet);
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept a bachelor idea with more than one partner.
partnerSet.add(author1);
partnerSet.remove(author2);
partnerSet.remove(author3);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelorIdea, authorUser1, partnerSet);
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept a bachelor idea with himself as partner.
partnerSet.remove(author1);
partnerSet.add(author2);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelorIdea, authorUser1, partnerSet);
Assert.assertTrue("Not true", acceptance.head); //Everything ok, should be able to accept a bachelor with one partner.
if(acceptance.head)
ideaService.acceptIdea(waitingBachelorIdea, authorUser1, partnerSet);
partnerSet.remove(author2);
partnerSet.add(author3);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelor2, authorUser1, partnerSet);
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept more than one idea.
partnerSet.remove(author3);
partnerSet.add(author2);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelor2, authorUser3, partnerSet);
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept when the partner have a taken idea.
}
@Test
@Transactional
@Rollback
public void testPartnerAcceptIdea() {
SortedSet<Student> studentSet = new TreeSet<Student>();
studentSet.add(author1);
studentSet.add(author2);
SupervisorIdea idea = new SupervisorIdea();
idea.setProjectClass(bachelor);
idea.setTitle("Title");
idea.setDescription("Description");
idea.setRequirements("Reqs");
ideaService.saveSupervisorCreatedIdea(idea, supervisor, studentSet);
Assert.assertNull(idea.getApplicationPeriod());
for(IdeaParticipation ip : author1.getIdeaParticipations())
Assert.assertFalse(ip.isConfirmed());
for(IdeaParticipation ip : author2.getIdeaParticipations())
Assert.assertFalse(ip.isConfirmed());
ideaService.partnerAcceptIdea(idea, authorUser1);
Assert.assertNotNull(idea.getApplicationPeriod());
}
// HELPER METHODS // HELPER METHODS
private SupervisorIdea newIdea(ProjectClass pc, ApplicationPeriod ap, Employee supervisor, IdeaStatus ideaStatus) { private SupervisorIdea newIdea(ProjectClass pc, ApplicationPeriod ap, Employee supervisor, IdeaStatus ideaStatus) {
SupervisorIdea idea = new SupervisorIdea(); SupervisorIdea idea = new SupervisorIdea();
@ -332,15 +423,6 @@ public class TestSupervisorIdea {
return ideaService.save(idea); return ideaService.save(idea);
} }
private IModel<SupervisorIdea> newIdeaModel(ProjectClass pc) {
IModel<SupervisorIdea> model = new Model<SupervisorIdea>(new SupervisorIdea());
model.getObject().setDescription("Model description");
model.getObject().setRequirements("Model reqs");
model.getObject().setTitle("Model title");
model.getObject().setProjectClass(pc);
model.getObject().setKeywords(newKeywordSet());
return model;
}
private Set<Keyword> newKeywordSet() { private Set<Keyword> newKeywordSet() {
Set<Keyword> set = new HashSet<Keyword>(); Set<Keyword> set = new HashSet<Keyword>();