Merge branch 'develop' into updateSupervisorSelectIdea
This commit is contained in:
commit
bbcb4621d6
resources/db_update_scripts
src
main
java/se/su/dsv/scipro
SciProApplication.javaSciProSession.java
activityplan/panels
ActivityPlanPanel.javaAddScheduleEventsFromTemplatePanel.htmlAddScheduleEventsFromTemplatePanel.java
basepages
data
TurnItInCheck.java
controllers/impl
loginlogout
pages
LoginPage.htmlLoginPage.javaSSOInitializationPage.htmlSSOInitializationPage.javaShibboleth.javaShibbolethInitialization.java
panels
notifications/dataobject
project/panels
seminar/panels
springdata
util
workerthreads
webapp/css
test/java/se/su/dsv/scipro
@ -95,4 +95,11 @@ CREATE TABLE IF NOT EXISTS `Password` (
|
||||
KEY `deleted_index` (`deleted`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;
|
||||
|
||||
ALTER TABLE `user` ADD `password_id` bigint(20) DEFAULT NULL;
|
||||
ALTER TABLE `user` ADD `password_id` bigint(20) DEFAULT NULL;
|
||||
|
||||
-- added later to prod, should've followed with this file.
|
||||
ALTER TABLE `NotificationData` ADD COLUMN `source` VARCHAR(255) DEFAULT NULL;
|
||||
|
||||
ALTER TABLE `NotificationData` ADD COLUMN `review_id` bigint(20) DEFAULT NULL;
|
||||
ALTER TABLE `NotificationData` ADD INDEX `FK2DCAC35542E9AC7B` (`review_id`);
|
||||
ALTER TABLE `NotificationData` ADD CONSTRAINT `FK2DCAC35542E9AC7B` FOREIGN KEY (`review_id`) REFERENCES `peer_review` (`id`);
|
2
resources/db_update_scripts/db_update_20130117.sql
Normal file
2
resources/db_update_scripts/db_update_20130117.sql
Normal file
@ -0,0 +1,2 @@
|
||||
ALTER TABLE `turnitincheck`
|
||||
DROP `error`;
|
@ -26,9 +26,7 @@ import se.su.dsv.scipro.conference.pages.ProjectConferencePage;
|
||||
import se.su.dsv.scipro.conference.pages.SupervisorConferencePage;
|
||||
import se.su.dsv.scipro.exceptions.RenderingSafeException;
|
||||
import se.su.dsv.scipro.json.pages.*;
|
||||
import se.su.dsv.scipro.loginlogout.pages.ExternalLoginPage;
|
||||
import se.su.dsv.scipro.loginlogout.pages.LoginPage;
|
||||
import se.su.dsv.scipro.loginlogout.pages.LogoutPage;
|
||||
import se.su.dsv.scipro.loginlogout.pages.*;
|
||||
import se.su.dsv.scipro.message.pages.PrivateMessagesPage;
|
||||
import se.su.dsv.scipro.notifications.NotificationLoader;
|
||||
import se.su.dsv.scipro.notifications.pages.NotificationsPage;
|
||||
@ -55,7 +53,6 @@ import java.util.Set;
|
||||
* Application object for your web application. If you want to run this application without deploying, run the Start class.
|
||||
*
|
||||
* @author Martin Peters - mpeters@dsv.su.se
|
||||
* @see wicket.myproject.Start#main(String[])
|
||||
*/
|
||||
@Component
|
||||
public class SciProApplication extends RepositoryApplication implements IThemableApplication {
|
||||
@ -115,6 +112,9 @@ public class SciProApplication extends RepositoryApplication implements IThemabl
|
||||
*/
|
||||
mountBookmarkablePage("login", LoginPage.class);
|
||||
mountBookmarkablePage("logout", LogoutPage.class);
|
||||
mountBookmarkablePage("sso", SSOInitializationPage.class);
|
||||
mountBookmarkablePage("shib_auto", ShibbolethInitialization.class);
|
||||
mountBookmarkablePage("shibboleth", Shibboleth.class);
|
||||
mountBookmarkablePage("demo", DemoPage.class);
|
||||
mountBookmarkablePage("workshop", WorkshopPage.class);
|
||||
mountBookmarkablePage("external", ExternalLoginPage.class);
|
||||
|
@ -33,6 +33,11 @@ public class SciProSession extends WebSession {
|
||||
private static final long serialVersionUID = -2655601050866343391L;
|
||||
|
||||
private boolean loggedIn = false;
|
||||
private boolean shibbolethInitialized = false;
|
||||
/**
|
||||
* Only redirect shibboleth logins once to allow access to the login page afterwards.
|
||||
*/
|
||||
private boolean shibbolethRedirected = false;
|
||||
|
||||
@SpringBean
|
||||
private UserDao userDao;
|
||||
@ -297,4 +302,20 @@ public class SciProSession extends WebSession {
|
||||
Locale swedishLocale = new Locale("sv", "SE");
|
||||
return swedishLocale;
|
||||
}
|
||||
|
||||
public boolean isShibbolethInitialized() {
|
||||
return shibbolethInitialized;
|
||||
}
|
||||
|
||||
public void setShibbolethInitialized(boolean shibbolethInitialized) {
|
||||
this.shibbolethInitialized = shibbolethInitialized;
|
||||
}
|
||||
|
||||
public boolean isShibbolethRedirected() {
|
||||
return shibbolethRedirected;
|
||||
}
|
||||
|
||||
public void setShibbolethRedirected(boolean shibbolethRedirected) {
|
||||
this.shibbolethRedirected = shibbolethRedirected;
|
||||
}
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ import se.su.dsv.scipro.notifications.dataobject.NotificationSource;
|
||||
import se.su.dsv.scipro.notifications.dataobject.ProjectEvent;
|
||||
import se.su.dsv.scipro.project.pages.ProjectViewCheckListPage;
|
||||
import se.su.dsv.scipro.repository.panels.FileViewDeletePanel;
|
||||
import se.su.dsv.scipro.springdata.services.ProjectService;
|
||||
import se.su.dsv.scipro.util.DateFormatter;
|
||||
import se.su.dsv.scipro.util.JavascriptEventConfirmation;
|
||||
import se.su.dsv.scipro.util.NotificationUtils;
|
||||
@ -49,6 +50,8 @@ public class ActivityPlanPanel extends Panel {
|
||||
private ProjectScheduleFacade facade;
|
||||
@SpringBean
|
||||
NotificationController notificationController;
|
||||
@SpringBean
|
||||
private ProjectService projectService;
|
||||
|
||||
private Dialog saveAsTemplateDialog;
|
||||
private Dialog addFromTemplateDialog;
|
||||
@ -560,6 +563,7 @@ public class ActivityPlanPanel extends Panel {
|
||||
pp.add(Project.PP_PROJECT_ID, String.valueOf(getProject().getId()));
|
||||
NotificationSource source = NotificationUtils.sourceFor(
|
||||
SupervisorActivityPlanPage.class, ProjectActivityPlanPage.class, pp);
|
||||
notificationController.notifyProject(getProject(), event, source);
|
||||
Project p = projectService.findOne(getProject().getId());
|
||||
notificationController.notifyProject(p, event, source);
|
||||
}
|
||||
}
|
||||
|
@ -11,9 +11,11 @@
|
||||
</div>
|
||||
<div wicket:id="second">
|
||||
<div><a wicket:id="backlink">Back</a></div>
|
||||
<form wicket:id="form">
|
||||
<div>Start date:
|
||||
<wicket:container wicket:id="fromdate"></wicket:container>
|
||||
<span><button wicket:id="uselink">Use</button></span></div>
|
||||
</form>
|
||||
<div wicket:id="viewpanel"></div>
|
||||
</div>
|
||||
</wicket:panel>
|
||||
|
@ -5,6 +5,7 @@ import java.util.List;
|
||||
|
||||
import org.apache.wicket.ajax.AjaxRequestTarget;
|
||||
import org.apache.wicket.ajax.markup.html.AjaxLink;
|
||||
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
|
||||
import org.apache.wicket.markup.html.WebMarkupContainer;
|
||||
import org.apache.wicket.markup.html.form.DropDownChoice;
|
||||
import org.apache.wicket.markup.html.form.Form;
|
||||
@ -32,7 +33,7 @@ public abstract class AddScheduleEventsFromTemplatePanel extends Panel {
|
||||
private WebMarkupContainer second;
|
||||
private AjaxLink<Void> backLink;
|
||||
private StylableDateTimeField fromDate;
|
||||
private AjaxLink<Void> useLink;
|
||||
private AjaxButton useLink;
|
||||
private ScheduleTemplate selected;
|
||||
|
||||
public abstract void handleSubmit(final ScheduleTemplate template, final Date fromDate, AjaxRequestTarget target);
|
||||
@ -59,13 +60,16 @@ public abstract class AddScheduleEventsFromTemplatePanel extends Panel {
|
||||
first.setVisible(true);
|
||||
}
|
||||
});
|
||||
second.add(fromDate = new StylableDateTimeField("fromdate", new Model<Date>(new Date())));
|
||||
second.add(useLink = new AjaxLink<Void>("uselink") {
|
||||
|
||||
Form<Void> form = new Form<Void>("form");
|
||||
form.add(fromDate = new StylableDateTimeField("fromdate", new Model<Date>(new Date())));
|
||||
form.add(useLink = new AjaxButton("uselink") {
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
|
||||
handleSubmit(selected, fromDate.getModelObject(), target);
|
||||
}
|
||||
});
|
||||
second.add(form);
|
||||
add(second);
|
||||
|
||||
first.add(new ActivityPlanTemplateDataPanel("data", false, headsupervisorUser) {
|
||||
|
@ -27,7 +27,6 @@
|
||||
<link media="screen, projection" href="css/bootstrap/bootstrap.css" type="text/css" rel="stylesheet">
|
||||
<link media="screen, projection" href="css/bootstrap/bootstrap-responsive.css" type="text/css" rel="stylesheet">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://html5shim.googlecode.com/svn/trunk/html5.js"></script>
|
||||
|
@ -1,10 +1,15 @@
|
||||
package se.su.dsv.scipro.basepages.errorpages;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
public class NotFoundPage extends AbstractErrorPage {
|
||||
public NotFoundPage(){
|
||||
static Logger logger = Logger.getLogger(NotFoundPage.class);
|
||||
|
||||
public NotFoundPage(){
|
||||
super("The requested page was not found");
|
||||
logger.trace("Request URI: " + getWebRequestCycle().getWebRequest().getHttpServletRequest().getAttribute("javax.servlet.error.request_uri"));
|
||||
}
|
||||
@Override
|
||||
protected void configureResponse() {
|
||||
|
@ -54,13 +54,6 @@ public class TurnItInCheck extends DomainObject{
|
||||
|
||||
private String turnItInId;
|
||||
|
||||
/**
|
||||
* User to signal that we got an error when trying to upload the file to turnitin, e.g. 302 MD5 error. If true
|
||||
* we can then signal in the final seminar panel that there was a turnitin error, that the file should be deleted
|
||||
* and reuploaded.
|
||||
*/
|
||||
private boolean error;
|
||||
|
||||
/**
|
||||
* no args constructor should never be used! or maybe we could use no args constructor and set fileDescription
|
||||
* attribute and then let the worker check if there is a hash or not and if none create one?
|
||||
@ -131,12 +124,4 @@ public class TurnItInCheck extends DomainObject{
|
||||
public void setTurnItInId(String turnItInId) {
|
||||
this.turnItInId = turnItInId;
|
||||
}
|
||||
|
||||
public boolean isError() {
|
||||
return error;
|
||||
}
|
||||
|
||||
public void setError(boolean error) {
|
||||
this.error = error;
|
||||
}
|
||||
}
|
@ -97,6 +97,7 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr
|
||||
assertMimeType(file.getMimeType());
|
||||
if (file.getId() == null) //Transient unmanaged entity, needs to be merged
|
||||
file = fileDescriptionDao.save(file);
|
||||
seminar = finalSeminarDao.reLoad(seminar);
|
||||
seminar.setDocument(file);
|
||||
seminar.setDocumentUploadDate(new Date());
|
||||
|
||||
@ -136,6 +137,7 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr
|
||||
assertOpponent(uploader, opposition);
|
||||
if (file.getId() == null)
|
||||
file = fileDescriptionDao.save(file);
|
||||
opposition = finalSeminarOppositionDao.reLoad(opposition);
|
||||
opposition.setOpponentReport(file);
|
||||
opposition.setDateReported(new Date());
|
||||
opposition = finalSeminarOppositionDao.save(opposition);
|
||||
|
@ -15,6 +15,7 @@ import se.su.dsv.scipro.peer.data.dataobjects.PeerReview;
|
||||
import se.su.dsv.scipro.springdata.services.GeneralSystemSettingsService;
|
||||
import se.su.dsv.scipro.springdata.services.NotificationService;
|
||||
import se.su.dsv.scipro.springdata.services.NotificationSettingsService;
|
||||
import se.su.dsv.scipro.springdata.services.ProjectService;
|
||||
|
||||
/**
|
||||
* Date: 11/19/12
|
||||
@ -36,6 +37,11 @@ public class NotificationControllerImpl implements NotificationController {
|
||||
MailEventDao mailEventDao;
|
||||
@Autowired
|
||||
GeneralSystemSettingsService generalSystemSettingsService;
|
||||
/**
|
||||
* This generates nullpointer. Why?
|
||||
*/
|
||||
// @Autowired
|
||||
// ProjectService projectService;
|
||||
|
||||
private void notify(NotificationRecipients recipients, NotificationEvent data) {
|
||||
GeneralSystemSettings systemSettings = generalSystemSettingsService.getGeneralSystemSettingsInstance();
|
||||
@ -184,6 +190,7 @@ public class NotificationControllerImpl implements NotificationController {
|
||||
|
||||
private void populate(NotificationRecipients recipients, Project project, NotificationSource source,
|
||||
boolean headSupervisor, boolean coSupervisor, boolean reviewer, boolean author) {
|
||||
// project = projectService.findOne(project.getId());
|
||||
if (author) {
|
||||
for (Student student : project.getProjectParticipants()) {
|
||||
recipients.addRecipient(student.getUser(), source.getUserSource());
|
||||
|
@ -4,9 +4,22 @@
|
||||
<wicket:extend>
|
||||
<div wicket:id="dsvHeader"></div>
|
||||
<section id="main-content">
|
||||
<!--<div class="prepend-top"></div>-->
|
||||
<div wicket:id="signInPanel"></div>
|
||||
</section>
|
||||
<div class="row-fluid">
|
||||
<h2 class="offset1">Login</h2>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="offset1 span4">
|
||||
<div wicket:id="loginChoice" class="tab-container"></div>
|
||||
</div>
|
||||
<div class="span7">
|
||||
<p>Use the SSO system Shibboleth to log into SciPro.</p>
|
||||
<wicket:enclosure child="displayName">
|
||||
<p>Currently logged in as: <span wicket:id="displayName">[Kalle Testare]</span></p>
|
||||
</wicket:enclosure>
|
||||
<p><a href="#" wicket:id="sso">Log in with Shibboleth</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<div wicket:id="footerPanel"></div>
|
||||
</wicket:extend>
|
||||
</body>
|
||||
|
@ -1,32 +1,85 @@
|
||||
package se.su.dsv.scipro.loginlogout.pages;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.wicket.PageParameters;
|
||||
|
||||
import org.apache.wicket.extensions.ajax.markup.html.tabs.AjaxTabbedPanel;
|
||||
import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
|
||||
import org.apache.wicket.extensions.markup.html.tabs.ITab;
|
||||
import org.apache.wicket.extensions.markup.html.tabs.TabbedPanel;
|
||||
import org.apache.wicket.markup.html.basic.Label;
|
||||
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
|
||||
import org.apache.wicket.markup.html.link.Link;
|
||||
import org.apache.wicket.markup.html.panel.Panel;
|
||||
import org.apache.wicket.model.Model;
|
||||
import se.su.dsv.scipro.SciProSession;
|
||||
import se.su.dsv.scipro.basepages.PublicPage;
|
||||
import se.su.dsv.scipro.basepanels.FooterPanel;
|
||||
import se.su.dsv.scipro.loginlogout.panels.DSVHeader;
|
||||
import se.su.dsv.scipro.loginlogout.panels.LoginPanel;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Page for logging users into the system
|
||||
* @param pp the page parameters
|
||||
* @author Martin Peters - mpeters@dsv.su.se
|
||||
*/
|
||||
public class LoginPage extends PublicPage {
|
||||
|
||||
public LoginPage(final PageParameters pp) throws Exception {
|
||||
SciProSession session = SciProSession.get();
|
||||
|
||||
add(new DSVHeader("dsvHeader"));
|
||||
|
||||
add(new LoginPanel("signInPanel", true, "ThesisJaasUser"));
|
||||
|
||||
FooterPanel footerPanel = new FooterPanel("footerPanel");
|
||||
add(footerPanel);
|
||||
if (hasShibbolethSession() && !session.isShibbolethRedirected()) {
|
||||
session.setShibbolethRedirected(true);
|
||||
if(!continueToOriginalDestination())
|
||||
setResponsePage(getApplication().getHomePage());
|
||||
}
|
||||
else if (!session.isShibbolethInitialized()) {
|
||||
setResponsePage(SSOInitializationPage.class);
|
||||
}
|
||||
else {
|
||||
initComponents();
|
||||
}
|
||||
}
|
||||
|
||||
private void initComponents() {
|
||||
add(new DSVHeader("dsvHeader"));
|
||||
|
||||
ITab kerberos = new AbstractTab(Model.of("Kerberos")) {
|
||||
@Override
|
||||
public Panel getPanel(String panelId) {
|
||||
return new LoginPanel(panelId, true, "ThesisJaasUser");
|
||||
}
|
||||
};
|
||||
ITab external = new AbstractTab(Model.of("External")) {
|
||||
@Override
|
||||
public Panel getPanel(String panelId) {
|
||||
return new LoginPanel(panelId, true, "ThesisJaasExternalUser");
|
||||
}
|
||||
};
|
||||
add(new AjaxTabbedPanel("loginChoice", Arrays.asList(kerberos, external)));
|
||||
|
||||
add(new Label("displayName", getShibbolethDisplayName()) {
|
||||
@Override
|
||||
protected void onConfigure() {
|
||||
setVisibilityAllowed(!StringUtils.isEmpty(getDefaultModelObjectAsString()));
|
||||
}
|
||||
});
|
||||
|
||||
add(new BookmarkablePageLink<Void>("sso", Shibboleth.class));
|
||||
|
||||
add(new FooterPanel("footerPanel"));
|
||||
}
|
||||
|
||||
private boolean hasShibbolethSession() {
|
||||
String shibbolethSession = getHeader("Shib-Session-ID");
|
||||
return !StringUtils.isEmpty(shibbolethSession);
|
||||
}
|
||||
|
||||
private String getShibbolethDisplayName() {
|
||||
return getHeader("displayName");
|
||||
}
|
||||
|
||||
private String getHeader(String header) {
|
||||
return getWebRequestCycle().getWebRequest().getHttpServletRequest().getHeader(header);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta wicket:id="refresh" http-equiv="refresh" content="1;url=" />
|
||||
</head>
|
||||
<body>
|
||||
<h2>Initializing SSO...</h2>
|
||||
<iframe wicket:id="shibboleth" src="[Wicket generated]" style="visibility: hidden;"></iframe>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,27 @@
|
||||
package se.su.dsv.scipro.loginlogout.pages;
|
||||
|
||||
import org.apache.wicket.MarkupContainer;
|
||||
import org.apache.wicket.PageParameters;
|
||||
import org.apache.wicket.behavior.SimpleAttributeModifier;
|
||||
import org.apache.wicket.markup.html.WebMarkupContainer;
|
||||
import org.apache.wicket.markup.html.WebPage;
|
||||
import se.su.dsv.scipro.SciProSession;
|
||||
import se.su.dsv.scipro.security.auth.Authorization;
|
||||
|
||||
/**
|
||||
* @author Andreas Svanberg <andreass@dsv.su.se>
|
||||
* @version 1/16/13
|
||||
*/
|
||||
@Authorization(requiresLoggedInUser = false)
|
||||
public class SSOInitializationPage extends WebPage {
|
||||
public SSOInitializationPage() {
|
||||
add(new WebMarkupContainer("shibboleth")
|
||||
.add(new SimpleAttributeModifier("src", urlFor(ShibbolethInitialization.class, PageParameters.NULL)))
|
||||
);
|
||||
add(new WebMarkupContainer("refresh")
|
||||
.add(new SimpleAttributeModifier("content", "1;url=" + urlFor(LoginPage.class, PageParameters.NULL)))
|
||||
);
|
||||
|
||||
SciProSession.get().setShibbolethInitialized(true);
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package se.su.dsv.scipro.loginlogout.pages;
|
||||
|
||||
import org.apache.wicket.markup.html.WebPage;
|
||||
import se.su.dsv.scipro.security.auth.Authorization;
|
||||
|
||||
/**
|
||||
* Page protected by Shibboleth for use in manual Shibboleth login.
|
||||
*
|
||||
* @author Andreas Svanberg <andreass@dsv.su.se>
|
||||
* @version 1/16/13
|
||||
*/
|
||||
@Authorization(requiresLoggedInUser = false)
|
||||
public class Shibboleth extends WebPage {
|
||||
public Shibboleth() {
|
||||
// Headers that might be interesting:
|
||||
// Shib-Session-ID - empty if no session (not logged in)
|
||||
// cn - complete name
|
||||
// sn - surname
|
||||
// givenName - given name
|
||||
// displayName - display name
|
||||
// eppn - email
|
||||
// o - possibly organization (e.g. Stockholm University)
|
||||
|
||||
if (!continueToOriginalDestination())
|
||||
setResponsePage(getApplication().getHomePage());
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package se.su.dsv.scipro.loginlogout.pages;
|
||||
|
||||
import org.apache.wicket.markup.html.WebPage;
|
||||
import se.su.dsv.scipro.security.auth.Authorization;
|
||||
|
||||
/**
|
||||
* Page protected
|
||||
*
|
||||
* @author Andreas Svanberg <andreass@dsv.su.se>
|
||||
* @version 1/16/13
|
||||
*/
|
||||
@Authorization(requiresLoggedInUser = false)
|
||||
public class ShibbolethInitialization extends WebPage {
|
||||
public ShibbolethInitialization() {
|
||||
// Headers that might be interesting:
|
||||
// Shib-Session-ID - empty if no session (not logged in)
|
||||
// cn - complete name
|
||||
// sn - surname
|
||||
// givenName - given name
|
||||
// displayName - display name
|
||||
// eppn - email
|
||||
// o - possibly organization (e.g. Stockholm University)
|
||||
}
|
||||
}
|
@ -18,10 +18,7 @@
|
||||
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
|
||||
<body>
|
||||
<wicket:panel>
|
||||
<span class="span12" wicket:id="feedback"></span>
|
||||
<div class="row-fluid">
|
||||
<div class="span11 offset1">
|
||||
<h2>Login</h2>
|
||||
<p wicket:id="feedback"></p>
|
||||
<p><wicket:message key="loginExplanation"/></p>
|
||||
<form wicket:id="signInForm">
|
||||
<table>
|
||||
@ -50,8 +47,6 @@
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</wicket:panel>
|
||||
</body>
|
||||
</html>
|
@ -27,11 +27,6 @@ import org.apache.wicket.model.PropertyModel;
|
||||
import org.apache.wicket.util.value.ValueMap;
|
||||
|
||||
import se.su.dsv.scipro.SciProSession;
|
||||
import sun.reflect.generics.tree.TypeSignature;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* Reusable user sign in panel with username and password as well as support for cookie persistence
|
||||
@ -123,9 +118,7 @@ public class LoginPanel extends Panel {
|
||||
public final void onSubmit() {
|
||||
try {
|
||||
if (signIn(getUsername(), getPassword())) {
|
||||
if (!continueToOriginalDestination()) {
|
||||
setResponsePage(getApplication().getHomePage());
|
||||
}
|
||||
onSignInSucceeded();
|
||||
} else {
|
||||
onSignInFailed();
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ public class IdeaEvent extends NotificationEvent {
|
||||
PARTNER_ACCEPT (SUPERVISOR | CREATOR),
|
||||
PARTNER_DECLINE (SUPERVISOR | CREATOR | CO_AUTHOR),
|
||||
ADDED_AS_PARTNER (CO_AUTHOR),
|
||||
PARTNER_TIMEOUT (0),
|
||||
PARTNER_TIMEOUT (SUPERVISOR | CREATOR),
|
||||
FIRST_MEETING (CREATOR | CO_AUTHOR),
|
||||
COURSE_START (0); // todo needs worker
|
||||
|
||||
|
@ -17,6 +17,7 @@ import se.su.dsv.scipro.data.dataobjects.Student;
|
||||
import se.su.dsv.scipro.match.dataobject.IdeaParticipation;
|
||||
import se.su.dsv.scipro.match.dataobject.Keyword;
|
||||
import se.su.dsv.scipro.match.dataobject.SupervisorIdea;
|
||||
import se.su.dsv.scipro.reusable.UserLabel;
|
||||
import se.su.dsv.scipro.util.DateFormatter;
|
||||
|
||||
public class ProjectIdeaDetailsPanel extends Panel {
|
||||
@ -96,7 +97,7 @@ public class ProjectIdeaDetailsPanel extends Panel {
|
||||
|
||||
@Override
|
||||
protected void populateItem(ListItem<Student> item) {
|
||||
item.add(new Label("authorName", item.getModelObject().getNameAsString()));
|
||||
item.add(UserLabel.create("authorName", item.getModel(), true));
|
||||
}
|
||||
};
|
||||
authorList.setVisible(showAuthors);
|
||||
|
@ -56,9 +56,6 @@
|
||||
|
||||
<wicket:container wicket:id="turnitin">
|
||||
<h6>Turnitin:</h6>
|
||||
<div wicket:id="error" class="info-box rounded-box">Link to plagiarism report can not be generated because of a
|
||||
Turnitin error. Try uploading the file to Turnitin via the web GU instead.
|
||||
</div>
|
||||
<a href="#" wicket:id="link">Analyse result of Turnitin antiplagiarism check</a>
|
||||
</wicket:container>
|
||||
|
||||
|
@ -85,7 +85,7 @@ public class SeminarPanel extends Panel {
|
||||
add(new SeminarCRUDPanel(CRUD, finalSeminarService, seminar) {
|
||||
@Override
|
||||
public boolean allowCreate() {
|
||||
return allowUpdate() && isAdmin();
|
||||
return allowUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -155,11 +155,12 @@ public class SeminarPanel extends Panel {
|
||||
protected void populateItem(final ListItem<FinalSeminarOpposition> item) {
|
||||
item.add(item.getModelObject().getUser().getDisplayComponent(SEMINAR_OPPOSITION, true));
|
||||
|
||||
item.add(new AjaxLink<Void>(SEMINAR_OPPOSITION_REMOVE) {
|
||||
item.add(new AjaxConfirmationLink<Void>(SEMINAR_OPPOSITION_REMOVE, SEMINAR_OPPOSITION_REMOVE_CONFIRMATION) {
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
seminar.getObject().getOppositions().remove(item.getModelObject());
|
||||
seminar.setObject(finalSeminarService.save(seminar.getObject()));
|
||||
FinalSeminar fs = finalSeminarService.findOne(seminar.getObject().getId());
|
||||
fs.getOppositions().remove(item.getModelObject());
|
||||
seminar.setObject(finalSeminarService.save(fs));
|
||||
target.addComponent(seminarContainer);
|
||||
}
|
||||
|
||||
@ -236,7 +237,7 @@ public class SeminarPanel extends Panel {
|
||||
@Override
|
||||
protected void onConfigure() {
|
||||
super.onConfigure();
|
||||
setVisibilityAllowed(seminar.getObject().getDocument() == null &&
|
||||
setVisibilityAllowed(seminar.getObject().getDocument() == null && studentService.findByUser(SciProSession.get().getUser())!=null &&
|
||||
seminar.getObject().getProject().getProjectParticipants().contains(studentService.findByUser(SciProSession.get().getUser())));
|
||||
}
|
||||
}.createDefaultWrapperPanel(THESIS_UPLOAD));
|
||||
@ -265,14 +266,6 @@ public class SeminarPanel extends Panel {
|
||||
}
|
||||
};
|
||||
|
||||
turnitin.add(new WebMarkupContainer(TURNITIN_ERROR) {
|
||||
@Override
|
||||
protected void onConfigure() {
|
||||
super.onConfigure();
|
||||
setVisibilityAllowed(turnitinService.findByFileDescription(seminar.getObject().getDocument()).isError());
|
||||
}
|
||||
});
|
||||
|
||||
Link<Void> link = new Link<Void>(TURNITIN_LINK) {
|
||||
@Override
|
||||
public void onClick() {
|
||||
@ -316,6 +309,7 @@ public class SeminarPanel extends Panel {
|
||||
static final String SEMINAR_OPPOSITION_REPORT_REMOVE = "remove";
|
||||
static final String SEMINAR_OPPOSITION_UPLOAD = "uploadForm";
|
||||
static final String SEMINAR_OPPOSITION_REMOVE = "removeOpposition";
|
||||
static final String SEMINAR_OPPOSITION_REMOVE_CONFIRMATION = "Are you sure you want to remove this opponent?";
|
||||
static final String SEMINAR_OPPOSITIONS = "oppositions";
|
||||
static final String SEMINAR_MAX_PARTICIPANTS = "maxParticipants";
|
||||
static final String SEMINAR_MAX_OPPOSITIONS = "maxOpponents";
|
||||
@ -328,6 +322,6 @@ public class SeminarPanel extends Panel {
|
||||
static final String THESIS_DOWNLOAD = "download";
|
||||
static final String THESIS_NAME = "name";
|
||||
static final String TURNITIN = "turnitin";
|
||||
static final String TURNITIN_ERROR = "error";
|
||||
static final String TURNITIN_LINK = "link";
|
||||
|
||||
}
|
||||
|
@ -588,6 +588,7 @@ public class NewIdeaServiceImpl extends AbstractQueryService<NewIdea, Long> impl
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly=false)
|
||||
public NewIdea partnerAcceptIdea(NewIdea idea, User coAuthor, NotificationSource source) {
|
||||
idea = partnerAcceptIdea(idea, coAuthor);
|
||||
|
||||
@ -598,12 +599,16 @@ public class NewIdeaServiceImpl extends AbstractQueryService<NewIdea, Long> impl
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkForExpiredParticipation(NewIdea idea, int confirmationDays) {
|
||||
public void checkForExpiredParticipation(NewIdea idea, int confirmationDays, NotificationSource source) {
|
||||
Date expirationDate = new DateTime().minusDays(confirmationDays).toDate();
|
||||
for (NewIdeaParticipation ip : idea.getNewIdeaParticipations()) {
|
||||
if (!ip.isConfirmed() && ip.getDateCreated().compareTo(expirationDate) < 0) {
|
||||
logger.info(ip.getStudent() + " did not confirm participation on idea: " + idea.getTitle() + ". Removing participant(s) from the idea");
|
||||
declineIdea(idea, ip.getStudent().getUser());
|
||||
// Do not pass the source along to declineIdea() since it is a PARTNER_TIMEOUT not a PARTNER_DECLINE
|
||||
source.setSource(ip.getStudent().getNameAsString());
|
||||
notificationController.notifyIdea(idea, IdeaEvent.Event.PARTNER_TIMEOUT, source);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ public interface NewIdeaService extends GenericService<NewIdea, Long>, QueryServ
|
||||
NewIdea declineIdea(NewIdea idea, User user, NotificationSource source);
|
||||
NewIdea partnerAcceptIdea(NewIdea idea, User coAuthor);
|
||||
NewIdea partnerAcceptIdea(NewIdea idea, User coAuthor, NotificationSource source);
|
||||
void checkForExpiredParticipation(NewIdea idea, int days);
|
||||
void checkForExpiredParticipation(NewIdea idea, int days, NotificationSource source);
|
||||
void changeSupervisor(NewIdea idea, Employee newSelection, User creator);
|
||||
void adminAddAuthors(NewIdea idea, SortedSet<Student> authors, User creator);
|
||||
|
||||
|
@ -6,7 +6,7 @@ import java.util.Iterator;
|
||||
public class StringUtil {
|
||||
|
||||
public static String toUpper(String string) {
|
||||
return string.substring(0, 1).toUpperCase() + string.substring(1);
|
||||
return string!=null?string.substring(0, 1).toUpperCase() + string.substring(1):null;
|
||||
}
|
||||
|
||||
public static String getFormattedString(Collection<?> objects) {
|
||||
|
@ -154,7 +154,7 @@ public class TurnitinComponent {
|
||||
* a more detailed response from turnitin and print that to screen though, e.g. you can compare the
|
||||
* md5 we generate locally to the one they generated etc.
|
||||
*/
|
||||
diagnostic = "1"; //diagnostic flag should be 1 when testing, 0 when production
|
||||
diagnostic = "0"; //diagnostic flag should be 1 when testing, 0 when production
|
||||
|
||||
uem = generalSystemSettings.getTurnItInUsername(); //user email
|
||||
ufn = generalSystemSettings.getTurnItInForname(); //user first name
|
||||
@ -302,8 +302,8 @@ public class TurnitinComponent {
|
||||
String fid = "5"; //fid 5 = upload file
|
||||
String fcmd = "2"; //1 = api redirects user to turnitin submission screen 2 = api returns xml with id
|
||||
|
||||
String pfn = userService.findOne(fd.getUserId()).getFirstName(); //author of paper’s first name (required)
|
||||
String pln = userService.findOne(fd.getUserId()).getLastName(); //author of paper’s last name (required)
|
||||
String pfn = "John";
|
||||
String pln = "Smith";
|
||||
String ptl = turnItInCheck.getHashAsUTF8String(); //title of paper to submit (required)
|
||||
|
||||
// pdata: paper in original format (required) THIS COMES LATER WHEN WE ACTUALLY MAKE THE REQUEST
|
||||
|
@ -7,8 +7,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
|
||||
import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
|
||||
import se.su.dsv.scipro.match.dataobject.NewIdea;
|
||||
import se.su.dsv.scipro.match.dataobject.NewMatch.Status;
|
||||
import se.su.dsv.scipro.notifications.dataobject.NotificationSource;
|
||||
import se.su.dsv.scipro.springdata.services.NewIdeaService;
|
||||
|
||||
@Component
|
||||
@ -28,9 +30,15 @@ public class ExpiredNewIdeaParticipationsWorker extends AbstractWorker {
|
||||
ideas.addAll(ideaService.findIdeas(Status.PENDING, null, false));
|
||||
if(!ideas.isEmpty()){
|
||||
logger.info("Found "+ideas.size()+" ideas");
|
||||
int confirmationDays = generalSystemSettingsDao.getGeneralSystemSettingsInstance().getConfirmationDays();
|
||||
GeneralSystemSettings systemSettings = generalSystemSettingsDao.getGeneralSystemSettingsInstance();
|
||||
int confirmationDays = systemSettings.getConfirmationDays();
|
||||
|
||||
String baseURL = systemSettings.getSciproURL();
|
||||
NotificationSource source = new NotificationSource();
|
||||
source.setSupervisorSource(baseURL + "supervisor/projectideas2");
|
||||
source.setUserSource(baseURL + "projectideas2");
|
||||
for(NewIdea idea : ideas) {
|
||||
ideaService.checkForExpiredParticipation(idea, confirmationDays);
|
||||
ideaService.checkForExpiredParticipation(idea, confirmationDays, source);
|
||||
}
|
||||
} else {
|
||||
logger.info("No supervisor ideas with unconfirmed participations ready to decline");
|
||||
|
@ -68,19 +68,14 @@ public class TurnItInCheckWorker extends AbstractWorker {
|
||||
}
|
||||
}
|
||||
for (TurnItInCheck tiic : turnItInCheckService.findAll()) {
|
||||
// if (tiic.getTurnItInId() == null && tiic.getFileDescription() != null && tiic.getFileDescription().getName() != null && !tiic.isError()) {
|
||||
if (tiic.getTurnItInId() == null && tiic.getFileDescription() != null && tiic.getFileDescription().getName() != null) { //removing isError to log errors so we can contact turnitin about why we sometimes get differering md5s from them
|
||||
if (tiic.getTurnItInId() == null && tiic.getFileDescription() != null && tiic.getFileDescription().getName() != null) {
|
||||
try {
|
||||
String returnValue = turnitinComponent.submitPaper(tiic);
|
||||
if (returnValue != null) {
|
||||
tiic.setTurnItInId(returnValue);
|
||||
tiic = turnItInCheckService.save(tiic);
|
||||
} else {
|
||||
/**
|
||||
* If is doesnt work, set error
|
||||
*/
|
||||
tiic.setError(true);
|
||||
tiic = turnItInCheckService.save(tiic);
|
||||
//do nothing, try again next worker
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.getLogger(TurnItInCheckWorker.class).error(e.getMessage());
|
||||
|
@ -40,6 +40,15 @@ Thank you! /maryam.ammouri@xlent.se, December 2012
|
||||
/*-line 175, a:hover{}, changed colour to #d95e00*/
|
||||
/* Lines 2154 2174, changed path to icons sprites*/
|
||||
|
||||
/*System notice********************************************************************************************************/
|
||||
|
||||
#system-notice {
|
||||
background-color: red;
|
||||
font-weight: bold;
|
||||
font: "Georgia", serif;
|
||||
font-size: 24px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/*Header****************************************************************************************************************/
|
||||
|
||||
@ -678,4 +687,31 @@ table a:hover, table a:hover span{
|
||||
|
||||
a.btn {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/*
|
||||
For wickets TabbedPanel
|
||||
*/
|
||||
div.tab-row ul {
|
||||
margin: 0;
|
||||
padding-left: 25px;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
div.tab-row li {
|
||||
margin: 0;
|
||||
padding: 10px;
|
||||
padding-bottom: 2px;
|
||||
list-style-type: none;
|
||||
display: inline;
|
||||
}
|
||||
div.tab-row li.selected {
|
||||
border: 1px solid black;
|
||||
border-radius: 7px 7px 0 0;
|
||||
border-bottom-color: transparent;
|
||||
background-color: white;
|
||||
padding: 9px;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
div.tab-row a {
|
||||
text-decoration: none;
|
||||
}
|
@ -23,22 +23,6 @@ public abstract class PageTest extends SciProTest {
|
||||
ctx.putBean("notificationService", mock(NotificationService.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void page_renders_login_if_required() {
|
||||
boolean requiresLogin = getPage().getAnnotation(Authorization.class).requiresLoggedInUser();
|
||||
setLoggedIn(false);
|
||||
|
||||
tester.startPage(getPage(), getPageParameters());
|
||||
tester.assertNoErrorMessage();
|
||||
|
||||
if (requiresLogin) {
|
||||
tester.assertRenderedPage(LoginPage.class);
|
||||
}
|
||||
else {
|
||||
tester.assertRenderedPage(getPage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void page_renders_when_logged_in() {
|
||||
setRoles(getRoles());
|
||||
@ -53,7 +37,7 @@ public abstract class PageTest extends SciProTest {
|
||||
}
|
||||
|
||||
protected PageParameters getPageParameters() {
|
||||
return null;
|
||||
return PageParameters.NULL;
|
||||
}
|
||||
|
||||
protected abstract Class<? extends Page> getPage();
|
||||
|
20
src/test/java/se/su/dsv/scipro/notifications/interfaces/impl/NotificationMailFormatterImplTest.java
20
src/test/java/se/su/dsv/scipro/notifications/interfaces/impl/NotificationMailFormatterImplTest.java
@ -1,7 +1,6 @@
|
||||
package se.su.dsv.scipro.notifications.interfaces.impl;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import se.su.dsv.scipro.data.dataobjects.Employee;
|
||||
import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
|
||||
@ -37,7 +36,7 @@ public class NotificationMailFormatterImplTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("How do you test a formatting utility class?")
|
||||
//@Ignore("How do you test a formatting utility class?")
|
||||
public void testFormat() throws Exception {
|
||||
Project project = ObjectMother._Project.create(1L);
|
||||
Employee supervisor = new Employee();
|
||||
@ -51,10 +50,16 @@ public class NotificationMailFormatterImplTest {
|
||||
notification.setNotificationEvent(event);
|
||||
|
||||
NotificationMail mail = formatter.format(notification);
|
||||
|
||||
// Simply here so we can see how the mail gets formatted and that no exception is thrown
|
||||
System.out.println("Subject: " + mail.getSubject());
|
||||
System.out.println("Content:\n" + mail.getContent());
|
||||
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("How do you test a formatting utility class?")
|
||||
//@Ignore("How do you test a formatting utility class?")
|
||||
public void testCompile() throws Exception {
|
||||
Project project = ObjectMother._Project.create(1L);
|
||||
ProjectEvent event = new ProjectEvent();
|
||||
@ -65,8 +70,11 @@ public class NotificationMailFormatterImplTest {
|
||||
Collection<Notification> notificationCollection = Arrays.asList(notification, notification);
|
||||
|
||||
NotificationMail mail = formatter.compile(notificationCollection);
|
||||
for (Notification n : notificationCollection) {
|
||||
assertTrue(mail.getContent().contains(n.getTitle()));
|
||||
}
|
||||
|
||||
// Simply here so we can see how the mail gets formatted and that no exception is thrown
|
||||
System.out.println("Subject: " + mail.getSubject());
|
||||
System.out.println("Content:\n" + mail.getContent());
|
||||
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package se.su.dsv.scipro.springdata.serviceimpls;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
@ -137,6 +138,7 @@ public class NewMatchServiceImplTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("Since authors cant see the supervisor there is no idea to notify about it, test ignored since functionality is disabled for now")
|
||||
public void testAddNewMatchNotifiesSupervisorChange() throws Exception {
|
||||
// given
|
||||
Employee newSupervisor = DomainObjects.injectId(new Employee(), 987L);
|
||||
|
@ -61,6 +61,9 @@ public class ObjectMother {
|
||||
project.setHeadSupervisor(headSupervisor);
|
||||
|
||||
User author1 = get_with_id(new User(), 2L);
|
||||
author1.setFirstName("Kalle");
|
||||
author1.setLastName("Testare");
|
||||
author1.setEmailAddress("kalle@dsv.su.se");
|
||||
Student student1 = new Student();
|
||||
student1.setUser(author1);
|
||||
User author2 = get_with_id(new User(), 3L);
|
||||
|
Loading…
x
Reference in New Issue
Block a user