Soumission article : apres erreur de validation, les auteurs secondaires ne se remplissent pas

Corriger le texte du main
Faire le lien admin
Corriger page warning quand log sans conf selectionée
Corriger anglais dans conference list et passer à un tick au lieu d'un ? (apres creation user)
Notification email (presque fini - a tester)
=> article accepté
=> article refusé
Comment : c'est "for author" et pas "of author"
Afficher le menu addConference quand l'utilisateur a le droit (dés qu'il est loggé)
Accueil : choose a conference a remplacer par register
This commit is contained in:
2008-02-25 07:18:37 +00:00
parent 6a7919a57f
commit ec8d2c4d18
8 changed files with 112 additions and 39 deletions

View File

@@ -1,3 +1,7 @@
download.dir.path=../server/default/data/uploadedFiles/ download.dir.path=../server/default/data/uploadedFiles/
mailService.fromEmailAddress=system@yacos.dreamhosters.com mailService.fromEmailAddress=system@yacos.dreamhosters.com
mailService.replyToEmailAddress=no-reply@yacos.dreamhosters.com mailService.replyToEmailAddress=no-reply@yacos.dreamhosters.com
mailService.host=smtp.univ-lille1.fr
mailService.username=
mailService.password=
mailService.port=25

View File

@@ -17,12 +17,13 @@ home.author.txt=Simple ! With Yacos you can take a look on all open conferences
home.referee=I am a program committee member. How Yacos can help me ? home.referee=I am a program committee member. How Yacos can help me ?
home.referee.txt=If you are the chairman, a PC member or simply a referee, thanks to yacos you can follow articles posted by authors.<br />As chairman, you can dispatch articles to your members for review and rating, manage your conference, the deadlines...<br />As the PC member or referee, you can review an article, post your comments and rate it, express your preference toward the submitted articles,... home.referee.txt=If you are the chairman, a PC member or simply a referee, thanks to yacos you can follow articles posted by authors.<br />As chairman, you can dispatch articles to your members for review and rating, manage your conference, the deadlines...<br />As the PC member or referee, you can review an article, post your comments and rate it, express your preference toward the submitted articles,...
home.youknow=So now you know... home.youknow=So now you know...
home.link.choose=Choose one conference home.link.choose=Browse the conferences
home.link.register=Create an account
home.link.userBoard=Go to your dashboard home.link.userBoard=Go to your dashboard
connected.noconference.title=No conference selected connected.noconference.title=No conference selected
connected.noconference.warning=You must choose a conference to access all your features : connected.noconference.warning=You must choose a conference to access all your features :
connected.noconference.warning=Or you can see a recap of your current involvement in the conferences available in the system : connected.noconference.warning.userBoard=Or you can see a recap of your current involvement in the conferences available in the system :
article.post.noconference=You must choose a conference before post or edit an article. article.post.noconference=You must choose a conference before post or edit an article.
conference.detail.description=Description conference.detail.description=Description
@@ -67,6 +68,9 @@ menu.general.title=Main
menu.general.userBoard=User Board menu.general.userBoard=User Board
menu.general.confInfo=Conference's informations menu.general.confInfo=Conference's informations
menu.admin.title=Administrator
menu.admin.manageUsers=Manage users
menu.chairman.title=Chairman menu.chairman.title=Chairman
menu.chairman.conference.create=Create new conference menu.chairman.conference.create=Create new conference
menu.chairman.conference.modify=Modify this conference menu.chairman.conference.modify=Modify this conference
@@ -129,8 +133,8 @@ form.label.linkPage=opening session page
form.field.account=Your account form.field.account=Your account
form.field.personal=Personal details form.field.personal=Personal details
form.field.necessary=* Required informations form.field.necessary=* Required informations
message.account.validate=Account created successfully. You can now connect at this. message.account.validate=Account created successfully. You can now use the system.
message.account.maj=Your account was indeed updated. message.account.maj=Your account was successfully updated.
form.edit.title=Edit your account form.edit.title=Edit your account
form.edit.txt=Access and edit all your personal informations. form.edit.txt=Access and edit all your personal informations.
@@ -250,10 +254,10 @@ conference.error.noTokenLeft=You have no conference creation token left !\nPleas
evaluation.title=You are evaluating evaluation.title=You are evaluating
evaluation.commentPCMember=Comment of PC Member evaluation.commentPCMember=Comment for PC Member
evaluation.commentAuthor=Comment of author evaluation.commentAuthor=Comment for author
evaluation.headPage=Report of the evaluation evaluation.headPage=Report of the evaluation
evaluation.titleArticle=The title of article is evaluation.titleArticle=The title of this article is
evaluation.note=The note for the criterion evaluation.note=The note for the criterion
evaluation.thisArticle=evaluate this article evaluation.thisArticle=evaluate this article
evaluation.choose=Choose an article to evaluate evaluation.choose=Choose an article to evaluate
@@ -265,7 +269,7 @@ invitation.send=Send an invitation
ConflictList.list1=Members of the conference ConflictList.list1=Members of the conference
ConflictList.list2=ConflictList of the article ConflictList.list2=ConflictList of the article
ConflictList.choose=manage the conflict list of the conference's articles ConflictList.choose=manage the conflict list of the conference's articles
ConflictList.help=Click to an article to edit the conclict list ConflictList.help=Click to an article to edit the conflict list
#DispatchMembers #DispatchMembers
members.list1=Members of the conference members.list1=Members of the conference
@@ -277,7 +281,7 @@ disptachArticle.help=Click to an article to dispatch the members
#DelegateArticles #DelegateArticles
delegateArticles.choose=delegate the articles between to the referees delegateArticles.choose=delegate the articles between to the referees
delegateArticles.list1= referees of the conference delegateArticles.list1= referees of the conference
delegateArticles.list2= referees aassociate to the article delegateArticles.list2= referees associated to this article
delegateArticles.help=Click to an article to delegate it to the referees delegateArticles.help=Click to an article to delegate it to the referees
#valider les articles #valider les articles

