diff --git a/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.html b/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.html index 8053f15ad1..30bf3c38dd 100644 --- a/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.html +++ b/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.html @@ -33,6 +33,7 @@ <div wicket:id="navigator" class="comment-pager last"></div> </div> <div class="last comment-form"> + <div wicket:id="feedbackPanel"></div> <form wicket:id="commentForm"> <div class="last"> <strong>Comment:</strong> diff --git a/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java b/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java index 49bc7d262f..bcd15c260c 100644 --- a/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java +++ b/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java @@ -19,6 +19,7 @@ import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextArea; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.PageableListView; +import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -70,6 +71,7 @@ public class CommentThreadPanel extends Panel { private final Set<SubscriberModel> subscriberModels; private final String title; private final Long classId; + private final FeedbackPanel feedbackPanel; public CommentThreadPanel(final String id, final Commentable keyObject, final int numberOfComments, final Set<SubscriberModel> subscriberModels, @@ -111,6 +113,10 @@ public class CommentThreadPanel extends Panel { dialog.setWidth(470); dialog.add(dialogContainer); add(dialog); + feedbackPanel = new FeedbackPanel("feedbackPanel"); + feedbackPanel.setOutputMarkupId(true); + add(feedbackPanel); + dialogContainer.setOutputMarkupId(true); editCommentForm = new EditCommentForm("editCommentForm", @@ -176,30 +182,35 @@ public class CommentThreadPanel extends Panel { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - Comment comment = (Comment) form.getDefaultModelObject(); - comment = commentDao.save(comment); - System.out.println(subscriberModels); - if (subscriberModels != null) { - for (SubscriberModel sm : subscriberModels) { - createNotification(sm.getUser(), comment.getComment(), - sm.getNotificationPriority(), sm.getAbsolutePath()); + if (comment.getComment() == null || comment.getComment().length() < 1) { + error("Comment can't be empty"); + + } else { + comment = commentDao.save(comment); + if (subscriberModels != null) { + for (SubscriberModel sm : subscriberModels) { + notificationController.notifyForComment(sm.getUser(), comment.getComment(), + sm.getNotificationPriority(), title, classId.toString(), sm.getAbsolutePath()); + } } - } - /* - * Do not, on purpose set the forms defaultModelObject to - * the now persisted object, we leave the original object so - * it can be re reused for any number of submits * - */ + /* + * Do not, on purpose set the forms defaultModelObject + * to the now persisted object, we leave the original + * object so it can be re reused for any number of + * submits * + */ - webMarkupContainer.remove(commentListView); - webMarkupContainer.remove(customPagingNavigator); - textArea.setDefaultModelObject(""); - generateCommentListView(); - webMarkupContainer.add(commentListView); - webMarkupContainer.add(customPagingNavigator); - target.addComponent(textArea); - target.addComponent(webMarkupContainer); + webMarkupContainer.remove(commentListView); + webMarkupContainer.remove(customPagingNavigator); + textArea.setDefaultModelObject(""); + generateCommentListView(); + webMarkupContainer.add(commentListView); + webMarkupContainer.add(customPagingNavigator); + target.addComponent(textArea); + target.addComponent(webMarkupContainer); + } + target.addComponent(feedbackPanel); } }; @@ -338,29 +349,4 @@ public class CommentThreadPanel extends Panel { } } - private void createNotification(final User user, final String message, - final NotificationPriority notificationPriority, final String absolutePath) { - - Properties props = null; - try { - props = PropsUtils.load("notification.properties"); - } catch (Exception e) { - e.printStackTrace(); - } - String mailSubject = props.getProperty("mailSubject"); - String conferenceNotification = props.getProperty("conferenceNotificationComment"); - String twoNewLines = props.getProperty("twoNewLines"); - - String webNotificationMessage = SciProSession.get().getUser() + conferenceNotification - + title; - - String mailMessage = webNotificationMessage + twoNewLines + message; - - NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, - mailSubject, mailMessage); - notificationController.processNotification(user, notificationMessage, absolutePath+"&"+classId - , - notificationPriority); - } - } diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java index 452700e4d1..904cfd0479 100644 --- a/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java +++ b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java @@ -92,7 +92,7 @@ public class ProjectConferencePage extends ProjectPage { subscriberModel.add(new SubscriberModel(projectModel.getObject() .getHeadSupervisor().getUser(), SupervisorConferencePage - .getAbsoluteForSupervisorConferenceURL(projectModel.getObject() + .getAbsoluteURL(projectModel.getObject() .getId()), NotificationPriority.LOW)); } @@ -100,7 +100,7 @@ public class ProjectConferencePage extends ProjectPage { .getProjectFollowers()) { subscriberModel.add(new SubscriberModel( projectFollower.getFollower().getUser(), SupervisorConferencePage - .getAbsoluteForSupervisorConferenceURL(projectModel.getObject() + .getAbsoluteURL(projectModel.getObject() .getId()), NotificationPriority.LOW)); } @@ -110,7 +110,7 @@ public class ProjectConferencePage extends ProjectPage { if (!student.getUser().equals(SciProSession.get().getUser())) subscriberModel .add(new SubscriberModel(student.getUser(), - getAbsoluteForProjectConferenceURL(projectModel.getObject() + getAbsoluteURL(projectModel.getObject() .getId()), NotificationPriority.LOW)); // Test-kod // subscriberModel.add(new @@ -162,7 +162,7 @@ public class ProjectConferencePage extends ProjectPage { .getAccessDeniedPage()); } - public static String getAbsoluteForProjectConferenceURL(Long id) { + public static String getAbsoluteURL(Long id) { PageParameters pageParameters = new PageParameters(); pageParameters.put(PROJECTID, id.toString()); return RequestUtils.toAbsolutePath(RequestCycle.get() diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java index 2c5d8c5a0a..248bcb088d 100644 --- a/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java +++ b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java @@ -95,7 +95,7 @@ public class SupervisorConferencePage extends AbstractSupervisorPage { if (!user.equals(SciProSession.get().getUser())) { subscriberModel .add(new SubscriberModel(user, - getAbsoluteForSupervisorConferenceURL(projectModel.getObject() + getAbsoluteURL(projectModel.getObject() .getId()), NotificationPriority.LOW)); } @@ -103,7 +103,7 @@ public class SupervisorConferencePage extends AbstractSupervisorPage { .getProjectFollowers()) { if (!user.equals(SciProSession.get().getUser())) { subscriberModel.add(new SubscriberModel(projectFollower.getFollower() - .getUser(), getAbsoluteForSupervisorConferenceURL(projectModel + .getUser(), getAbsoluteURL(projectModel .getObject().getId()), NotificationPriority.LOW)); } @@ -111,7 +111,7 @@ public class SupervisorConferencePage extends AbstractSupervisorPage { for (Student student : projectModel.getObject().getProjectParticipants()) { subscriberModel.add(new SubscriberModel(student.getUser(), - ProjectConferencePage.getAbsoluteForProjectConferenceURL(projectModel + ProjectConferencePage.getAbsoluteURL(projectModel .getObject().getId()), NotificationPriority.LOW)); } @@ -156,7 +156,7 @@ public class SupervisorConferencePage extends AbstractSupervisorPage { .getAccessDeniedPage()); } - public static String getAbsoluteForSupervisorConferenceURL(Long id) { + public static String getAbsoluteURL(Long id) { PageParameters pageParameters = new PageParameters(); pageParameters.add(PROJECTID, id.toString()); return RequestUtils.toAbsolutePath(RequestCycle.get() diff --git a/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.html b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.html index 5f87b48a8b..870b109771 100644 --- a/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.html +++ b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.html @@ -6,27 +6,27 @@ </head> <body> <wicket:panel> + <div class="margin rounded-border"> + <div wicket:id="feedbackPanel"></div> <form wicket:id="sendForm"> <textarea wicket:id="textArea"></textarea> <div> - <button type="submit" wicket:id="ajaxButton"> - <img src="css/blueprint/plugins/buttons/icons/tick.png" alt="" />Send - Message - </button> + <button type="submit" wicket:id="ajaxButton"> + <img src="css/blueprint/plugins/buttons/icons/tick.png" alt="" />Send + Message + </button> </div> </form> </div> - + <div wicket:id="container" class="margin clear"> <div wicket:id="boardMessageDataView" class="rounded-border"> - <span wicket:id="messageUser" class="small"> </span> - <span wicket:id="messageDate" class="small"></span> - <span><a href="#" - wicket:id="delete" class="right-corner-resource"> <img class="icon-12" - src="images/icons/delete_16x16.png" alt="Delete" title="Delete" /> - </a> - </span> + <span wicket:id="messageUser" class="small"> </span> <span + wicket:id="messageDate" class="small"></span> <span><a + href="#" wicket:id="delete" class="right-corner-resource"> <img + class="icon-12" src="images/icons/delete_16x16.png" alt="Delete" + title="Delete" /> </a> </span> <div wicket:id="messageLabel" class="margin"></div> <div> <a href="#" wicket:id="showComments"><span diff --git a/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java index 1013d3f969..c22e32565b 100644 --- a/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java +++ b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java @@ -15,6 +15,7 @@ import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextArea; import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; +import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; @@ -59,6 +60,7 @@ public class ConferencePanel extends Panel { private IModel<MessageBoard> messageBoardModel; private IModel<BoardMessage> boardMessageModel; private Set<SubscriberModel> subscriberModels; + private FeedbackPanel feedbackPanel; public ConferencePanel(String id, IModel<MessageBoard> messageBoardModel, Set<SubscriberModel> subscriberModels, IModel<BoardMessage> boardMessageModel) { @@ -75,6 +77,10 @@ public class ConferencePanel extends Panel { } private void initPanel() { + feedbackPanel = new FeedbackPanel("feedbackPanel"); + feedbackPanel.setOutputMarkupId(true); + add(feedbackPanel); + add(new SendWallMessageForm("sendForm")); webMarkupContainer = new WebMarkupContainer("container"); loadUserDataView(new BoardMessageDataProvider(messageBoardModel)); @@ -140,7 +146,7 @@ public class ConferencePanel extends Panel { subscriberModels, messageBoardModel.getObject().getTitle()); ctp.setOutputMarkupPlaceholderTag(true); webMarkupContainer.add(ctp); - + if (boardMessageModel != null && boardMessageModel.getObject().equals(bm)) { comment.setDefaultModelObject("Hide comments"); webMarkupContainer.setVisible(true); @@ -231,25 +237,30 @@ public class ConferencePanel extends Panel { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { + if (message == null || message.length() < 1) { + error("Post can't be empty"); + } else { + BoardMessage bm = new BoardMessage(); + bm.setMessage(message); + bm.setMessageBoard(messageBoardModel.getObject()); + bm.setFromUser(SciProSession.get().getUser()); + bm = boardMessageDao.save(bm); - BoardMessage bm = new BoardMessage(); - bm.setMessage(message); - bm.setMessageBoard(messageBoardModel.getObject()); - bm.setFromUser(SciProSession.get().getUser()); - bm = boardMessageDao.save(bm); - - for (SubscriberModel subscriberModel : subscriberModels) { - createNotification(subscriberModel.getUser(), message, - subscriberModel.getNotificationPriority(), - subscriberModel.getAbsolutePath()); + for (SubscriberModel subscriberModel : subscriberModels) { + notificationController.notifyConferencePost(subscriberModel.getUser(), message, messageBoardModel.getObject().getTitle(), + subscriberModel.getNotificationPriority(), + subscriberModel.getAbsolutePath()); + } + messageTextArea.setDefaultModelObject(""); + webMarkupContainer.removeAll(); + loadUserDataView(new BoardMessageDataProvider(messageBoardModel)); + webMarkupContainer.add(dataView); + webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView)); + target.addComponent(webMarkupContainer); + target.addComponent(messageTextArea); + } - messageTextArea.setDefaultModelObject(""); - webMarkupContainer.removeAll(); - loadUserDataView(new BoardMessageDataProvider(messageBoardModel)); - webMarkupContainer.add(dataView); - webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView)); - target.addComponent(webMarkupContainer); - target.addComponent(messageTextArea); + target.addComponent(feedbackPanel); } }; @@ -257,28 +268,4 @@ public class ConferencePanel extends Panel { } } - - private void createNotification(final User user, final String message, - final NotificationPriority notificationPriority, final String absolutePath) { - - Properties props = null; - try { - props = PropsUtils.load("notification.properties"); - } catch (Exception e) { - e.printStackTrace(); - } - String mailSubject = props.getProperty("mailSubject"); - String conferenceNotification = props.getProperty("conferenceNotification"); - String twoNewLines = props.getProperty("twoNewLines"); - - String webNotificationMessage = SciProSession.get().getUser() + conferenceNotification - + messageBoardModel.getObject().getTitle(); - - String mailMessage = webNotificationMessage + twoNewLines + message; - - NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, - mailSubject, mailMessage); - notificationController.processNotification(user, notificationMessage, absolutePath, - notificationPriority); - } } diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/FinalSeminarUploadController.java b/src/main/java/se/su/dsv/scipro/data/controllers/FinalSeminarUploadController.java index 89ecc8ad9e..0c03a098ff 100644 --- a/src/main/java/se/su/dsv/scipro/data/controllers/FinalSeminarUploadController.java +++ b/src/main/java/se/su/dsv/scipro/data/controllers/FinalSeminarUploadController.java @@ -24,5 +24,4 @@ public interface FinalSeminarUploadController extends IClusterable { void storeSeminarDocument(FileUpload upload, User uploader, FinalSeminar seminar) throws Exception; void storeOpposition(FileUpload upload, User uploader, FinalSeminarOpposition opposition) throws Exception; - } diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java index ba1bf5019a..f9aa382f22 100644 --- a/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java +++ b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java @@ -1,7 +1,13 @@ package se.su.dsv.scipro.data.controllers; +import se.su.dsv.scipro.data.dataobjects.FinalSeminar; +import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; +import se.su.dsv.scipro.data.dataobjects.Project; +import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.enums.NotificationPriority; +import se.su.dsv.scipro.peer.data.dataobjects.PeerRequest; +import se.su.dsv.scipro.peer.data.dataobjects.PeerReview; /** * @@ -10,5 +16,38 @@ import se.su.dsv.scipro.data.enums.NotificationPriority; */ public interface NotificationController { - public void processNotification(User usertoNotify, NotificationMessage notificationMessage, String absoluteUrl, NotificationPriority notificationPriority); + public void notifyPrivateMessage(final User user, final String message, + final String url); + + public void notifyConferencePost(final User user, final String message, + final String messageboardTitle, final NotificationPriority notificationPriority, + final String absolutePath); + + public void notifyForComment(final User user, final String message, + final NotificationPriority notificationPriority, final String title, + final String classId, final String absolutePath); + + public void notifyReplyPrivateMessage(final User user, final String message, + final String url); + + public void notifyFinalSeminarEdited(final User user, + final FinalSeminar finalSeminar, final NotificationPriority notificationPriority, + final String absolutePath); + + public void notifyCreateFinalSeminar(final User user, final FinalSeminar finalSemniar, + final NotificationPriority notificationPriority, final String absolutePath, final boolean opponent); + + public void notifyThesisUploaded(final User user, + final FinalSeminar finalSeminar, final NotificationPriority notificationPriority, + final String absolutePath); + + public void notifyOppositionUploaded(final User user, + final FinalSeminarOpposition opposition, + final NotificationPriority notificationPriority, final String absolutePath); + + public void notifyOfReviewRating(PeerReview review); + + public void notifyCompletionOfReview(PeerReview review); + + public void notifyAcceptOfReview(PeerRequest request, Student student, Project project); } diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/impl/FinalSeminarUploadControllerImpl.java b/src/main/java/se/su/dsv/scipro/data/controllers/impl/FinalSeminarUploadControllerImpl.java index b0622c61a8..ab1d88b066 100644 --- a/src/main/java/se/su/dsv/scipro/data/controllers/impl/FinalSeminarUploadControllerImpl.java +++ b/src/main/java/se/su/dsv/scipro/data/controllers/impl/FinalSeminarUploadControllerImpl.java @@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController; +import se.su.dsv.scipro.data.controllers.NotificationController; import se.su.dsv.scipro.data.dao.interfaces.CheckPlagiarismEventDao; import se.su.dsv.scipro.data.dao.interfaces.FileDescriptionDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; @@ -22,12 +23,18 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dataobjects.CheckPlagiarismEvent; import se.su.dsv.scipro.data.dataobjects.FileDescription; import se.su.dsv.scipro.data.dataobjects.FinalSeminar; +import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation; import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; import se.su.dsv.scipro.data.dataobjects.Project; +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.NotificationPriority; +import se.su.dsv.scipro.project.pages.ProjectOppositionPage; +import se.su.dsv.scipro.project.pages.ProjectStartPage; import se.su.dsv.scipro.repository.FileRepository; import se.su.dsv.scipro.repository.util.FileStorageException; +import se.su.dsv.scipro.supervisor.pages.SupervisorProjectsFinalSeminarPage; @Controller("seminarUploadController") public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadController { @@ -57,6 +64,9 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr @Autowired private CheckPlagiarismEventDao checkPlagiarismEventDao; + @Autowired + private NotificationController notificationController; + private FileDescription store(FileUpload upload, String storeToPath) throws IOException { fileRepository.storeFile(upload, storeToPath); List<FileDescription> fds = fileRepository.searchFiles(storeToPath); @@ -148,6 +158,27 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr checkPlagiarismEventDao.save(checkPlagiarismEvent); } + for (FinalSeminarActiveParticipation fa : seminar.getActiveParticipations()) { + + notificationController.notifyThesisUploaded(fa.getUser(), seminar, + NotificationPriority.HIGH, ProjectOppositionPage.getAbsoluteURL()); + } + + for (FinalSeminarOpposition fo : seminar.getOppositions()) { + notificationController.notifyThesisUploaded(fo.getOpponent().getUser(), seminar, + NotificationPriority.HIGH, ProjectOppositionPage.getAbsoluteURL()); + } + + for (ProjectFollower pf : seminar.getProject().getProjectFollowers()) { + notificationController.notifyThesisUploaded(pf.getFollower().getUser(), seminar, + NotificationPriority.HIGH, SupervisorProjectsFinalSeminarPage.getAbsoluteURL()); + } + if (seminar.getProject().getHeadSupervisor() != null) { + notificationController.notifyThesisUploaded(seminar.getProject().getHeadSupervisor() + .getUser(), seminar, NotificationPriority.HIGH, + SupervisorProjectsFinalSeminarPage.getAbsoluteURL()); + } + } catch (IOException e) { Logger.getRootLogger().log(Level.ERROR, "Error while storing seminardocument: " + e.getMessage()); @@ -178,6 +209,20 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr opposition.setOpponentReport(fd); opposition.setDateReported(new Date()); opposition = finalSeminarOppositionDao.save(opposition); + + for (Student student : opposition.getFinalSeminar().getProject().getProjectParticipants()) { + notificationController.notifyOppositionUploaded(student.getUser(), opposition, + NotificationPriority.HIGH, ProjectStartPage.getAbsoluteURL()); + } + for (ProjectFollower pf : opposition.getFinalSeminar().getProject().getProjectFollowers()) { + notificationController.notifyOppositionUploaded(pf.getFollower().getUser(), opposition, + NotificationPriority.HIGH, SupervisorProjectsFinalSeminarPage.getAbsoluteURL()); + } + if (opposition.getFinalSeminar().getProject().getHeadSupervisor() != null) { + notificationController.notifyOppositionUploaded(opposition.getFinalSeminar().getProject().getHeadSupervisor() + .getUser(), opposition, NotificationPriority.HIGH, + SupervisorProjectsFinalSeminarPage.getAbsoluteURL()); + } } catch (IOException e) { Logger.getRootLogger().log(Level.ERROR, "Error while storing opposition report: " + e.getMessage()); @@ -205,4 +250,10 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr + String.valueOf(o.getId()) + "/"; } + + + + + + } diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java b/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java index 3159af89f5..fb11252c3f 100644 --- a/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java +++ b/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java @@ -1,22 +1,37 @@ package se.su.dsv.scipro.data.controllers.impl; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Properties; +import org.apache.wicket.PageParameters; +import org.apache.wicket.RequestCycle; +import org.apache.wicket.protocol.http.RequestUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.data.controllers.NotificationController; import se.su.dsv.scipro.data.controllers.NotificationMessage; import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao; import se.su.dsv.scipro.data.dao.interfaces.MailEventDao; import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao; +import se.su.dsv.scipro.data.dataobjects.FinalSeminar; +import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings; import se.su.dsv.scipro.data.dataobjects.MailEvent; +import se.su.dsv.scipro.data.dataobjects.Project; +import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; import se.su.dsv.scipro.data.dataobjects.WebNotification; import se.su.dsv.scipro.data.enums.NotificationPriority; +import se.su.dsv.scipro.peer.data.dataobjects.PeerRequest; +import se.su.dsv.scipro.peer.data.dataobjects.PeerReview; +import se.su.dsv.scipro.peer.pages.ProjectPeerReviewPage; +import se.su.dsv.scipro.peer.pages.ProjectPeerStatsPage; +import se.su.dsv.scipro.peer.pages.SupervisorPeerReviewPage; import se.su.dsv.scipro.util.PropsUtils; /** @@ -43,8 +58,7 @@ public class NotificationControllerImpl implements NotificationController { @Autowired protected MailEventDao mailEventDao; - @Override - public void processNotification(User usertoNotify, NotificationMessage notificationMessage, + private void processNotification(User usertoNotify, NotificationMessage notificationMessage, String absoluteUrl, NotificationPriority notificationPriorityForEvent) { GeneralSystemSettings generalSystemSettings = generalSystemSettingsDao .getGeneralSystemSettingsInstance(); @@ -138,4 +152,358 @@ public class NotificationControllerImpl implements NotificationController { return message; } + + @Override + public void notifyPrivateMessage(final User user, final String message, + final String url) { + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String privateMessageNotification = props.getProperty("privateMessageNotification"); + String twoNewLines = props.getProperty("twoNewLines"); + + String webNotificationMessage = SciProSession.get().getUser() + privateMessageNotification; + + String mailMessage = webNotificationMessage + twoNewLines + message; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + processNotification(user, notificationMessage, url, NotificationPriority.MEDIUM); + + } + + @Override + public void notifyConferencePost(final User user, final String message, + final String messageboardTitle, final NotificationPriority notificationPriority, + final String absolutePath) { + + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String conferenceNotification = props.getProperty("conferenceNotification"); + String twoNewLines = props.getProperty("twoNewLines"); + String quote = props.getProperty("quote"); + + String webNotificationMessage = SciProSession.get().getUser() + conferenceNotification + + quote + messageboardTitle + quote; + + String mailMessage = webNotificationMessage + twoNewLines + message; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + processNotification(user, notificationMessage, absolutePath, notificationPriority); + } + + @Override + public void notifyForComment(final User user, final String message, + final NotificationPriority notificationPriority, final String title, + final String classId, final String absolutePath) { + + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String conferenceNotification = props.getProperty("conferenceNotificationComment"); + String twoNewLines = props.getProperty("twoNewLines"); + + String webNotificationMessage = SciProSession.get().getUser() + conferenceNotification + + title; + + String mailMessage = webNotificationMessage + twoNewLines + message; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + processNotification(user, notificationMessage, absolutePath + "&" + classId, + notificationPriority); + } + + @Override + public void notifyReplyPrivateMessage(final User user, final String message, + final String absolutePath) { + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String privateMessageNotification = props.getProperty("privateMessageReplyNotification"); + String twoNewLines = props.getProperty("twoNewLines"); + + String webNotificationMessage = SciProSession.get().getUser() + privateMessageNotification; + + String mailMessage = webNotificationMessage + twoNewLines + message; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + processNotification(user, notificationMessage, absolutePath, NotificationPriority.MEDIUM); + } + + @Override + public void notifyFinalSeminarEdited(final User user, + final FinalSeminar finalSeminar, final NotificationPriority notificationPriority, + final String absolutePath) { + + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String finalSeminarReportEdited = props.getProperty("finalSeminarOppositionReportEdited"); + String finalSeminarOppositionReportBeenEdited = props + .getProperty("finalSeminarOppositionReportBeenEdited"); + String quote = props.getProperty("quote"); + + String webNotificationMessage = finalSeminarReportEdited + quote + + finalSeminar.getProject().getTitle() + quote + + finalSeminarOppositionReportBeenEdited; + String mailMessage = webNotificationMessage; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + processNotification(user, notificationMessage, absolutePath, notificationPriority); + } + + @Override + public void notifyCreateFinalSeminar(final User user, + final FinalSeminar finalSemniar, final NotificationPriority notificationPriority, + final String absolutePath, final boolean opponent) { + + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + + String created = props.getProperty("finalSeminarCreated"); + String mailSubject = props.getProperty("mailSubject"); + String project = ""; + if (!opponent) { + project = props.getProperty("finalSeminarProject"); + } else { + project = props.getProperty("finalSeminarProjectOpponnent"); + } + + String comma = props.getProperty("comma"); + String space = props.getProperty("space"); + String quote = props.getProperty("quote"); + + DateFormat dfFrom = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + DateFormat dfTo = new SimpleDateFormat("-HH:mm"); + String webNotificationMessage = created + quote + finalSemniar.getProject().getTitle() + + quote + project + finalSemniar.getRoom() + comma + space + + dfFrom.format(finalSemniar.getStartDate()) + + dfTo.format(finalSemniar.getEndDate()); + + String mailMessage = webNotificationMessage; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + processNotification(user, notificationMessage, absolutePath, notificationPriority); + } + + @Override + public void notifyThesisUploaded(final User user, + final FinalSeminar finalSeminar, final NotificationPriority notificationPriority, + final String absolutePath) { + + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String finalSeminarReportUploaded = props.getProperty("finalSeminarReportUploaded"); + String finalSeminarReportBeenUploaded = props.getProperty("finalSeminarReportBeenUploaded"); + String quote = props.getProperty("quote"); + + String webNotificationMessage = finalSeminarReportUploaded + quote + + finalSeminar.getProject().getTitle() + quote + finalSeminarReportBeenUploaded; + String mailMessage = webNotificationMessage; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + processNotification(user, notificationMessage, absolutePath, notificationPriority); + } + + @Override + public void notifyOppositionUploaded(final User user, + final FinalSeminarOpposition opposition, + final NotificationPriority notificationPriority, final String absolutePath) { + + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String finalSeminarOppositionReportUploaded = props + .getProperty("finalSeminarOppositionReportUploaded"); + String finalSeminarOppositionReportBeenUploaded = props + .getProperty("finalSeminarOppositionReportBeenUploaded"); + String dot = props.getProperty("dot"); + String quote = props.getProperty("quote"); + String space = props.getProperty("space"); + + String webNotificationMessage = finalSeminarOppositionReportUploaded + quote + + opposition.getFinalSeminar().getProject().getTitle() + quote + + finalSeminarOppositionReportBeenUploaded + + opposition.getOpponent().getUser().getFirstName() + space + + opposition.getOpponent().getUser().getLastName() + dot; + String mailMessage = webNotificationMessage; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + processNotification(user, notificationMessage, absolutePath, notificationPriority); + } + + public void notifyAcceptOfReview(PeerRequest request, Student student, Project project) { + try { + Properties props = null; + + props = PropsUtils.load("notification.properties"); + + String mailSubject = props.getProperty("acceptPeerReviewSubject"); + String requestAccepted = props.getProperty("requestAccepted"); + String heShe = props.getProperty("heShe"); + String complete = props.getProperty("complete"); + + User requestingUser = request.getRequester().getUser(); + + String messageBody = requestAccepted + + student.getUser().toString() + + heShe + + project.getProjectClass().getProjectClassSettings() + .getNumDaysToSubmitPeerReview() + complete; + + String webNotificationMessage = requestAccepted + student.getUser().toString(); + + NotificationMessage notificationMessage = new NotificationMessage( + webNotificationMessage, mailSubject, messageBody); + + PageParameters pp = new PageParameters(); + + String peerStatsUrl = RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(ProjectPeerStatsPage.class, pp).toString()); + + processNotification(requestingUser, notificationMessage, peerStatsUrl, + NotificationPriority.MEDIUM); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + public void notifyCompletionOfReview(PeerReview review) { + try { + + Properties props = null; + props = PropsUtils.load("notification.properties"); + String mailSubject = props.getProperty("completedReviewSubject"); + String requestReviewed = props.getProperty("requestReviewed"); + String supervisorMessageBody = props.getProperty("supervisorMessageBody"); + String supervisorMessageBody2 = props.getProperty("supervisorMessageBody2"); + String supervisorMessageBody3 = props.getProperty("supervisorMessageBody3"); + String commaWithLinebreak = props.getProperty("commaWithLinebreak"); + String inProject = props.getProperty("inProject"); + String hasPerformed = props.getProperty("hasPerformed"); + PeerRequest peerRequest = review.getPeerRequest(); + User requestingUser = peerRequest.getRequester().getUser(); + + PageParameters pp = new PageParameters(); + pp.add(PeerReview.PP_PEER_REVIEW_ID, review.getId().toString()); + + String reviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(ProjectPeerReviewPage.class, pp).toString()); + String supervisorReviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(SupervisorPeerReviewPage.class, pp).toString()); + + // Message for student when his/her review request is completed. + String messageBody = requestReviewed; + + NotificationMessage notificationMessage = new NotificationMessage(messageBody, + mailSubject, messageBody); + + processNotification(requestingUser, notificationMessage, reviewUrl, + NotificationPriority.MEDIUM); + + // Message for supervisor of the project with a completed review. + messageBody = supervisorMessageBody + peerRequest.getProject().getTitle() + + supervisorMessageBody2; + User requestSupervisor = peerRequest.getProject().getHeadSupervisor().getUser(); + + NotificationMessage notificationMessageSupervisorOfProject = new NotificationMessage( + messageBody, mailSubject, messageBody); + + processNotification(requestSupervisor, notificationMessageSupervisorOfProject, + supervisorReviewUrl, NotificationPriority.MEDIUM); + + // Message for supervisor of the reviewer that have made a review + // for another project. + + String webNotificationMessage = review.getReviewer().getUser().toString() + inProject + + review.getProject().getTitle() + hasPerformed; + + messageBody = supervisorMessageBody + review.getProject().getTitle() + + commaWithLinebreak + review.getReviewer().getUser().toString() + + supervisorMessageBody3; + + User reviewSupervisor = review.getProject().getHeadSupervisor().getUser(); + NotificationMessage notificationMessageSupervisorOfReviewer = new NotificationMessage( + webNotificationMessage, mailSubject, messageBody); + + processNotification(reviewSupervisor, notificationMessageSupervisorOfReviewer, + supervisorReviewUrl, NotificationPriority.MEDIUM); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * TODO Rewrite + * + * @param review + */ + public void notifyOfReviewRating(PeerReview review) { + try { + Properties props = null; + props = PropsUtils.load("notification.properties"); + String mailSubject = props.getProperty("reviewRatedSubject"); + String reviewRatedBody = props.getProperty("reviewRatedBody"); + User reviewingUser = review.getReviewer().getUser(); + + PageParameters pp = new PageParameters(); + pp.add(PeerReview.PP_PEER_REVIEW_ID, review.getId().toString()); + String projectReviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(ProjectPeerReviewPage.class, pp).toString()); + + String messageBody = reviewRatedBody; + + NotificationMessage notificationMessage = new NotificationMessage(messageBody, + mailSubject, messageBody); + + processNotification(reviewingUser, notificationMessage, projectReviewUrl, + NotificationPriority.MEDIUM); + + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java index b70fb0e94d..bc065d25cc 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java @@ -8,8 +8,6 @@ import javax.persistence.Basic; import javax.persistence.Cacheable; import javax.persistence.Column; import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; @@ -17,8 +15,6 @@ import javax.persistence.JoinTable; import javax.persistence.Lob; import javax.persistence.ManyToMany; import javax.persistence.Table; - -import se.su.dsv.scipro.data.enums.NotificationEventType; /** * * @author Martin Peters - mpeters@dsv.su.se diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java index 436de04478..e9113f0475 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java @@ -35,7 +35,6 @@ public class PrivateMessage extends LazyDeletableDomainObject{ @Id @GeneratedValue private Long id; - //TODO Fix column size and validate this in any page that uses it @Lob private String subject; diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java index fcc8ca7cef..9ea6d152c6 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java @@ -3,6 +3,7 @@ */ package se.su.dsv.scipro.data.dataobjects; +import javax.persistence.Basic; import javax.persistence.Cacheable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -32,14 +33,17 @@ public class WebNotification extends DomainObject{ private Long id; @Lob + @Basic(optional=false) private String infoText; @Lob + @Basic(optional=false) private String url; @ManyToOne(optional=false) private User user; + @Basic(optional=false) private boolean readByUser = false; @Override diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonNewMessagePage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonNewMessagePage.java index 06f5f433a9..74ca371e4f 100644 --- a/src/main/java/se/su/dsv/scipro/json/pages/JsonNewMessagePage.java +++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonNewMessagePage.java @@ -6,6 +6,7 @@ import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.spring.injection.annot.SpringBean; +import se.su.dsv.scipro.data.controllers.NotificationController; import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; @@ -16,6 +17,7 @@ import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; import se.su.dsv.scipro.jsonobjects.JsonPrivateMessage; +import se.su.dsv.scipro.message.pages.PrivateMessagesPage; import se.su.dsv.scipro.util.PushApple; import com.google.gson.Gson; @@ -38,12 +40,15 @@ public class JsonNewMessagePage extends WebPage { @SpringBean UserSettingsDao userSettingsDao; + @SpringBean + NotificationController notificationController; + public JsonNewMessagePage(final PageParameters pp) { final Gson gson = new Gson(); final JsonObject jsonOutput = new JsonObject(); String loginString = pp.getString("json"); - JsonPrivateMessage jsonPrivateMessage = gson.fromJson(loginString, - JsonPrivateMessage.class); + JsonPrivateMessage jsonPrivateMessage = gson + .fromJson(loginString, JsonPrivateMessage.class); long userId = jsonPrivateMessage.userid; String apikey = jsonPrivateMessage.apikey; User user = userDao.load(userId); @@ -53,8 +58,7 @@ public class JsonNewMessagePage extends WebPage { userSettings = new UserSettings(user); userSettings = userSettingsDao.save(userSettings); } - if (userSettings.getApiKey() != null - && userSettings.getApiKey().equals(apikey)) { + if (userSettings.getApiKey() != null && userSettings.getApiKey().equals(apikey)) { PrivateMessage pm = new PrivateMessage(); pm.setFromUser(user); pm.setMessage(jsonPrivateMessage.message); @@ -66,6 +70,9 @@ public class JsonNewMessagePage extends WebPage { rec.setToUser(selectedUser); rec.setPrivateMessage(pm); rec = recipientDao.save(rec); + notificationController.notifyPrivateMessage(selectedUser, + jsonPrivateMessage.subject + "\n\n" + jsonPrivateMessage.message, + PrivateMessagesPage.getAbsoluteURL()); } jsonOutput.addProperty("apikey", "success"); } else { @@ -79,8 +86,7 @@ public class JsonNewMessagePage extends WebPage { public void respond(RequestCycle requestCycle) { // Add JSON-encoded string to the response. - requestCycle.getResponse().setContentType( - "application/json; charset=UTF-8"); + requestCycle.getResponse().setContentType("application/json; charset=UTF-8"); requestCycle.getResponse().setCharacterEncoding("UTF-8"); requestCycle.getResponse().write(gson.toJson(jsonOutput)); @@ -91,12 +97,10 @@ public class JsonNewMessagePage extends WebPage { User selectedUser = userDao.load(id); if (userSettingsDao.getUserSettings(selectedUser) != null) { - PushApple - .sendPushMessage( - userSettingsDao.getUserSettings(selectedUser).getiPhoneId(), - recipientDao - .getNumberOfUnreadMessagesForUser(selectedUser), - "New message received"); + PushApple.sendPushMessage(userSettingsDao.getUserSettings(selectedUser) + .getiPhoneId(), + recipientDao.getNumberOfUnreadMessagesForUser(selectedUser), + "New message received"); } } diff --git a/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java b/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java index 0276bbfce9..6d5e54c45d 100644 --- a/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java +++ b/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java @@ -74,39 +74,10 @@ public class PrivateMessageModel implements IClusterable { rec.setToUser(selectedUser); rec.setPrivateMessage(pm); rec = recipientDao.save(rec); + notificationController.notifyPrivateMessage(selectedUser, subject +"\n\n" + textMessage, PrivateMessagesPage.getAbsoluteURL()); } - for(User user: users){ - createNotification(user, subject +"\n\n" + textMessage); - } } } - private void createNotification(final User user,final String message){ - Properties props = null; - try { - props = PropsUtils.load("notification.properties"); - } catch (Exception e) { - e.printStackTrace(); - } - String mailSubject = props.getProperty("mailSubject"); - String privateMessageNotification = props.getProperty("privateMessageNotification"); - String twoNewLines = props.getProperty("twoNewLines"); - - String webNotificationMessage = SciProSession.get() - .getUser() - + privateMessageNotification; - - String mailMessage = webNotificationMessage + twoNewLines + message; - - NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, mailSubject, mailMessage); - notificationController.processNotification(user, notificationMessage, - getAbsoluteForPrivateMessageURL(), NotificationPriority.MEDIUM); - - } - - private String getAbsoluteForPrivateMessageURL() { - PageParameters pageParameters = new PageParameters(); - return RequestUtils.toAbsolutePath(RequestCycle.get().urlFor(PrivateMessagesPage.class, pageParameters).toString()); - } } \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/message/models/ReplyMessageModel.java b/src/main/java/se/su/dsv/scipro/message/models/ReplyMessageModel.java index f40d7eb96c..6b8e13e712 100644 --- a/src/main/java/se/su/dsv/scipro/message/models/ReplyMessageModel.java +++ b/src/main/java/se/su/dsv/scipro/message/models/ReplyMessageModel.java @@ -1,17 +1,23 @@ package se.su.dsv.scipro.message.models; import java.util.List; +import java.util.Properties; import org.apache.wicket.IClusterable; import org.apache.wicket.injection.web.InjectorHolder; import org.apache.wicket.spring.injection.annot.SpringBean; import se.su.dsv.scipro.SciProSession; +import se.su.dsv.scipro.data.controllers.NotificationController; +import se.su.dsv.scipro.data.controllers.NotificationMessage; import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; import se.su.dsv.scipro.data.dataobjects.PrivateMessage; import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.enums.NotificationPriority; +import se.su.dsv.scipro.message.pages.PrivateMessagesPage; +import se.su.dsv.scipro.util.PropsUtils; public class ReplyMessageModel implements IClusterable { @@ -21,6 +27,8 @@ public class ReplyMessageModel implements IClusterable { private PrivateMessageDao pmDao; @SpringBean private RecipientDao recipientDao; + @SpringBean + private NotificationController notificationController; private PrivateMessage originalMessage; @@ -81,5 +89,10 @@ public class ReplyMessageModel implements IClusterable { r.setToUser(originalMessage.getFromUser()); r.setPrivateMessage(pm); r = recipientDao.save(r); + notificationController.notifyReplyPrivateMessage(originalMessage.getFromUser(), getReplySubject() +"\n\n" + getReplyText(), PrivateMessagesPage.getAbsoluteURL()); + } + + + } diff --git a/src/main/java/se/su/dsv/scipro/message/pages/PrivateMessagesPage.java b/src/main/java/se/su/dsv/scipro/message/pages/PrivateMessagesPage.java index bfb8a147fe..ccefa548ac 100644 --- a/src/main/java/se/su/dsv/scipro/message/pages/PrivateMessagesPage.java +++ b/src/main/java/se/su/dsv/scipro/message/pages/PrivateMessagesPage.java @@ -3,6 +3,7 @@ package se.su.dsv.scipro.message.pages; import java.util.Iterator; import org.apache.wicket.PageParameters; +import org.apache.wicket.RequestCycle; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxButton; @@ -14,6 +15,7 @@ import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.protocol.http.RequestUtils; import org.apache.wicket.spring.injection.annot.SpringBean; import org.odlabs.wiquery.ui.dialog.Dialog; import org.odlabs.wiquery.ui.tabs.Tabs; @@ -192,5 +194,11 @@ public class PrivateMessagesPage extends MenuPage { } } + + public static String getAbsoluteURL() { + PageParameters pageParameters = new PageParameters(); + return RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(PrivateMessagesPage.class, pageParameters).toString()); + } } diff --git a/src/main/java/se/su/dsv/scipro/message/panels/PrivateMessagesPanel.java b/src/main/java/se/su/dsv/scipro/message/panels/PrivateMessagesPanel.java index 7e81c88fab..03ce02c093 100644 --- a/src/main/java/se/su/dsv/scipro/message/panels/PrivateMessagesPanel.java +++ b/src/main/java/se/su/dsv/scipro/message/panels/PrivateMessagesPanel.java @@ -95,18 +95,16 @@ public class PrivateMessagesPanel extends Panel { PageableListView<Recipient> lv = new PageableListView<Recipient>("message-list-item", new PropertyModel<List<Recipient>>(messageListModel, "privateMessages"), PAGE_LIMIT) { private static final long serialVersionUID = 7851212974239684966L; - protected Recipient rec; - protected PrivateMessage pm; @Override protected void populateItem(final ListItem<Recipient> item) { - this.rec = item.getModelObject(); - this.pm = rec.getPrivateMessage(); + final Recipient rec = item.getModelObject(); + final PrivateMessage pm = rec.getPrivateMessage(); item.add(new Label("dateField", dateFormat.format(pm.getDateCreated()))); item.add(new Label("fromField", pm.getFromUser().getFirstName() + " " + pm.getFromUser().getLastName())); item.add(new Label("subjectField", pm.getSubject())); - if (this.rec.getDateRead() == null) + if (rec.getDateRead() == null) item.add(new SimpleAttributeModifier("class", "unread-message-table-row")); item.add(new AjaxLink<String>("readLink") { @@ -114,13 +112,12 @@ public class PrivateMessagesPanel extends Panel { @Override public void onClick(AjaxRequestTarget target) { - pm = pmDao.reLoad(pm); - currentMessage = pm; + currentMessage = pmDao.reLoad(pm); - rec = recipientDao.reLoad(item.getModelObject()); - if (rec.getDateRead() == null) { - rec.setDateRead(GregorianCalendar.getInstance().getTime()); - recipientDao.save(rec); + Recipient rec2 = recipientDao.reLoad(item.getModelObject()); + if (rec2.getDateRead() == null) { + rec2.setDateRead(GregorianCalendar.getInstance().getTime()); + recipientDao.save(rec2); } messageContainer = new WebMarkupContainer("messageContainer"); diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java index bb83c178f1..a5f7e992a6 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java @@ -26,12 +26,14 @@ import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.odlabs.wiquery.ui.datepicker.DatePicker; +import se.su.dsv.scipro.admin.pages.AdminFinalSeminarPage; import se.su.dsv.scipro.components.autocomplete.AutoCompletionChoicesProvider; import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteObjectConverter; import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteRenderer; import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteBuilder; import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteField; import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController; +import se.su.dsv.scipro.data.controllers.NotificationController; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao; @@ -41,10 +43,14 @@ import se.su.dsv.scipro.data.dataobjects.FinalSeminar; import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation; import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; import se.su.dsv.scipro.data.dataobjects.Project; +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.FinalSeminarLanguages; +import se.su.dsv.scipro.data.enums.NotificationPriority; import se.su.dsv.scipro.opponent.models.OpponentModel; +import se.su.dsv.scipro.project.pages.ProjectOppositionPage; +import se.su.dsv.scipro.project.pages.ProjectStartPage; import se.su.dsv.scipro.supervisor.pages.SupervisorProjectsFinalSeminarPage; /** @@ -71,6 +77,9 @@ public class EditFinalSeminarFormPanel extends Panel { @SpringBean private FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao; + @SpringBean + private NotificationController notificationController; + private FeedbackPanel feedbackPanel; private FinalSeminar editSeminar; private DatePicker<Date> startDateField; @@ -81,16 +90,14 @@ public class EditFinalSeminarFormPanel extends Panel { private TextField<String> projectLabel; private DropDownChoice<FinalSeminarLanguages> presentationLanguage; private DropDownChoice<FinalSeminarLanguages> reportLanguage; + private boolean admin; - - - - - public EditFinalSeminarFormPanel(final String id, final FinalSeminar seminar) { + public EditFinalSeminarFormPanel(final String id, final FinalSeminar seminar, + final boolean admin) { super(id); - + this.admin = admin; add(new EditSeminarForm("editSeminarForm")); - + FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar); editSeminar = seminar2; startDateField.setDefaultModelObject(seminar2.getStartDate()); @@ -159,7 +166,6 @@ public class EditFinalSeminarFormPanel extends Panel { super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel())); add(feedbackPanel = new FeedbackPanel("feedbackPanel")); feedbackPanel.setOutputMarkupId(true); - add(projectLabel = new TextField<String>("project")); projectLabel.setEnabled(false); @@ -231,7 +237,6 @@ public class EditFinalSeminarFormPanel extends Panel { @Override public Iterator<FinalSeminarActiveParticipation> getChoices(String input) { - // TODO Auto-generated method stub List<FinalSeminarActiveParticipation> active = new ArrayList<FinalSeminarActiveParticipation>(); for (User user : userDao.findUserQuery(input, 10)) { FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation(); @@ -381,8 +386,48 @@ public class EditFinalSeminarFormPanel extends Panel { } } + editSeminar = finalSeminarDao.reLoad(editSeminar); - setResponsePage(SupervisorProjectsFinalSeminarPage.class); + for (ProjectFollower pf : editSeminar.getProject().getProjectFollowers()) { + notificationController.notifyFinalSeminarEdited(pf + .getFollower().getUser(), editSeminar, + NotificationPriority.MEDIUM, SupervisorProjectsFinalSeminarPage + .getAbsoluteURL()); + + } + for (Student student : editSeminar.getProject().getProjectParticipants()) { + notificationController.notifyFinalSeminarEdited(student + .getUser(), editSeminar, NotificationPriority.HIGH, + ProjectStartPage.getAbsoluteURL()); + + } + + //This may not work dependent on matched by in data object hasnt updated + for (FinalSeminarActiveParticipation pf : editSeminar + .getActiveParticipations()) { + notificationController.notifyFinalSeminarEdited(pf + .getUser(), editSeminar, NotificationPriority.MEDIUM, + ProjectOppositionPage.getAbsoluteURL()); + } + + //This may not work dependent on matched by in data object hasnt updated + for (FinalSeminarOpposition pf : editSeminar.getOppositions()) { + notificationController.notifyFinalSeminarEdited(pf + .getOpponent().getUser(), editSeminar, + NotificationPriority.MEDIUM, ProjectOppositionPage.getAbsoluteURL()); + } + + if (admin) { + if (editSeminar.getProject().getHeadSupervisor() != null) { + notificationController.notifyFinalSeminarEdited( + editSeminar.getProject().getHeadSupervisor().getUser(), + editSeminar, NotificationPriority.HIGH, + SupervisorProjectsFinalSeminarPage.getAbsoluteURL()); + } + setResponsePage(AdminFinalSeminarPage.class); + } else { + setResponsePage(SupervisorProjectsFinalSeminarPage.class); + } } else if (!notSameProject && error) { error("Opponent/Active participant is an author in the final seminar"); error("Must select a Project for the Opponent/Active participant"); @@ -401,6 +446,5 @@ public class EditFinalSeminarFormPanel extends Panel { } } - } diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java index 0fd5668934..2132c6d34b 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java @@ -249,7 +249,7 @@ public class OpponentListViewPanel extends Panel { public EditSeminarForm(String name) { super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel())); - editSeminarDialog.setTitle("Edit Seminar"); + editSeminarDialog.setTitle("Edit Final Seminar"); add(new EmptyPanel("editSeminarDetails")); } } @@ -272,7 +272,7 @@ public class OpponentListViewPanel extends Panel { protected void onSubmit(AjaxRequestTarget target, Form<?> form) { FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar); editSeminarForm.removeAll(); - editSeminarForm.add(new EditFinalSeminarFormPanel("editSeminarDetails", seminar2)); + editSeminarForm.add(new EditFinalSeminarFormPanel("editSeminarDetails", seminar2, true)); target.addComponent(editSeminarForm); editSeminarDialog.open(target); } diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.html b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.html index 9ef1d8e49a..ff90708205 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.html +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.html @@ -2,7 +2,7 @@ <html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> <body> <wicket:panel> -<p><a href="#" wicket:id="addSeminar">Create Seminar</a></p> +<p><a href="#" wicket:id="addSeminar">Create Final Seminar</a></p> <div wicket:id="dialog"> <div wicket:id="dialogContainer"> <form wicket:id="addSeminarForm"> diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java index c2a3b5d437..b7189d44f9 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java @@ -34,6 +34,7 @@ import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteObjectCon import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteRenderer; import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteBuilder; import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteField; +import se.su.dsv.scipro.data.controllers.NotificationController; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao; @@ -45,10 +46,14 @@ import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation; import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; 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.FinalSeminarLanguages; +import se.su.dsv.scipro.data.enums.NotificationPriority; import se.su.dsv.scipro.opponent.models.OpponentModel; +import se.su.dsv.scipro.project.pages.ProjectOppositionPage; +import se.su.dsv.scipro.project.pages.ProjectStartPage; import se.su.dsv.scipro.security.auth.MetaDataActionStrategy; import se.su.dsv.scipro.security.auth.roles.Roles; import se.su.dsv.scipro.supervisor.pages.SupervisorProjectsFinalSeminarPage; @@ -80,6 +85,9 @@ public class OpponentPanel extends Panel { @SpringBean private FinalSeminarOppositionDao finalSeminarOppositionDao; + @SpringBean + NotificationController notificationController; + private Project project; public OpponentPanel(String id, Project project) { @@ -96,13 +104,12 @@ public class OpponentPanel extends Panel { addSeminarDialogContainer.add(new AddSeminarForm("addSeminarForm")); AjaxLink<String> addSeminar; - add(addSeminar = new AjaxLink<String>("addSeminar", new Model<String>( - "Create Seminar")) { + add(addSeminar = new AjaxLink<String>("addSeminar", new Model<String>("Create Seminar")) { /** * */ - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { @@ -121,15 +128,14 @@ public class OpponentPanel extends Panel { private static final long serialVersionUID = 1L; public AddSeminarForm(String name) { - super(name, new CompoundPropertyModel<OpponentModel>( - new OpponentModel())); - final WebMarkupContainer feedbackContainer = new WebMarkupContainer( - "feedbackContainer"); + super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel())); + final WebMarkupContainer feedbackContainer = new WebMarkupContainer("feedbackContainer"); project = projectDao.reLoad(project); feedbackContainer.setOutputMarkupId(true); - - //ComponentFeedbackPanel fungerade inte - WebMarkupContainer feedbackPanel = new FormFeedbackPanel<OpponentModel>("feedbackPanel", this); + + // ComponentFeedbackPanel fungerade inte + WebMarkupContainer feedbackPanel = new FormFeedbackPanel<OpponentModel>( + "feedbackPanel", this); feedbackContainer.add(feedbackPanel); add(feedbackContainer); @@ -138,7 +144,7 @@ public class OpponentPanel extends Panel { add(projectLabel = new TextField<String>("project")); projectLabel.setEnabled(false); projectLabel.setDefaultModelObject(project.getTitle(30)); - + DatePicker<Date> startDateField = new DatePicker<Date>("date") { private static final long serialVersionUID = 1L; @@ -167,47 +173,49 @@ public class OpponentPanel extends Panel { add(room = new TextField<String>("room")); room.setRequired(true); add(startDateField); - - String[] hourArray = new String[] { "00", "01", "02", "03", "04", - "05", "06", "07", "08", "09", "10", "11", "12", - "13", "14", "15", "16", "17", "18", "19", "20", + + String[] hourArray = new String[] { "00", "01", "02", "03", "04", "05", "06", "07", + "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" }; - - String[] minuteArray = new String[] { "00", "05", "10", - "15", "20", "25", "30", "35", "40", "45", "50", - "55" }; + + String[] minuteArray = new String[] { "00", "05", "10", "15", "20", "25", "30", "35", + "40", "45", "50", "55" }; DropDownChoice<String> hour = new DropDownChoice<String>("startHour", Arrays.asList(hourArray)); add(hour); hour.setRequired(false); - DropDownChoice<String> minute = new DropDownChoice<String>( - "startMinute", Arrays.asList(minuteArray)); + DropDownChoice<String> minute = new DropDownChoice<String>("startMinute", + Arrays.asList(minuteArray)); add(minute); minute.setRequired(false); - + DropDownChoice<String> endHour = new DropDownChoice<String>("endHour", Arrays.asList(hourArray)); add(endHour); endHour.setRequired(false); - DropDownChoice<String> endMinute = new DropDownChoice<String>( - "endMinute", Arrays.asList(minuteArray)); + DropDownChoice<String> endMinute = new DropDownChoice<String>("endMinute", + Arrays.asList(minuteArray)); add(endMinute); endMinute.setRequired(false); - - List<FinalSeminarLanguages> languageOptions = new ArrayList<FinalSeminarLanguages>( Arrays.asList(FinalSeminarLanguages.values()) ); + + List<FinalSeminarLanguages> languageOptions = new ArrayList<FinalSeminarLanguages>( + Arrays.asList(FinalSeminarLanguages.values())); FinalSeminarLanguages defaultValue = FinalSeminarLanguages.ENGLISH; - if(project.getProjectClass().getCode().equals(ProjectClass.BACHELOR)){ //Sorry for ugly hard-code, this had to be done and deployed in an afternoon + // Sorry for ugly hard-code, this had to be deployed in an afternoon + if (project.getProjectClass().getCode().equals(ProjectClass.BACHELOR)) { defaultValue = FinalSeminarLanguages.SWEDISH; } - - DropDownChoice<FinalSeminarLanguages> presentationLanguage = new DropDownChoice<FinalSeminarLanguages>("presentationLanguage", languageOptions ); + + DropDownChoice<FinalSeminarLanguages> presentationLanguage = new DropDownChoice<FinalSeminarLanguages>( + "presentationLanguage", languageOptions); add(presentationLanguage); presentationLanguage.setModelObject(defaultValue); presentationLanguage.setRequired(true); - - DropDownChoice<FinalSeminarLanguages> reportLanguage = new DropDownChoice<FinalSeminarLanguages>("reportLanguage", languageOptions ); + + DropDownChoice<FinalSeminarLanguages> reportLanguage = new DropDownChoice<FinalSeminarLanguages>( + "reportLanguage", languageOptions); add(reportLanguage); reportLanguage.setModelObject(defaultValue); reportLanguage.setRequired(true); @@ -243,8 +251,8 @@ public class OpponentPanel extends Panel { public String getTextValue(FinalSeminarActiveParticipation al) { User u = al.getUser(); - return u.getFirstName() + " " + u.getLastName() + " <" - + u.getEmailAddress() + ">"; + return u.getFirstName() + " " + u.getLastName() + " <" + u.getEmailAddress() + + ">"; } protected String getIdValue(FinalSeminarActiveParticipation al) { @@ -280,31 +288,26 @@ public class OpponentPanel extends Panel { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - OpponentModel opponentModel = (OpponentModel) form - .getDefaultModelObject(); + OpponentModel opponentModel = (OpponentModel) form.getDefaultModelObject(); boolean notSameProject = true; boolean error = false; project = projectDao.reLoad(project); for (Student student : project.getProjectParticipants()) { if (!notSameProject) break; - for (FinalSeminarActiveParticipation al : opponentModel - .getOpponentList()) { - if (student.getUser().equals(al.getUser()) - && !al.isPreDeleted()) { + for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { + if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) { notSameProject = false; break; } } } if (project.getProjectClass().equals( - projectClassDao - .getProjectClass(ProjectClass.UNKNOWN))) { + projectClassDao.getProjectClass(ProjectClass.UNKNOWN))) { error = true; } for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { - if (al.getProject() == null - && !al.isPreDeleted()) { + if (al.getProject() == null && !al.isPreDeleted()) { error = true; break; } @@ -315,42 +318,54 @@ public class OpponentPanel extends Panel { Date date = opponentModel.getDate(); Calendar cal = Calendar.getInstance(); cal.setTime(date); - cal.set(Calendar.HOUR_OF_DAY, - Integer.valueOf(opponentModel.getStartHour())); - cal.set(Calendar.MINUTE, - Integer.valueOf(opponentModel.getStartMinute())); + cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getStartHour())); + cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getStartMinute())); seminar.setStartDate(cal.getTime()); - + Calendar endCal = Calendar.getInstance(); endCal.setTime(date); endCal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getEndHour())); - endCal.set(Calendar.MINUTE, - Integer.valueOf(opponentModel.getEndMinute())); + endCal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getEndMinute())); seminar.setEndDate(endCal.getTime()); - - + seminar.setProject(project); seminar.setRoom(opponentModel.getRoom()); - + seminar.setReportLanguage(opponentModel.getReportLanguage()); seminar.setPresentationLanguage(opponentModel.getPresentationLanguage()); seminar = finalSeminarDao.save(seminar); - - for (FinalSeminarActiveParticipation al : opponentModel - .getOpponentList()) { + + for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { if (!al.isPreDeleted()) { FinalSeminarOpposition opposition1 = new FinalSeminarOpposition(); - opposition1.setOpponent(roleDao.makeStudent(al - .getUser())); + opposition1.setOpponent(roleDao.makeStudent(al.getUser())); opposition1.setProject(al.getProject()); opposition1.setFinalSeminar(seminar); - opposition1 = finalSeminarOppositionDao - .save(opposition1); + opposition1 = finalSeminarOppositionDao.save(opposition1); } } + seminar = finalSeminarDao.reLoad(seminar); + for (Student student : project.getProjectParticipants()) { + notificationController.notifyCreateFinalSeminar( + student.getUser(), seminar, NotificationPriority.HIGH, + ProjectStartPage.getAbsoluteURL(), false); + } + + for (ProjectFollower pf : project.getProjectFollowers()) { + notificationController.notifyCreateFinalSeminar(pf + .getFollower().getUser(), seminar, NotificationPriority.HIGH, + SupervisorProjectsFinalSeminarPage.getAbsoluteURL(), false); + } + + // This doesn't load must reload seminar in som way to get it. + for (FinalSeminarOpposition pf : seminar.getOppositions()) { + notificationController.notifyCreateFinalSeminar(pf + .getOpponent().getUser(), seminar, NotificationPriority.HIGH, + ProjectOppositionPage.getAbsoluteURL(), true); + } setResponsePage(SupervisorProjectsFinalSeminarPage.class); } else if (!notSameProject && error) { error("Opponent is an author in the final seminar"); @@ -358,18 +373,18 @@ public class OpponentPanel extends Panel { } else if (notSameProject && error) { error("Must choose a project group for opponent"); error("Unknown project class for the project and/or must select a Project for opponent"); - } else { + } else { error("Opponent is an author in the final seminar"); } } @Override - protected void onError(final AjaxRequestTarget target, - final Form<?> form) { + protected void onError(final AjaxRequestTarget target, final Form<?> form) { target.addComponent(feedbackContainer); } }); } } + } diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java index da03218eb8..aaa19fdec7 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java @@ -404,7 +404,7 @@ public class ProjectFinalSeminarPanel extends Panel { public EditSeminarForm(String name) { super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel())); - editSeminarDialog.setTitle("Edit Seminar"); + editSeminarDialog.setTitle("Edit Final Seminar"); add(new EmptyPanel("editSeminarDetails")); } } @@ -419,7 +419,7 @@ public class ProjectFinalSeminarPanel extends Panel { public EditForm(String name, final FinalSeminar seminar) { super(name); - add(new AjaxButton("edit", new Model<String>("Edit Seminar")) { + add(new AjaxButton("edit", new Model<String>("Edit Final Seminar")) { private static final long serialVersionUID = 4575255075365450180L; @@ -427,7 +427,7 @@ public class ProjectFinalSeminarPanel extends Panel { protected void onSubmit(AjaxRequestTarget target, Form<?> form) { FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar); editSeminarForm.removeAll(); - editSeminarForm.add(new EditFinalSeminarFormPanel("editSeminarDetails", seminar2)); + editSeminarForm.add(new EditFinalSeminarFormPanel("editSeminarDetails", seminar2, false)); target.addComponent(editSeminarForm); editSeminarDialog.open(target); } diff --git a/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalController.java b/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalController.java index 423ec9985a..343378b6f5 100644 --- a/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalController.java +++ b/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalController.java @@ -26,8 +26,5 @@ public interface PeerPortalController { PeerRequest storePeerRequest(final FileUpload upload, PeerRequest request) throws Exception; - void notifyOfReviewRating(PeerReview review); - - void notifyCompletionOfReview(PeerReview review); } diff --git a/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java b/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java index 717f91afc0..4aa454fe5e 100644 --- a/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java +++ b/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java @@ -5,22 +5,16 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; -import java.util.Properties; import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.apache.wicket.PageParameters; -import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.html.form.upload.FileUpload; -import org.apache.wicket.protocol.http.RequestUtils; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; -import se.su.dsv.scipro.conference.pages.SupervisorConferencePage; import se.su.dsv.scipro.data.controllers.NotificationController; -import se.su.dsv.scipro.data.controllers.NotificationMessage; import se.su.dsv.scipro.data.dao.interfaces.FileDescriptionDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dataobjects.FileDescription; @@ -28,22 +22,14 @@ import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.ProjectClass; import se.su.dsv.scipro.data.dataobjects.ProjectClassSettings; import se.su.dsv.scipro.data.dataobjects.Student; -import se.su.dsv.scipro.data.dataobjects.User; -import se.su.dsv.scipro.data.enums.NotificationEventType; -import se.su.dsv.scipro.data.enums.NotificationPriority; import se.su.dsv.scipro.exceptions.UpdatedSincePageLoadException; import se.su.dsv.scipro.peer.data.dao.interfaces.PeerRequestDao; import se.su.dsv.scipro.peer.data.dao.interfaces.PeerReviewDao; 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.peer.pages.ProjectPeerReviewPage; -import se.su.dsv.scipro.peer.pages.ProjectPeerStatsPage; -import se.su.dsv.scipro.peer.pages.SupervisorPeerReviewPage; import se.su.dsv.scipro.repository.FileRepository; import se.su.dsv.scipro.repository.util.FileStorageException; -import se.su.dsv.scipro.security.auth.roles.Roles; -import se.su.dsv.scipro.util.PropsUtils; /** * @@ -247,7 +233,7 @@ public class PeerPortalControllerImpl implements PeerPortalController { request = peerRequestDao.save(request); // Notify the requester - notifyAcceptOfReview(request, student, project); + notificationController.notifyAcceptOfReview(request, student, project); return review; } catch (Exception e) { @@ -267,151 +253,7 @@ public class PeerPortalControllerImpl implements PeerPortalController { } } - /** - * TODO Rewrite using template engine of some sort - * - * @param request - * @param student - * @param project - */ - protected void notifyAcceptOfReview(PeerRequest request, Student student, Project project) { - try { - Properties props = null; - - props = PropsUtils.load("notification.properties"); - - String mailSubject = props.getProperty("acceptPeerReviewSubject"); - String requestAccepted = props.getProperty("requestAccepted"); - String heShe = props.getProperty("heShe"); - String complete = props.getProperty("complete"); - - User requestingUser = request.getRequester().getUser(); - - String messageBody = requestAccepted - + student.getUser().toString() - + heShe - + project.getProjectClass().getProjectClassSettings() - .getNumDaysToSubmitPeerReview() + complete; - - String webNotificationMessage = requestAccepted + student.getUser().toString(); - - NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, - mailSubject, messageBody); - - PageParameters pp = new PageParameters(); - - String peerStatsUrl = RequestUtils.toAbsolutePath(RequestCycle.get() - .urlFor(ProjectPeerStatsPage.class, pp).toString()); - - notificationController.processNotification(requestingUser, notificationMessage, - peerStatsUrl, NotificationPriority.MEDIUM); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * TODO Rewrite - * - * @param review - */ - public void notifyCompletionOfReview(PeerReview review) { - try { - - Properties props = null; - props = PropsUtils.load("notification.properties"); - String mailSubject = props.getProperty("completedReviewSubject"); - String requestReviewed = props.getProperty("requestReviewed"); - String supervisorMessageBody = props.getProperty("supervisorMessageBody"); - String supervisorMessageBody2 = props.getProperty("supervisorMessageBody2"); - String supervisorMessageBody3 = props.getProperty("supervisorMessageBody3"); - String commaWithLinebreak = props.getProperty("commaWithLinebreak"); - String inProject = props.getProperty("inProject"); - String hasPerformed = props.getProperty("hasPerformed"); - PeerRequest peerRequest = review.getPeerRequest(); - User requestingUser = peerRequest.getRequester().getUser(); - - PageParameters pp = new PageParameters(); - pp.add(PeerReview.PP_PEER_REVIEW_ID, review.getId().toString()); - - String reviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get() - .urlFor(ProjectPeerReviewPage.class, pp).toString()); - String supervisorReviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get() - .urlFor(SupervisorPeerReviewPage.class, pp).toString()); - - //Message for student when his/her review request is completed. - String messageBody = requestReviewed; - - NotificationMessage notificationMessage = new NotificationMessage(messageBody, - mailSubject, messageBody); - - notificationController.processNotification(requestingUser, notificationMessage, - reviewUrl, NotificationPriority.MEDIUM); - - //Message for supervisor of the project with a completed review. - messageBody = - supervisorMessageBody - + peerRequest.getProject().getTitle() - + supervisorMessageBody2; - User requestSupervisor = peerRequest.getProject().getHeadSupervisor().getUser(); - - NotificationMessage notificationMessageSupervisorOfProject = new NotificationMessage(messageBody, - mailSubject, messageBody); - - notificationController.processNotification(requestSupervisor, - notificationMessageSupervisorOfProject, supervisorReviewUrl, NotificationPriority.MEDIUM); - - //Message for supervisor of the reviewer that have made a review for another project. - - String webNotificationMessage = review.getReviewer().getUser().toString() + inProject + review.getProject().getTitle() + hasPerformed; - - messageBody = supervisorMessageBody - + review.getProject().getTitle() - + commaWithLinebreak + review.getReviewer().getUser().toString() - + supervisorMessageBody3; - - User reviewSupervisor = review.getProject().getHeadSupervisor().getUser(); - NotificationMessage notificationMessageSupervisorOfReviewer = new NotificationMessage(webNotificationMessage, - mailSubject, messageBody); - - notificationController.processNotification(reviewSupervisor, notificationMessageSupervisorOfReviewer, supervisorReviewUrl, NotificationPriority.MEDIUM); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * TODO Rewrite - * - * @param review - */ - public void notifyOfReviewRating(PeerReview review) { - try { - Properties props = null; - props = PropsUtils.load("notification.properties"); - String mailSubject = props.getProperty("reviewRatedSubject"); - String reviewRatedBody = props.getProperty("reviewRatedBody"); - User reviewingUser = review.getReviewer().getUser(); - - PageParameters pp = new PageParameters(); - pp.add(PeerReview.PP_PEER_REVIEW_ID, review.getId().toString()); - String projectReviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get() - .urlFor(ProjectPeerReviewPage.class, pp).toString()); - - - String messageBody = reviewRatedBody; - - NotificationMessage notificationMessage = new NotificationMessage(messageBody, - mailSubject, messageBody); - - notificationController.processNotification(reviewingUser, notificationMessage, - projectReviewUrl, NotificationPriority.MEDIUM); - - } catch (Exception e) { - e.printStackTrace(); - } - } + /** * Store file to a pre-populated PeerRequest diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewPerformReviewPanel.java b/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewPerformReviewPanel.java index ae8961d3eb..a3da423c9d 100644 --- a/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewPerformReviewPanel.java +++ b/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewPerformReviewPanel.java @@ -33,6 +33,7 @@ import org.odlabs.wiquery.core.javascript.JsStatement; import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.components.JavascriptCountdown; import se.su.dsv.scipro.data.DomainObjectDetachableModel; +import se.su.dsv.scipro.data.controllers.NotificationController; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.peer.data.dao.controllers.PeerPortalController; import se.su.dsv.scipro.peer.data.dao.interfaces.PeerRequestDao; @@ -66,6 +67,9 @@ public class PeerReviewPerformReviewPanel extends Panel { @SpringBean private PeerPortalController peerPortalController; + @SpringBean + private NotificationController notificationController; + public PeerReviewPerformReviewPanel(String id, final PeerReview peerReview) { super(id); /* @@ -257,7 +261,7 @@ public class PeerReviewPerformReviewPanel extends Panel { peerReview.setSubmitted(true); peerRequest.setStatus(RequestStatus.FINISHED); getSession().info("Your review has been saved, thank you!"); - peerPortalController.notifyCompletionOfReview(peerReview); + notificationController.notifyCompletionOfReview(peerReview); } peerRequest = peerRequestDao.save(peerRequest); diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewRatingPanel.java b/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewRatingPanel.java index 4a706eba9e..9e777a0f33 100644 --- a/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewRatingPanel.java +++ b/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewRatingPanel.java @@ -19,6 +19,7 @@ import org.apache.wicket.spring.injection.annot.SpringBean; import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.components.StarRater; +import se.su.dsv.scipro.data.controllers.NotificationController; import se.su.dsv.scipro.peer.data.dao.controllers.PeerPortalController; import se.su.dsv.scipro.peer.data.dao.interfaces.ReviewRatingDao; import se.su.dsv.scipro.peer.data.dataobjects.PeerReview; @@ -31,7 +32,7 @@ public class PeerReviewRatingPanel extends Panel { @SpringBean private ReviewRatingDao reviewRatingDao; @SpringBean - private PeerPortalController peerPortalController; + private NotificationController notificationController; public PeerReviewRatingPanel(String id, final IModel<PeerReview> model) { super(id, model); @@ -108,7 +109,7 @@ public class PeerReviewRatingPanel extends Panel { starRating.setReadOnly(true); target.addComponent(PeerReviewRatingPanel.this); - peerPortalController.notifyOfReviewRating(rating.getPeerReview()); + notificationController.notifyOfReviewRating(rating.getPeerReview()); } diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectOppositionPage.java b/src/main/java/se/su/dsv/scipro/project/pages/ProjectOppositionPage.java index 38881598d1..34dd3cb2ea 100644 --- a/src/main/java/se/su/dsv/scipro/project/pages/ProjectOppositionPage.java +++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectOppositionPage.java @@ -1,11 +1,12 @@ package se.su.dsv.scipro.project.pages; import org.apache.wicket.PageParameters; +import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.html.panel.FeedbackPanel; +import org.apache.wicket.protocol.http.RequestUtils; import org.apache.wicket.spring.injection.annot.SpringBean; import se.su.dsv.scipro.SciProSession; -import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.ProjectClass; @@ -22,8 +23,6 @@ public class ProjectOppositionPage extends ProjectPage { @SpringBean private ProjectDao projectDao; - @SpringBean - private FinalSeminarDao finalSeminarDao; public ProjectOppositionPage(PageParameters pp) { super(pp); @@ -48,5 +47,11 @@ public class ProjectOppositionPage extends ProjectPage { }); } + + public static String getAbsoluteURL() { + PageParameters pageParameters = new PageParameters(); + return RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(ProjectOppositionPage.class, pageParameters).toString()); + } } diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java index 5b43713ca7..94f19b03cc 100644 --- a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java +++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java @@ -2,8 +2,10 @@ package se.su.dsv.scipro.project.pages; import org.apache.wicket.Page; import org.apache.wicket.PageParameters; +import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.FeedbackPanel; +import org.apache.wicket.protocol.http.RequestUtils; import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.data.dataobjects.Project; @@ -53,6 +55,12 @@ public class ProjectStartPage extends ProjectPage { } + + public static String getAbsoluteURL() { + PageParameters pageParameters = new PageParameters(); + return RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(ProjectStartPage.class, pageParameters).toString()); + } } diff --git a/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java index bb01f46130..2c018e2d0c 100644 --- a/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java +++ b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java @@ -117,6 +117,7 @@ public class NotificationsPanel extends Panel { webnotification.setReadByUser(true); webNotificationDao.save(webnotification); } + countOfNotifications = numberOfNotificationsModel.getObject(); target.addComponent(webMarkupContainer); } diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorFinalSeminarListingPage.java b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorFinalSeminarListingPage.java index 956496198c..e2f068c767 100644 --- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorFinalSeminarListingPage.java +++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorFinalSeminarListingPage.java @@ -5,25 +5,24 @@ package se.su.dsv.scipro.supervisor.pages; import org.apache.wicket.PageParameters; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.spring.injection.annot.SpringBean; -import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; import se.su.dsv.scipro.dataproviders.FinalSeminarAfterNowDataProvider; import se.su.dsv.scipro.opponent.panels.ChangeViewPanel; import se.su.dsv.scipro.opponent.panels.OpponentListViewPanel; /** * @author Johan Aschan - aschan@dsv.su.se - * + * */ public class SupervisorFinalSeminarListingPage extends AbstractSupervisorFinalSeminarPage { - + public SupervisorFinalSeminarListingPage(PageParameters pp) { super(pp); WebMarkupContainer container = new WebMarkupContainer("container"); container.setOutputMarkupId(true); - container.add(new OpponentListViewPanel("finalSeminar", new FinalSeminarAfterNowDataProvider(), false, false)); + container.add(new OpponentListViewPanel("finalSeminar", + new FinalSeminarAfterNowDataProvider(), false, false)); add(new ChangeViewPanel("changeViewPanel", container, false)); add(container); - } + } } diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectsFinalSeminarPage.java b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectsFinalSeminarPage.java index 2ff71f02ca..c554748150 100644 --- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectsFinalSeminarPage.java +++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectsFinalSeminarPage.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.wicket.PageParameters; +import org.apache.wicket.RequestCycle; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.markup.html.WebMarkupContainer; @@ -13,6 +14,7 @@ import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; +import org.apache.wicket.protocol.http.RequestUtils; import org.apache.wicket.spring.injection.annot.SpringBean; import org.odlabs.wiquery.core.effects.EffectSpeed; @@ -26,20 +28,20 @@ import se.su.dsv.scipro.util.SelectOption; import se.su.dsv.scipro.util.WiQueryCoreEffectsHelper; public class SupervisorProjectsFinalSeminarPage extends AbstractSupervisorFinalSeminarPage { - - public static final String MAIN_MENU_LABEL = "Final Seminars"; - + + public static final String MAIN_MENU_LABEL = "Final Seminars"; + @SpringBean private ProjectDao projectDao; - + private ProjectStatus selectedStatus; private User loggedInUser; - - public SupervisorProjectsFinalSeminarPage(final PageParameters pp){ + + public SupervisorProjectsFinalSeminarPage(final PageParameters pp) { super(pp); this.selectedStatus = ProjectStatus.ACTIVE; this.loggedInUser = SciProSession.get().getUser(); - + final LoadableDetachableModel<List<Project>> projectsModel = new LoadableDetachableModel<List<Project>>() { private static final long serialVersionUID = 1L; @@ -47,56 +49,68 @@ public class SupervisorProjectsFinalSeminarPage extends AbstractSupervisorFinalS protected List<Project> load() { return projectDao.getProjectsByHeadSupervisor(loggedInUser, selectedStatus); } - + }; - - final WebMarkupContainer projectListContainer = new WebMarkupContainer("projectListContainer"); + + final WebMarkupContainer projectListContainer = new WebMarkupContainer( + "projectListContainer"); projectListContainer.setOutputMarkupId(true); - - final ListView<Project> activeProjectsListView = new ListView<Project>("activeProjectsListView", projectsModel){ + + final ListView<Project> activeProjectsListView = new ListView<Project>( + "activeProjectsListView", projectsModel) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<Project> item) { final Project project = item.getModelObject(); item.add(new Label("projectTitle", project.getTitle())); - item.add(new ProjectFinalSeminarContainerPanel("projectSeminarContainer", project, true)); + item.add(new ProjectFinalSeminarContainerPanel("projectSeminarContainer", project, + true)); add(item); } }; - - projectListContainer.add(new Label("noProjectsFoundMessage", "No projects found"){ + + projectListContainer.add(new Label("noProjectsFoundMessage", "No projects found") { private static final long serialVersionUID = 1L; @Override - public boolean isVisible(){ + public boolean isVisible() { return activeProjectsListView.getModelObject().size() == 0; } }); - + projectListContainer.add(activeProjectsListView); add(projectListContainer); - + final List<SelectOption<ProjectStatus>> statusOptions = new ArrayList<SelectOption<ProjectStatus>>(); statusOptions.add(new SelectOption<ProjectStatus>("Active projects", ProjectStatus.ACTIVE)); - statusOptions.add(new SelectOption<ProjectStatus>("Inactive projects", ProjectStatus.INACTIVE)); - statusOptions.add(new SelectOption<ProjectStatus>("Completed projects", ProjectStatus.COMPLETED)); - - final DropDownChoice<SelectOption<ProjectStatus>> statusOptionsDD = - new DropDownChoice<SelectOption<ProjectStatus>>("statusOptionsDD", - new Model<SelectOption<ProjectStatus>>(statusOptions.get(0)), statusOptions); - - statusOptionsDD.add(new AjaxFormComponentUpdatingBehavior("onchange"){ + statusOptions.add(new SelectOption<ProjectStatus>("Inactive projects", + ProjectStatus.INACTIVE)); + statusOptions.add(new SelectOption<ProjectStatus>("Completed projects", + ProjectStatus.COMPLETED)); + + final DropDownChoice<SelectOption<ProjectStatus>> statusOptionsDD = new DropDownChoice<SelectOption<ProjectStatus>>( + "statusOptionsDD", new Model<SelectOption<ProjectStatus>>(statusOptions.get(0)), + statusOptions); + + statusOptionsDD.add(new AjaxFormComponentUpdatingBehavior("onchange") { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { selectedStatus = statusOptionsDD.getModelObject().value; - target.addComponent(WiQueryCoreEffectsHelper.fadeIn(projectListContainer, EffectSpeed.FAST)); + target.addComponent(WiQueryCoreEffectsHelper.fadeIn(projectListContainer, + EffectSpeed.FAST)); } }); - + add(statusOptionsDD); - + + } + + public static String getAbsoluteURL() { + PageParameters pageParameters = new PageParameters(); + return RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(SupervisorProjectsFinalSeminarPage.class, pageParameters).toString()); } } diff --git a/src/main/resources/notification.properties b/src/main/resources/notification.properties index 6b8344dfbf..b483ba1726 100644 --- a/src/main/resources/notification.properties +++ b/src/main/resources/notification.properties @@ -6,11 +6,17 @@ mailSubject=Notification for SciPro hello=Hello autogenerated=This is an auto-generated message from SciPro colon=: +comma=, +dot=. +space=\ +quote=" #Conference conferenceNotification=\ posted on conference conferenceNotificationComment=\ commented on conference #Private message privateMessageNotification=\ wrote a private message to you. +#Private message reply +privateMessageReplyNotification=\ replied with a private message to you. #Peer accepted acceptPeerReviewSubject=Your request for peer-review has been accepted requestAccepted=Your peer request was accepted by @@ -31,3 +37,16 @@ commaWithLinebreak=".\n #Peer rated reviewRatedSubject=You have received a rating for a review you have done! reviewRatedBody=Your review has been rated. +#Final seminar created +finalSeminarCreated=Head supervisor for +finalSeminarProject=\ has created a final seminar, room +finalSeminarProjectOpponnent=\ has created a final seminar and added you as an opponent, room +#Final seminar report uploaded +finalSeminarReportUploaded=Thesis for the project +finalSeminarReportBeenUploaded=\ has been uploaded. +#Final seminar opposition report uploaded +finalSeminarOppositionReportUploaded=Opposition-report for the project +finalSeminarOppositionReportBeenUploaded=\ has been uploaded by +#Final seminar edited +finalSeminarOppositionReportEdited=Final seminar for project +finalSeminarOppositionReportBeenEdited=\ has been edited. diff --git a/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java b/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java index 61b0886b8f..7bb1142ecf 100644 --- a/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java +++ b/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java @@ -49,6 +49,7 @@ public class TestWicketPages extends BaseWicketTest { activeUser.setFirstName("Hugo"); activeProject = new Project(); activeProject.setProjectClass(bachelor); + activeProject.setId(1L); Mockito.when(projectDao.load(Mockito.eq(1L))).thenReturn(activeProject); Mockito.when(projectDao.isPartOf(activeUser, activeProject)).thenReturn(true); @@ -133,6 +134,12 @@ public class TestWicketPages extends BaseWicketTest { tester.assertRenderedPage(ProjectFilePage.class); } + @Test + public void testProjectConferencePage() { + tester.startPage(ProjectConferencePage.class); + tester.assertRenderedPage(ProjectConferencePage.class); + } + /* * Supervisor pages