Merge branch 'dateFiltering' into develop

This commit is contained in:
Emil Siverhall 2012-05-28 13:47:44 +02:00
commit 82f885b10a
13 changed files with 314 additions and 103 deletions

@ -144,7 +144,19 @@ public class AdminMailPanel extends Panel {
DateTime start = new DateTime();
start = start.minusMonths(6);
dpp = new DatePickerPanel("datePanel", start.toDate(), null);
dpp = new DatePickerPanel("datePanel", start.toDate(), null) {
private static final long serialVersionUID = 8199436051263013307L;
@Override
public void updateStartDate(AjaxRequestTarget target) {
updateUserSet(target);
}
@Override
public void updateEndDate(AjaxRequestTarget target) {
updateUserSet(target);
}
};
add(dpp);
}

@ -11,11 +11,7 @@ import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
public class DatePickerPanel extends Panel{
public abstract class DatePickerPanel extends Panel{
private static final long serialVersionUID = -5607127520132313062L;
@ -74,6 +70,7 @@ public class DatePickerPanel extends Panel{
@Override
protected void onUpdate(AjaxRequestTarget target) {
setStartDate(startDtf.getModelObject());
updateStartDate(target);
}
};
@ -85,7 +82,7 @@ public class DatePickerPanel extends Panel{
@Override
protected void onUpdate(AjaxRequestTarget target) {
setEndDate(endDtf.getModelObject());
updateEndDate(target);
}
};
@ -128,4 +125,8 @@ public class DatePickerPanel extends Panel{
//model.getObject().setEndDate(dpm.getEndDate());
endDtf.setModelObject(dpm.getEndDate());
}
public abstract void updateStartDate(AjaxRequestTarget target);
public abstract void updateEndDate(AjaxRequestTarget target);
}

@ -8,7 +8,7 @@
<wicket:panel>
<div wicket:id="container">
<label for="checkGroup">Filter by status:</label>
<label for="checkGroup">Filter by status</label>
<div wicket:id="checkGroup">
<div wicket:id="statusView">
<input type="checkbox" wicket:id="statusCheckBox"></input>

@ -8,7 +8,7 @@
<wicket:panel>
<div wicket:id="container">
<label for="checkGroup">Filter by status:</label>
<label for="checkGroup">Filter by status</label>
<div wicket:id="checkGroup">
<div wicket:id="statusView">
<input type="checkbox" wicket:id="statusCheckBox"></input>

@ -6,15 +6,17 @@
<div class="span-24 prepend-top last">
<form wicket:id="form">
<div class="span-6">
<label>Filter by requesting author:</label>
<div class="span-5">
<label>Filter by requesting author</label>
<br />
<input wicket:id="filterAuthor" />
<br />
</div>
<div class="span-6" wicket:id="statusFilter"></div>
<div class="span-5" wicket:id="statusFilter"></div>
<label>Request created between</label><br />
<div class="span-6" wicket:id="datePanel"></div>
<div class="span-10" wicket:id="supervisorContainer">
<label>Show only my projects:</label>
<label>Show only my projects</label>
<br />
<input type="checkbox" wicket:id="supervisorCheckBox" />
<br />

@ -3,6 +3,7 @@
*/
package se.su.dsv.scipro.peer.panels;
import java.util.Date;
import java.util.Iterator;
import org.apache.wicket.ajax.AjaxRequestTarget;
@ -22,10 +23,12 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.joda.time.DateTime;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.components.DatePickerPanel;
import se.su.dsv.scipro.components.ItemsPerPageChoice;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.Student;
@ -137,6 +140,28 @@ public class PeerRequestListPanel extends Panel {
};
params.setStatuses(statusFilter.getSelectedStatuses());
add(statusFilter);
DateTime start = new DateTime();
start = start.minusMonths(12);
params.setCreatedAfter(start.toDate());
params.setCreatedBefore(new Date());
final DatePickerPanel datePanel = new DatePickerPanel("datePanel", start.toDate(), null) {
private static final long serialVersionUID = 1502923890365050302L;
@Override
public void updateStartDate(AjaxRequestTarget target) {
params.setCreatedAfter(getStartDate());
updateTarget(target, params);
}
@Override
public void updateEndDate(AjaxRequestTarget target) {
params.setCreatedBefore(getEndDate());
updateTarget(target, params);
}
};
add(datePanel);
final AjaxCheckBox supervisorProjects = new AjaxCheckBox("supervisorCheckBox", new Model<Boolean>()) {
private static final long serialVersionUID = -7624763782876907386L;

@ -6,15 +6,17 @@
<div class="span-24 prepend-top last">
<form wicket:id="form">
<div class="span-6">
<label>Filter by reviewing author:</label>
<div class="span-5">
<label>Filter by reviewing author</label>
<br/>
<input wicket:id="filterAuthor"/>
<br/>
</div>
<div class="span-6" wicket:id="statusFilter"></div>
<div class="span-5" wicket:id="statusFilter"></div>
<label>Review commenced between</label><br />
<div class="span-6" wicket:id="datePanel"></div>
<div class="span-10" wicket:id="supervisorContainer">
<label>Show only my projects:</label>
<label>Show only my projects</label>
<br>
<input type="checkbox" wicket:id="supervisorCheckBox"/>
<br>

@ -3,6 +3,7 @@
*/
package se.su.dsv.scipro.peer.panels;
import java.util.Date;
import java.util.Iterator;
import org.apache.wicket.PageParameters;
@ -23,10 +24,12 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.joda.time.DateTime;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.components.DatePickerPanel;
import se.su.dsv.scipro.components.ItemsPerPageChoice;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.Student;
@ -159,6 +162,27 @@ public class PeerReviewListPanel extends Panel {
}
};
add(statusFilter);
DateTime start = new DateTime();
start = start.minusMonths(12);
params.setCreatedAfter(start.toDate());
params.setCreatedBefore(new Date());
final DatePickerPanel datePanel = new DatePickerPanel("datePanel", start.toDate(), null) {
private static final long serialVersionUID = -411662653140866688L;
@Override
public void updateStartDate(AjaxRequestTarget target) {
params.setCreatedAfter(getStartDate());
updateTarget(target, params);
}
@Override
public void updateEndDate(AjaxRequestTarget target) {
params.setCreatedBefore(getEndDate());
updateTarget(target, params);
}
};
add(datePanel);
final AjaxCheckBox supervisorProjects = new AjaxCheckBox("supervisorCheckBox", new Model<Boolean>()) {
private static final long serialVersionUID = -6475334474261478489L;

@ -2,6 +2,7 @@ package se.su.dsv.scipro.springdata.serviceimpls;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
@ -132,6 +133,13 @@ public class PeerRequestServiceImpl extends AbstractQueryService<PeerRequest, Lo
}
}
private BooleanExpression createdBetween(Date from, Date to) {
if(from!=null&to!=null)
return QPeerRequest.peerRequest.dateCreated.between(from, to);
else
return null;
}
private BooleanBuilder statusFilter(Collection<RequestStatus> statuses){
BooleanBuilder e = new BooleanBuilder();
if(statuses!=null && !statuses.isEmpty()){
@ -150,7 +158,8 @@ public class PeerRequestServiceImpl extends AbstractQueryService<PeerRequest, Lo
private Predicate predicateFromParams(FilterParams params) {
return isRequester(params.getAuthor())
.and(statusFilter(params.getStatuses()))
.and(supervisorIs(params.getSupervisor()));
.and(supervisorIs(params.getSupervisor()))
.and(createdBetween(params.getCreatedAfter(), params.getCreatedBefore()));
}
@Transactional ( readOnly = false )

@ -1,6 +1,7 @@
package se.su.dsv.scipro.springdata.serviceimpls;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
@ -55,7 +56,8 @@ public class PeerReviewServiceImpl extends AbstractQueryService<PeerReview, Long
private Predicate predicateFromParams(FilterParams params) {
return reviewerIs(params.getAuthor())
.and(statusFilter(params.isIncludeCompleted(), params.isIncludeAborted(), params.isIncludeInProgress()))
.and(supervisorIs(params.getSupervisor()));
.and(supervisorIs(params.getSupervisor()))
.and(startedBetween(params.getCreatedAfter(), params.getCreatedBefore()));
}
@ -135,7 +137,7 @@ public class PeerReviewServiceImpl extends AbstractQueryService<PeerReview, Long
private BooleanBuilder statusFilter(boolean includeCompleted,boolean includeAborted,boolean includeInProgress) {
BooleanBuilder e = new BooleanBuilder();
if(includeCompleted)
e.and(isAborted(false).and(isSubmitted(true)).and(isDeleted(false)));
e.or(isAborted(false).and(isSubmitted(true)).and(isDeleted(false)));
if(includeAborted)
e.or(isAborted(true).and(isSubmitted(false)).and(isDeleted(false)));
if(includeInProgress)
@ -181,6 +183,14 @@ public class PeerReviewServiceImpl extends AbstractQueryService<PeerReview, Long
private BooleanExpression isSubmitted(boolean isSubmitted){
return QPeerReview.peerReview.submitted.eq(isSubmitted);
}
private BooleanExpression startedBetween(Date from, Date to) {
if(from!=null&&to!=null) {
return QPeerReview.peerReview.dateCreated.between(from, to);
}
else
return null;
}
//Construct a list from Iterable Object.
private List<PeerReview> constructList(Iterable<PeerReview> reviews) {

@ -2,6 +2,7 @@ package se.su.dsv.scipro.springdata.services;
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.springframework.data.domain.Page;
@ -36,6 +37,8 @@ public interface PeerRequestService extends GenericService<PeerRequest, Long>, Q
private Employee supervisor;
private Student author;
private Collection<RequestStatus> statuses;
private Date createdAfter;
private Date createdBefore;
public void setSupervisor(Employee supervisor) {
this.supervisor = supervisor;
@ -55,6 +58,18 @@ public interface PeerRequestService extends GenericService<PeerRequest, Long>, Q
public Student getAuthor() {
return author;
}
public void setCreatedAfter(Date createdAfter) {
this.createdAfter = createdAfter;
}
public Date getCreatedAfter() {
return createdAfter;
}
public void setCreatedBefore(Date createdBefore) {
this.createdBefore = createdBefore;
}
public Date getCreatedBefore() {
return createdBefore;
}
}
}

@ -1,6 +1,7 @@
package se.su.dsv.scipro.springdata.services;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import org.springframework.data.domain.Page;
@ -39,6 +40,8 @@ public interface PeerReviewService extends GenericService<PeerReview, Long>, Que
private boolean includeCompleted;
private boolean includeAborted;
private boolean includeInProgress;
private Date createdAfter;
private Date createdBefore;
public void setIncludeCompleted(boolean includeCompleted) {
this.includeCompleted = includeCompleted;
@ -80,5 +83,21 @@ public interface PeerReviewService extends GenericService<PeerReview, Long>, Que
return author;
}
public void setCreatedAfter(Date createdAfter) {
this.createdAfter = createdAfter;
}
public Date getCreatedAfter() {
return createdAfter;
}
public void setCreatedBefore(Date createdBefore) {
this.createdBefore = createdBefore;
}
public Date getCreatedBefore() {
return createdBefore;
}
}
}

@ -1,15 +1,21 @@
package se.su.dsv.scipro.springdata;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import junit.framework.Assert;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -18,18 +24,15 @@ import org.springframework.transaction.annotation.Transactional;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.enums.ProjectStatus;
import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
import se.su.dsv.scipro.peer.data.dataobjects.PeerRequest;
import se.su.dsv.scipro.peer.data.dataobjects.PeerReview;
import se.su.dsv.scipro.peer.enums.RequestStatus;
import se.su.dsv.scipro.springdata.services.PeerRequestService;
import se.su.dsv.scipro.springdata.services.PeerReviewService;
import se.su.dsv.scipro.springdata.services.ProjectClassService;
import se.su.dsv.scipro.springdata.services.ProjectFollowerService;
import se.su.dsv.scipro.springdata.services.ProjectService;
import se.su.dsv.scipro.springdata.services.RoleService;
import se.su.dsv.scipro.springdata.services.UserService;
@ -60,107 +63,41 @@ public class TestPeerReview {
private ProjectClass bachelor;
private ProjectClass master;
private PeerReview review1, review2, review3;
private PeerRequest request1, request2, request3, awaitingRequest;
private PeerRequest request1, request2, request3, request4;
@Before
public void startTransaction() throws Exception {
bachelor = new ProjectClass(ProjectClass.BACHELOR, "Bachelor", "Bachelor degree thesis project");
bachelor = projectClassService.save(bachelor);
master = new ProjectClass(ProjectClass.MASTER, "Master", "Master degree thesis project");
master = projectClassService.save(master);
employeeUser = new User();
employeeUser = userService.save(employeeUser);
reviewer = new User();
reviewer = userService.save(reviewer);
requester = new User();
requester = userService.save(requester);
reviewerRole = new Student();
reviewerRole.setUser(reviewer);
reviewerRole = (Student) roleService.save(reviewerRole);
requesterRole = new Student();
requesterRole.setUser(requester);
requesterRole = (Student) roleService.save(requesterRole);
reviewerRole = newStudent(reviewer);
requesterRole = newStudent(requester);
headSupervisor = new Employee();
headSupervisor.setUser(employeeUser);
headSupervisor = (Employee) roleService.save(headSupervisor);
reviewerProject = new Project();
reviewerProject.setProjectClass(bachelor);
reviewerProject.setTitle("Project 1");
reviewerProject.setHeadSupervisor(headSupervisor);
reviewerProject.addProjectParticipant(reviewerRole);
reviewerProject.setProjectStatus(ProjectStatus.ACTIVE);
reviewerProject = projectService.save(reviewerProject);
requesterProject = new Project();
requesterProject.setProjectClass(master);
requesterProject.setTitle("Project 2");
requesterProject.setHeadSupervisor(headSupervisor);
requesterProject.addProjectParticipant(requesterRole);
requesterProject.setProjectStatus(ProjectStatus.ACTIVE);
requesterProject = projectService.save(requesterProject);
reviewerProject = newProject(bachelor, reviewerRole, headSupervisor, ProjectStatus.ACTIVE);
requesterProject = newProject(master, requesterRole, headSupervisor, ProjectStatus.ACTIVE);
request1 = new PeerRequest();
request1.setComment("Request 1");
request1.setRequester(requesterRole);
request1.setProject(requesterProject);
request1 = peerRequestService.save(request1);
review1 = new PeerReview();
review1.setReviewer(reviewerRole);
review1.setProject(reviewerProject);
review1.setComment("Overall ok!");
review1.setPeerRequest(request1);
request1.setStatus(RequestStatus.FINISHED);
request1 = peerRequestService.save(request1);
review1.setSubmitted(true);
review1 = peerReviewService.save(review1);
request2 = new PeerRequest();
request2.setComment("Request 2");
request2.setRequester(requesterRole);
request2.setProject(requesterProject);
request2 = peerRequestService.save(request2);
review2 = new PeerReview();
review2.setReviewer(reviewerRole);
review2.setProject(reviewerProject);
review2.setComment("Overall ok!");
review2.setPeerRequest(request2);
request2.setStatus(RequestStatus.FINISHED);
request2 = peerRequestService.save(request2);
review2.setSubmitted(true);
review2 = peerReviewService.save(review2);
request3 = new PeerRequest();
request3.setComment("Request 3");
request3.setRequester(requesterRole);
request3.setProject(requesterProject);
request3 = peerRequestService.save(request3);
review3 = new PeerReview();
review3.setReviewer(reviewerRole);
review3.setProject(reviewerProject);
review3.setComment("Overall ok!");
review3.setPeerRequest(request2);
request3.setStatus(RequestStatus.TAKEN);
request3 = peerRequestService.save(request3);
review3.setSubmitted(false);
review3 = peerReviewService.save(review3);
awaitingRequest = new PeerRequest();
awaitingRequest.setComment("Awaiting request");
awaitingRequest.setRequester(requesterRole);
awaitingRequest.setProject(requesterProject);
awaitingRequest.setStatus(RequestStatus.WAITING);
awaitingRequest = peerRequestService.save(awaitingRequest);
request1 = newRequest(requesterRole, requesterProject, "Request 1", null);
request2 = newRequest(requesterRole, requesterProject, "Request 2", null);
request3 = newRequest(requesterRole, requesterProject, "Request 3", null);
request4 = newRequest(requesterRole, requesterProject, "Request 4", RequestStatus.WAITING);
review1 = newReview(reviewerRole, reviewerProject, request1, RequestStatus.FINISHED, false, true);
review2 = newReview(reviewerRole, reviewerProject, request2, RequestStatus.FINISHED, false, true);
review3 = newReview(reviewerRole, reviewerProject, request3, RequestStatus.TAKEN, false, false);
}
@Test
@ -220,7 +157,162 @@ public class TestPeerReview {
public void testFindAwaitingRequestsByProject(){
List<PeerRequest> awaitingRequests = peerRequestService.findAwaitingRequests(requesterProject);
Assert.assertEquals(1, awaitingRequests.size());
Assert.assertEquals(Arrays.asList(new PeerRequest[]{awaitingRequest}), awaitingRequests);
Assert.assertEquals(Arrays.asList(new PeerRequest[]{request4}), awaitingRequests);
}
@Test
@Transactional
@Rollback
public void testCountAllAbortedReviews(){
Long allAborted = peerReviewService.countAllAborted();
Long expected = new Long(0);
Assert.assertEquals(expected, allAborted);
review2.setAborted(true);
review2.setSubmitted(false);
review3.setAborted(true);
allAborted = peerReviewService.countAllAborted();
expected = new Long(2);
Assert.assertEquals(expected, allAborted);
}
@Test
@Transactional
@Rollback
public void testCountAllInProgressReviews(){
Long allInProgress = peerReviewService.countAllInProgress();
Long expected = new Long(1);
Assert.assertEquals(expected, allInProgress);
review3.setSubmitted(true);
allInProgress = peerReviewService.countAllInProgress();
expected = new Long(0);
Assert.assertEquals(expected, allInProgress);
}
@Test
@Transactional
@Rollback
public void testCountAllCompletedReviews(){
Long allCompleted = peerReviewService.countAllCompleted();
Long expected = new Long(2);
Assert.assertEquals(expected, allCompleted);
review3.setSubmitted(true);
allCompleted = peerReviewService.countAllCompleted();
expected = new Long(3);
Assert.assertEquals(expected, allCompleted);
}
@Test
@Transactional
@Rollback
public void testCountAllReviewsByStudent(){
Long allReviewsByStudent = peerReviewService.countAllReviewsByStudent(reviewerRole);
Long expected = new Long(3);
Assert.assertEquals(expected, allReviewsByStudent);
}
@Test
@Transactional
@Rollback
public void testFindAllWithParams(){
PeerReviewService.FilterParams params = new PeerReviewService.FilterParams();
params.setAuthor(reviewerRole);
List<PeerReview> reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2,review3}), reviewList);
review3.setReviewer(requesterRole);
reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2}), reviewList);
params.setAuthor(null);
reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2,review3}), reviewList);
params.setIncludeAborted(false);
params.setIncludeCompleted(false);
params.setIncludeInProgress(true);
reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
Assert.assertEquals(Arrays.asList(new PeerReview[]{review3}), reviewList);
review3.setAborted(true);
params.setIncludeAborted(true);
reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
Assert.assertEquals(Arrays.asList(new PeerReview[]{review3}), reviewList);
}
@Test
@Transactional
@Rollback
public void testReviewParamsDateFiltering() throws ParseException {
PeerReviewService.FilterParams params = new PeerReviewService.FilterParams();
SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date january12 = date.parse("2012-01-12");
Date february15 = date.parse("2012-02-15");
Date march21 = date.parse("2012-03-21");
Date april05 = date.parse("2012-04-05");
Date may02 = date.parse("2012-05-02");
Date march27 = date.parse("2012-03-27");
review1.setDateCreated(february15);
review2.setDateCreated(march21);
review3.setDateCreated(may02);
params.setCreatedAfter(january12);
params.setCreatedBefore(april05);
List<PeerReview> reviewList = peerReviewService.findAll(params, new PageRequest(0,10)).getContent();
Assert.assertEquals(2, reviewList.size());
Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2}), reviewList);
review3.setDateCreated(march27);
reviewList = peerReviewService.findAll(params, new PageRequest(0,10)).getContent();
Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2,review3}), reviewList);
}
//Helper methods for setting up test objects
private PeerReview newReview(final Student reviewer, final Project project, PeerRequest request, final RequestStatus status, boolean aborted, boolean submitted) {
PeerReview review = new PeerReview();
review.setReviewer(reviewer);
review.setProject(project);
review.setComment("Hi there!");
review.setPeerRequest(request);
request.setStatus(status);
request = peerRequestService.save(request);
review.setSubmitted(submitted);
review.setAborted(aborted);
return peerReviewService.save(review);
}
private PeerRequest newRequest(final Student requester, final Project project, final String comment, final RequestStatus status){
PeerRequest request = new PeerRequest();
request.setComment(comment);
request.setRequester(requester);
request.setProject(project);
if(status!=null)
request.setStatus(status);
return peerRequestService.save(request);
}
private Student newStudent(final User user) {
Student student = new Student();
student.setUser(user);
return (Student) roleService.save(student);
}
private Project newProject(final ProjectClass pc, final Student role, final Employee headSupervisor, final ProjectStatus status){
Project newProject = new Project();
newProject.setProjectClass(pc);
newProject.setTitle("Project title");
newProject.setHeadSupervisor(headSupervisor);
newProject.addProjectParticipant(role);
newProject.setProjectStatus(status);
return projectService.save(newProject);
}
}