View File

@@ -8,11 +8,6 @@
<div id="mainmenu"> <div id="mainmenu">
<!-- On affiche les menus seulement si une conference est deja active -->
<c:if test="${currentConferenceId != null}">
<!-- MENU : ROLE_USER for general option --> <!-- MENU : ROLE_USER for general option -->
<authz:authorize ifAllGranted="ROLE_USER"> <authz:authorize ifAllGranted="ROLE_USER">
<div class="mainmenubloc"> <div class="mainmenubloc">
@@ -27,6 +22,17 @@
</authz:authorize> </authz:authorize>
<!-- MENU : ROLE_ADMIN -->
<authz:authorize ifAllGranted="ROLE_ADMIN">
<div class="mainmenubloc">
<h4><fmt:message key="menu.admin.title" /></h4>
<ul>
<li><a href="<c:url value="admin.htm"/>"><fmt:message key="menu.admin.manageUsers" /></a></li>
</ul>
<div class="footer"></div>
</div>
</authz:authorize>
<!-- MENU : CHAIRMAN --> <!-- MENU : CHAIRMAN -->
<authz:authorize ifAnyGranted="ROLE_CHAIRMAN,ROLE_CONFERENCE_CREATOR"> <authz:authorize ifAnyGranted="ROLE_CHAIRMAN,ROLE_CONFERENCE_CREATOR">
<div class="mainmenubloc"> <div class="mainmenubloc">
@@ -35,12 +41,14 @@
<authz:authorize ifAllGranted="ROLE_CONFERENCE_CREATOR"> <authz:authorize ifAllGranted="ROLE_CONFERENCE_CREATOR">
<li><a href="<c:url value="addConference.htm"/>"><fmt:message key="menu.chairman.conference.create" /></a></li> <li><a href="<c:url value="addConference.htm"/>"><fmt:message key="menu.chairman.conference.create" /></a></li>
</authz:authorize> </authz:authorize>
<authz:authorize ifAllGranted="ROLE_CHAIRMAN">
<li><a href="<c:url value="addConference.htm?action=modify"/>"><fmt:message key="menu.chairman.conference.modify" /></a></li> <li><a href="<c:url value="addConference.htm?action=modify"/>"><fmt:message key="menu.chairman.conference.modify" /></a></li>
<li><a href="<c:url value="listArticle.htm"/>"><fmt:message key="menu.chairman.article.list" /></a></li> <li><a href="<c:url value="listArticle.htm"/>"><fmt:message key="menu.chairman.article.list" /></a></li>
<li><a href="<c:url value="dispatchArticle.htm"/>"><fmt:message key="menu.chairman.article.dispatch" /></a></li> <li><a href="<c:url value="dispatchArticle.htm"/>"><fmt:message key="menu.chairman.article.dispatch" /></a></li>
<li><a href="<c:url value="validateArticle.htm"/>"><fmt:message key="menu.chairman.article.validate" /></a></li> <li><a href="<c:url value="validateArticle.htm"/>"><fmt:message key="menu.chairman.article.validate" /></a></li>
<li><a href="<c:url value="conflictList.htm"/>"><fmt:message key="menu.chairman.article.conflict" /></a></li> <li><a href="<c:url value="conflictList.htm"/>"><fmt:message key="menu.chairman.article.conflict" /></a></li>
<li><a href="<c:url value="forum.htm?role=chairman"/>"><fmt:message key="menu.chairman.article.discussion" /></a></li> <li><a href="<c:url value="forum.htm?role=chairman"/>"><fmt:message key="menu.chairman.article.discussion" /></a></li>
</authz:authorize>
</ul> </ul>
<div class="footer"></div> <div class="footer"></div>
</div> </div>
@@ -96,9 +104,6 @@
</div> </div>
</authz:authorize> </authz:authorize>
</c:if>
</div><!--mainmenu--> </div><!--mainmenu-->
</body> </body>

View File

@@ -57,7 +57,7 @@
<h4 class="title">Conference's list</h4> <h4 class="title">Conference's list</h4>
<c:if test="${ac != null}"> <c:if test="${ac != null}">
<p class="formHelp"> <p class="formOk">
<c:choose> <c:choose>
<c:when test="${ac == 2}"><fmt:message key="message.account.validate" /></c:when> <c:when test="${ac == 2}"><fmt:message key="message.account.validate" /></c:when>
<c:when test="${ac == 1}"><fmt:message key="message.account.maj" /></c:when> <c:when test="${ac == 1}"><fmt:message key="message.account.maj" /></c:when>

View File

@@ -106,7 +106,13 @@
<h3 class="subtitle"><fmt:message key="home.referee" /></h3> <h3 class="subtitle"><fmt:message key="home.referee" /></h3>
<p><fmt:message key="home.referee.txt" /></p> <p><fmt:message key="home.referee.txt" /></p>
<h3 class="subtitle"><fmt:message key="home.youknow" />&nbsp;<a href="<c:url value="listConference.htm"/>" class="register_link"><fmt:message key="home.link.choose" /> !</a></h3> <h3 class="subtitle"><fmt:message key="home.youknow" />&nbsp;</h3>
<p>
<a href="<c:url value="listConference.htm"/>" class="register_link"><fmt:message key="home.link.choose" /></a>
</p>
<p>
<a href="<c:url value="registerUser.htm"/>" class="register_link"><fmt:message key="home.link.register" /></a>
</p>
</authz:authorize> </authz:authorize>
</c:otherwise> </c:otherwise>

View File

@@ -233,7 +233,8 @@
<property name="userManager" ref="userManager" /> <property name="userManager" ref="userManager" />
<property name="evaluationManager" ref="evaluationManager" /> <property name="evaluationManager" ref="evaluationManager" />
<property name="validator" ref="ConferenceValidator" /> <property name="validator" ref="ConferenceValidator" />
</bean> </bean>
<bean id="ReportConfCreateController" <bean id="ReportConfCreateController"
class="org.yacos.web.chairman.controller.ReportConfCreateController"> class="org.yacos.web.chairman.controller.ReportConfCreateController">
<property name="conferenceManager" ref="conferenceManager" /> <property name="conferenceManager" ref="conferenceManager" />
@@ -376,7 +377,10 @@
</bean> </bean>
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.univ-lille1.fr"/> <property name="host" value="${mailService.host}"/>
<property name="username" value="${mailService.username}"/>
<property name="password" value="${mailService.password}"/>
<property name="port" value="${mailService.port}"/>
</bean> </bean>
<bean id="mailSenderService" <bean id="mailSenderService"

View File

@@ -15,6 +15,11 @@ import org.springframework.web.servlet.view.RedirectView;
import org.yacos.core.article.Article; import org.yacos.core.article.Article;
import org.yacos.core.article.IArticleManager; import org.yacos.core.article.IArticleManager;
import org.yacos.core.article.Article.State; import org.yacos.core.article.Article.State;
import org.yacos.core.conferences.Conference;
import org.yacos.core.users.User;
import org.yacos.web.system.controller.MailSenderService;
import org.yacos.web.system.session.SessionService;
import org.yacos.web.system.session.YACOSUtils;
public class ValidateOrRejectController extends SimpleFormController { public class ValidateOrRejectController extends SimpleFormController {
@@ -37,12 +42,33 @@ public class ValidateOrRejectController extends SimpleFormController {
throw new ModelAndViewDefiningException(new ModelAndView("404error")); throw new ModelAndViewDefiningException(new ModelAndView("404error"));
String value = request.getParameter("value"); String value = request.getParameter("value");
Conference conf = SessionService.getInstance().getCurrentConference();
String userLogin = a.getMainAuthor().getLogin();
User author = SessionService.getInstance().getUserManager().getUser(userLogin);
if (value.equals("valide")) { if (value.equals("valide")) {
a.setState(State.ACCEPTED); a.setState(State.ACCEPTED);
// Sending email
String mailSubject = "YACOS : Your article has been accepted";
String mailBody = "Your article entitled "+a.getTitle();
mailBody += " has been accepted by the program committee.\n";
mailBody += "It's content will be featured on the program of the upcoming conference :\n";
mailBody += conf.getTitle()+"\n";
mailBody += "Please mark on your calendar the dates for this conference :";
mailBody += "Starts on "+conf.getDateStart()+" and ends on "+conf.getDateEnd()+"\n";
mailBody += "Thank you for your participation.\n";
MailSenderService.getInstance().sendEMail(author.getEmail(), mailSubject, mailBody);
} }
else if (value.equals("reject")) { else if (value.equals("reject")) {
a.setState(State.REJECTED); a.setState(State.REJECTED);
// Sending email
String mailSubject = "YACOS : Your submission has been declined";
String mailBody = "Your article entitled "+a.getTitle();
mailBody += " has not been accepted by the program committee.\n";
mailBody += "You can view the comments leaved by the evaluators on your personnal space :\n";
mailBody += YACOSUtils.fullURL("userBoard.htm")+"\n";
mailBody += "Thank you for your participation.\n";
MailSenderService.getInstance().sendEMail(author.getEmail(), mailSubject, mailBody);
} }
else else
throw new ModelAndViewDefiningException(new ModelAndView("404error")); throw new ModelAndViewDefiningException(new ModelAndView("404error"));

View File

@@ -57,13 +57,16 @@ public class SArticleController extends SimpleFormController {
} }
String action = request.getParameter("action"); String action = request.getParameter("action");
// We're creating a new article, in opposition of modifying one
if (action == null || action.equals("")) if (action == null || action.equals(""))
{ {
// Try to save the file
String nomFile=""; String nomFile="";
try { try {
MultipartFile file = ((FormSubmission) command).getFile(); MultipartFile file = ((FormSubmission) command).getFile();
// No file
if (file == null || file.isEmpty()) { if (file == null || file.isEmpty()) {
errors.rejectValue("file", "form.submitArticle.noFile"); errors.rejectValue("file", "form.submitArticle.noFile");
try { try {
@@ -73,7 +76,7 @@ public class SArticleController extends SimpleFormController {
} }
} }
else { else {
// Checking the extension
String extension = file.getOriginalFilename().substring(file.getOriginalFilename().length() - 4).toLowerCase(); String extension = file.getOriginalFilename().substring(file.getOriginalFilename().length() - 4).toLowerCase();
logger.info("The file extension is: " + extension); logger.info("The file extension is: " + extension);
@@ -123,11 +126,12 @@ public class SArticleController extends SimpleFormController {
} }
} }
// Creates the article // Actually creates the article
Article newArticle = articleManager.addArticle( Article newArticle = articleManager.addArticle(
title, theme, abstractText, nomFile, user.getLogin(), title, theme, abstractText, nomFile, user.getLogin(),
listSecondaryAuthor, Article.State.SUBMITED, conf.getId()); listSecondaryAuthor, Article.State.SUBMITED, conf.getId());
// We had a persistence error, stop and return
if(newArticle==null){ if(newArticle==null){
errors.reject("article.errors.didNotSave"); errors.reject("article.errors.didNotSave");
try { try {
@@ -138,17 +142,21 @@ public class SArticleController extends SimpleFormController {
} }
byte b[] = file.getBytes(); byte b[] = file.getBytes();
// Create the file name
String path = "conference"+conf.getId()+"/"; String path = "conference"+conf.getId()+"/";
// Ensure we have the correct file hierarchy
(new File(downloadDirPath+path)).mkdirs(); (new File(downloadDirPath+path)).mkdirs();
// Complete the path so it is valid, relative to the JBoss working dir
path += newArticle.getId()+"_"+file.getOriginalFilename(); path += newArticle.getId()+"_"+file.getOriginalFilename();
// Create the actual output file
File uploadedFile = new File(downloadDirPath+path); File uploadedFile = new File(downloadDirPath+path);
// Write the data
FileOutputStream fos = new FileOutputStream(uploadedFile); FileOutputStream fos = new FileOutputStream(uploadedFile);
fos.write(b); fos.write(b);
fos.close(); fos.close();
// Save the file URL in the database, now it's saved
newArticle.setURL_article(path); newArticle.setURL_article(path);
articleManager.updateArticle(newArticle); articleManager.updateArticle(newArticle);
} }
@@ -163,20 +171,28 @@ public class SArticleController extends SimpleFormController {
// The role author might have been added, refresh the credentials // The role author might have been added, refresh the credentials
SessionService.getInstance().refreshAuthentication(); SessionService.getInstance().refreshAuthentication();
} }
// Case of a modification of an existing article
else if (action.equals("modify")) { else if (action.equals("modify")) {
String articleID = request.getParameter("articleID"); String articleID = request.getParameter("articleID");
try { try {
Integer id = new Integer(articleID); Integer id = new Integer(articleID);
// TODO : v<>rifier que l'id de l'article appartient <20> l'auteur... vive les GET...
Article old = articleManager.getArticle(id); Article old = articleManager.getArticle(id);
// In case of an error, we want the secondary authors to be filled on the page
request.setAttribute("listSecondaryAuthors", old.getSecondaryAuthors());
old.setTitle(title); old.setTitle(title);
old.setTopic(theme); old.setTopic(theme);
old.setSecondaryAuthors(listSecondaryAuthor); old.setSecondaryAuthors(listSecondaryAuthor);
old.setAbstractText(abstractText); old.setAbstractText(abstractText);
// Check that the user owns this article
String login = SessionService.getInstance().getCurrentUserLogin();
if(! old.getMainAuthor().getLogin().equals(login)){
// Throw a denied page
throw new ModelAndViewDefiningException(new ModelAndView("denied"));
}
MultipartFile file = ((FormSubmission) command).getFile(); MultipartFile file = ((FormSubmission) command).getFile();
if (file == null || file.isEmpty()) { if (file == null || file.isEmpty()) {
articleManager.updateArticle(old); articleManager.updateArticle(old);
@@ -269,6 +285,11 @@ public class SArticleController extends SimpleFormController {
// date verification // date verification
Conference conf = SessionService.getInstance().getCurrentConference(); Conference conf = SessionService.getInstance().getCurrentConference();
if(conf == null){
throw new ModelAndViewDefiningException(new ModelAndView("main"));
}
if(conf.getDateArticle().before(new Date())){ if(conf.getDateArticle().before(new Date())){
throw new ModelAndViewDefiningException(new ModelAndView("main","end","submission")); throw new ModelAndViewDefiningException(new ModelAndView("main","end","submission"));
} }
@@ -286,22 +307,25 @@ public class SArticleController extends SimpleFormController {
try { try {
Integer id = new Integer(articleID); Integer id = new Integer(articleID);
// TODO : v<>rifier que l'id de l'article appartient <20> l'auteur... vive les GET...
Article a = articleManager.getArticle(id); Article a = articleManager.getArticle(id);
if (a == null) if (a == null)
throw new ModelAndViewDefiningException(new ModelAndView("denied", "message", getMessageSourceAccessor().getMessage("submission.modify.denied"))); throw new ModelAndViewDefiningException(new ModelAndView("denied", "message", getMessageSourceAccessor().getMessage("submission.modify.denied")));
// Check that the user owns this article
String login = SessionService.getInstance().getCurrentUserLogin();
if(! a.getMainAuthor().getLogin().equals(login)){
throw new ModelAndViewDefiningException(new ModelAndView("denied"));
}
FormSubmission myArticle = new FormSubmission(); FormSubmission myArticle = new FormSubmission();
myArticle.setAbstractText(a.getAbstractText()); myArticle.setAbstractText(a.getAbstractText());
myArticle.setTitle(a.getTitle()); myArticle.setTitle(a.getTitle());
//myArticle.setListe(a.getSecondaryAuthors()); //myArticle.setListe(a.getSecondaryAuthors());
myArticle.setTheme(a.getTopic()); myArticle.setTheme(a.getTopic());
request.getSession().setAttribute("listSecondaryAuthors", a.getSecondaryAuthors()); request.setAttribute("listSecondaryAuthors", a.getSecondaryAuthors());
return myArticle; return myArticle;
} }