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 0c03a098ff..0d2252d6d8 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 @@ -6,11 +6,10 @@ import org.apache.wicket.markup.html.form.upload.FileUpload; import se.su.dsv.scipro.data.dataobjects.FinalSeminar; import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.repository.util.FileStorageException; public interface FinalSeminarUploadController extends IClusterable { - void deleteSeminarFilesRecursive(FinalSeminar seminar); - void deleteOpponentFiles(FinalSeminarOpposition opp); /** @@ -20,6 +19,15 @@ public interface FinalSeminarUploadController extends IClusterable { * @throws Exception */ FinalSeminar deleteSeminarReport(FinalSeminar seminar) throws Exception; + + /** + * Delete the upload report for the seminar, adminOverrideMode = true means no intentional exceptions will be thrown + * @param seminar + * @param adminOverrideMode + * @return + * @throws Exception + */ + FinalSeminar deleteSeminarReport(FinalSeminar seminar, boolean adminOverrideMode) throws Exception; void storeSeminarDocument(FileUpload upload, User uploader, FinalSeminar seminar) throws Exception; 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 c010bb8378..866dbc8ce7 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 @@ -78,17 +78,9 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr } private void delete(String path) { - fileRepository.delete(path); } - public void deleteSeminarFilesRecursive(final FinalSeminar seminar) throws FileStorageException { - if (seminar.getDocument() != null) { - //delete(getRepositorySeminarPath(seminar)); Use of deprecated path/method - delete(seminar.getDocument().getPath()); - } - } - public void deleteOpponentFiles(final FinalSeminarOpposition opp) throws FileStorageException { if (opp.getOpponentReport() != null) { //delete(getRepositoryOppositionPath(opp)); Use of deprecated path/method @@ -103,18 +95,31 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr * @return * @throws Exception */ - public FinalSeminar deleteSeminarReport(FinalSeminar seminar) throws Exception { + public FinalSeminar deleteSeminarReport(FinalSeminar seminar) throws Exception{ + return deleteSeminarReport(seminar, false); + } + /** + * Delete the upload report for the seminar, adminOverrideMode = true means no intentional exceptions will be thrown + * @param seminar + * @param adminOverrideMode + * @return + * @throws Exception + */ + public FinalSeminar deleteSeminarReport(FinalSeminar seminar, boolean adminOverrideMode) throws Exception { seminar = finalSeminarDao.reLoad(seminar); - if (!seminar.getOppositions().isEmpty() || !seminar.getActiveParticipations().isEmpty()) { - throw new Exception( - "Cannot delete seminar report, seminar has opponents or active participants"); + if( !adminOverrideMode ){ + if (!seminar.getOppositions().isEmpty() || !seminar.getActiveParticipations().isEmpty()) { + throw new Exception( + "Cannot delete seminar report, seminar has opponents or active participants"); + } } for (CheckPlagiarismEvent cpe : checkPlagiarismEventDao.getWithFileDescription(seminar .getDocument())) { checkPlagiarismEventDao.delete(cpe); } - - fileRepository.delete(seminar.getDocument().getPath()); + if(seminar.getDocument() != null) + if(seminar.getDocument().getPath() != null) + fileRepository.delete(seminar.getDocument().getPath()); seminar.setDocument(null); return finalSeminarDao.save(seminar); } diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.html b/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.html index 4dd16f9bd7..9df136e249 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.html +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.html @@ -2,78 +2,73 @@ <html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> <body> - <wicket:panel> - <div wicket:id="titleContainer"> - <strong>Project Title: </strong> <span wicket:id="projectTitle"></span> - <div> - <strong>Room: </strong> <span wicket:id="room"></span> - </div> - </div> - <div class="append-bottom"> - <div> - <strong>Head supervisor:</strong> - </div> - <span wicket:id="headSupervisor"></span> - </div> - <div> - <strong>Author(s): </strong> - <ul class="no-list-style"> - <li wicket:id="authorsList"><span wicket:id="author"></span></li> - </ul> - </div> +<wicket:panel> + <div wicket:id="feedback"></div> + <div wicket:id="titleContainer"><strong>Project Title: </strong> + <span wicket:id="projectTitle"></span> + <div><strong>Room: </strong> <span wicket:id="room"></span></div> + </div> + <div class="append-bottom"> + <div><strong>Head supervisor:</strong></div> + <span wicket:id="headSupervisor"></span></div> + <div><strong>Author(s): </strong> + <ul class="no-list-style"> + <li wicket:id="authorsList"><span wicket:id="author"></span></li> + </ul> + </div> - <div> - <strong>Co-supervisor(s): </strong> - <ul class="no-list-style"> - <li wicket:id="coSupervisorsList"><span - wicket:id="coSupervisor"></span></li> - </ul> - </div> + <div><strong>Co-supervisor(s): </strong> + <ul class="no-list-style"> + <li wicket:id="coSupervisorsList"><span wicket:id="coSupervisor"></span></li> + </ul> + </div> - <div> - <strong>Reviewer(s): </strong> - <ul class="no-list-style"> - <li wicket:id="reviewersList"><span wicket:id="reviewer"></span> - </li> - </ul> - </div> + <div><strong>Reviewer(s): </strong> + <ul class="no-list-style"> + <li wicket:id="reviewersList"><span wicket:id="reviewer"></span> + </li> + </ul> + </div> - <div wicket:id="detailsContainer"> - <div> - <strong>Opponent(s): </strong> - <ul class="no-list-style"> - <li wicket:id="opponentsList"><span wicket:id="opponent"></span> - </li> - </ul> - </div> - - <div> - <strong>Active participant(s): </strong> - <ul class="no-list-style"> - <li wicket:id="activeParticipantsList"><span - wicket:id="activeParticipant"></span></li> - </ul> - </div> - <div> - <strong>Presentation Language: </strong> - <div wicket:id="seminarLanguage"></div> - </div> - <div> - <strong>Thesis/Report Language: </strong> - <div wicket:id="thesisLanguage"></div> - </div> - - <strong>Thesis/Report: </strong> - <div> - <span wicket:id="seminarReportTitle"></span> <span - wicket:id="uploadInfoContainer"> <a href="#" - wicket:id="open"><img - src="images/icons/document-preview_16x16.png" alt="Open/Preview" /> - </a> <a href="#" wicket:id="download"><img - src="images/icons/download_16x16.png" alt="Download" /> </a> </span> - </div> + <div wicket:id="detailsContainer"> + <div><strong>Opponent(s): </strong> + <ul class="no-list-style"> + <li wicket:id="opponentsList"><span wicket:id="opponent"></span> + <div wicket:id="oppositionContainer"><strong>Report:</strong> <span wicket:id="oppositionReportTitle"></span> <a href="#" + wicket:id="open"><img + src="images/icons/document-preview_16x16.png" alt="Open/Preview" /> + </a> <a href="#" wicket:id="download"><img + src="images/icons/download_16x16.png" alt="Download" /> </a> <a href="#" + wicket:id="deleteOppositionReport"><img + src="images/icons/delete_16x16.png" alt="delete" /> </a> </div> - </wicket:panel> + </li> + </ul> + </div> + + <div><strong>Active participant(s): </strong> + <ul class="no-list-style"> + <li wicket:id="activeParticipantsList"><span + wicket:id="activeParticipant"></span></li> + </ul> + </div> + <div><strong>Presentation Language: </strong> + <div wicket:id="seminarLanguage"></div> + </div> + <div><strong>Thesis/Report Language: </strong> + <div wicket:id="thesisLanguage"></div> + </div> + + <strong>Thesis/Report: </strong> + <div><span wicket:id="seminarReportTitle"></span> <span + wicket:id="uploadInfoContainer"> <a href="#" wicket:id="open"><img + src="images/icons/document-preview_16x16.png" alt="Open/Preview" /> </a> + <a href="#" wicket:id="download"><img + src="images/icons/download_16x16.png" alt="Download" /> </a> <a href="#" + wicket:id="deleteSeminarReport"><img + src="images/icons/delete_16x16.png" alt="delete" /> </a> </span></div> + </div> +</wicket:panel> </body> </html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java index 172fa064a5..1e307a63dc 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java @@ -3,16 +3,21 @@ package se.su.dsv.scipro.opponent.panels; import java.util.ArrayList; import java.util.List; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.EmptyPanel; +import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; +import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; +import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao; import se.su.dsv.scipro.data.dataobjects.FinalSeminar; import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation; import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; @@ -23,6 +28,9 @@ import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles; import se.su.dsv.scipro.repository.components.FileDownloadLink; import se.su.dsv.scipro.repository.components.FileOpenLink; +import se.su.dsv.scipro.security.auth.MetaDataActionStrategy; +import se.su.dsv.scipro.security.auth.roles.Roles; +import se.su.dsv.scipro.util.JavascriptEventConfirmation; public class FinalSeminarDetailsPanel extends Panel { @@ -30,11 +38,15 @@ public class FinalSeminarDetailsPanel extends Panel { @SpringBean private FinalSeminarDao finalSeminarDao; + @SpringBean + private FinalSeminarOppositionDao finalSeminarOppositionDao; + @SpringBean + private FinalSeminarUploadController finalSeminarUploadController; - public FinalSeminarDetailsPanel(final String id, final FinalSeminar seminar2, - final boolean details) { + public FinalSeminarDetailsPanel(final String id, final FinalSeminar seminar2, final boolean details) { super(id); - + this.setOutputMarkupId(true); + add(new FeedbackPanel("feedback")); final FinalSeminar seminar = finalSeminarDao.reLoad(seminar2); final Project project = seminar.getProject(); WebMarkupContainer titleContainer = new WebMarkupContainer("titleContainer") { @@ -53,8 +65,7 @@ public class FinalSeminarDetailsPanel extends Panel { }); titleContainer.add(new Label("room", seminar.getRoom())); add(titleContainer); - add(new ListView<Student>("authorsList", new ArrayList<Student>( - project.getProjectParticipants())) { + add(new ListView<Student>("authorsList", new ArrayList<Student>(project.getProjectParticipants())) { private static final long serialVersionUID = 1L; @Override @@ -111,41 +122,76 @@ public class FinalSeminarDetailsPanel extends Panel { }; - detailsContainer.add(new ListView<FinalSeminarOpposition>("opponentsList", seminar - .getOppositions()) { + detailsContainer.add(new ListView<FinalSeminarOpposition>("opponentsList", seminar.getOppositions()) { private static final long serialVersionUID = 1L; @Override - protected void populateItem(ListItem<FinalSeminarOpposition> item) { - item.add(item.getModelObject().getOpponent().getUser() - .getDisplayComponent("opponent", true)); + protected void populateItem(final ListItem<FinalSeminarOpposition> item) { + item.add(item.getModelObject().getOpponent().getUser().getDisplayComponent("opponent", true)); + WebMarkupContainer oppCon = new WebMarkupContainer("oppositionContainer"){ + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return item.getModelObject().getOpponentReport() != null; + } + }; + MetaDataActionStrategy.authorize(oppCon, Roles.ADMIN); + item.add(oppCon); + + String reportTitle = ""; + if(item.getModelObject().getOpponentReport() != null) + reportTitle = item.getModelObject().getOpponentReport().getName(); + oppCon.add(new Label("oppositionReportTitle", reportTitle)); + + oppCon.add(new FileDownloadLink("download", item.getModelObject().getOpponentReport())); + oppCon.add(new FileOpenLink("open", item.getModelObject().getOpponentReport())); + oppCon.add(new AjaxLink<Void>("deleteOppositionReport"){ + private static final long serialVersionUID = 1L; + { //Extra safeguard should someone later decide that the surrounding container should be visible to all + MetaDataActionStrategy.authorize(this, Roles.ADMIN); + this.add(new JavascriptEventConfirmation("onclick", "Do you really want to delete this user-uploaded report?")); + } + + @Override + public void onClick(AjaxRequestTarget target) { + try{ + finalSeminarUploadController.deleteOpponentFiles(item.getModelObject()); + FinalSeminarOpposition opp = item.getModelObject(); + opp.setOpponentReport(null); + opp = finalSeminarOppositionDao.save(opp); + item.setModelObject(opp); + info("Opposition report deleted"); + } catch(Exception e){ + e.printStackTrace(); + error("Something went wrong, see log files for stacktrace"); + } + target.addComponent(FinalSeminarDetailsPanel.this); + } + }); add(item); } }); - detailsContainer.add(new ListView<FinalSeminarActiveParticipation>( - "activeParticipantsList", seminar.getActiveParticipations()) { + detailsContainer.add(new ListView<FinalSeminarActiveParticipation>("activeParticipantsList", seminar.getActiveParticipations()) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<FinalSeminarActiveParticipation> item) { - item.add(item.getModelObject().getUser() - .getDisplayComponent("activeParticipant", true)); + item.add(item.getModelObject().getUser().getDisplayComponent("activeParticipant", true)); add(item); } }); - detailsContainer.add(new Label("seminarLanguage", seminar.getPresentationLanguage() - .toString())); + detailsContainer.add(new Label("seminarLanguage", seminar.getPresentationLanguage().toString())); detailsContainer.add(new Label("thesisLanguage", seminar.getReportLanguage().toString())); detailsContainer.add(new Label("seminarReportTitle", new Model<String>() { private static final long serialVersionUID = 1L; @Override public String getObject() { - return seminar.getDocument() == null ? "No thesis/report uploaded" : seminar - .getDocument().getName(); + return seminar.getDocument() == null ? "No thesis/report uploaded" : seminar.getDocument().getName(); } })); @@ -161,6 +207,27 @@ public class FinalSeminarDetailsPanel extends Panel { uploadInfoContainer.add(new FileDownloadLink("download", seminar.getDocument())); uploadInfoContainer.add(new FileOpenLink("open", seminar.getDocument())); + uploadInfoContainer.add(new AjaxLink<Void>("deleteSeminarReport") { + private static final long serialVersionUID = 1L; + { + MetaDataActionStrategy.authorize(this, Roles.ADMIN); + this.add(new JavascriptEventConfirmation("onclick", "Do you really want to delete this user-uploaded report?")); + } + + @Override + public void onClick(AjaxRequestTarget target) { + try { + finalSeminarUploadController.deleteSeminarReport(seminar, true); + seminar.setDocument(null); //Only to repaint the ajax call without the document icons + info("Report deleted"); + } catch (Exception e) { + e.printStackTrace(); + error("Deletion failed"); + } + target.addComponent(FinalSeminarDetailsPanel.this); + } + }); + detailsContainer.add(uploadInfoContainer); add(detailsContainer); diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html index e1b8c0eed1..acc47fd40b 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html @@ -5,6 +5,7 @@ <wicket:panel> <div class="span-22 prepend-top last"> + <div wicket:id="feedback"></div> <table class="rounded-table seminar-table even-rows"> <tr> <th>Date</th> 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 2132c6d34b..b8bca3392b 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 @@ -47,8 +47,8 @@ import se.su.dsv.scipro.opponent.models.OpponentModel; public class OpponentListViewPanel extends Panel { /** - * - */ + * + */ private static final long serialVersionUID = 4988253889884804250L; @SpringBean @@ -76,6 +76,10 @@ public class OpponentListViewPanel extends Panel { super(id); this.adminView = adminView; loadListView(seminarList); + feedbackPanel = new FeedbackPanel("feedback"); + add(feedbackPanel); + this.setOutputMarkupId(true); + editSeminarDialogContainer = new WebMarkupContainer("dialogContainer"); editSeminarDialog = new Dialog("dialog"); editSeminarDialog.setModal(true); @@ -96,7 +100,7 @@ public class OpponentListViewPanel extends Panel { add(contactsSeminarDialog); contactsDialogContainer.setOutputMarkupId(true); contactsDialogContainer.add(contactsSeminarForm = new ContactsSeminarForm( - "contactsSeminarForm")); + "contactsSeminarForm")); contactsSeminarForm.setOutputMarkupId(true); add(linkListView); @@ -125,7 +129,7 @@ public class OpponentListViewPanel extends Panel { User headSupervisor = seminar.getProject().getHeadSupervisor().getUser(); headSupervisorString += headSupervisor.getFirstName() + " " - + headSupervisor.getLastName(); + + headSupervisor.getLastName(); item.add(new Label("headSupervisor", headSupervisorString)); item.add(new Label("projectClass", seminar.getProject().getProjectClass().getName())); @@ -191,20 +195,25 @@ public class OpponentListViewPanel extends Panel { @Override public void onClick(AjaxRequestTarget target) { FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar); - seminarUploadController.deleteSeminarFilesRecursive(seminar2); - for (FinalSeminarActiveParticipation al : seminar2 - .getActiveParticipations()) { - finalSeminarActiveParticipationDao.delete(al); - } + try{ + seminarUploadController.deleteSeminarReport(seminar2, true); + for (FinalSeminarActiveParticipation al : seminar2 + .getActiveParticipations()) { + finalSeminarActiveParticipationDao.delete(al); + } - for (FinalSeminarOpposition fso : seminar2 - .getOppositions()) { - seminarUploadController.deleteOpponentFiles(fso); - finalSeminarOppositionDao.delete(fso); + for (FinalSeminarOpposition fso : seminar2 + .getOppositions()) { + seminarUploadController.deleteOpponentFiles(fso); + finalSeminarOppositionDao.delete(fso); + } + finalSeminarDao.delete(seminar2); + info("Final seminar deleted"); + } catch (Exception e){ + error("Something went wrong, see logs for stacktrace"); + e.printStackTrace(); } - finalSeminarDao.delete(seminar2); - setResponsePage(AdminFinalSeminarPage.class); - + target.addComponent(OpponentListViewPanel.this); } @Override @@ -227,7 +236,7 @@ public class OpponentListViewPanel extends Panel { @Override public CharSequence decorateScript(CharSequence script) { String ret = "if(!confirm('The attendees of this seminar will NOT be notified that the seminar has been deleted, are you sure you wish to delete it?')) return false; " - + script; + + script; return ret; } }; @@ -243,8 +252,8 @@ public class OpponentListViewPanel extends Panel { private class EditSeminarForm extends Form<OpponentModel> { /** - * - */ + * + */ private static final long serialVersionUID = -5004827722926732419L; public EditSeminarForm(String name) { @@ -257,8 +266,8 @@ public class OpponentListViewPanel extends Panel { private class EditForm extends Form<Void> { /** - * - */ + * + */ private static final long serialVersionUID = 5882957818616996808L; public EditForm(String name, final FinalSeminar seminar) { @@ -290,8 +299,8 @@ public class OpponentListViewPanel extends Panel { private class ContactsSeminarForm extends Form<OpponentModel> { /** - * - */ + * + */ private static final long serialVersionUID = -5004827722926732419L; public ContactsSeminarForm(String name) { @@ -306,8 +315,8 @@ public class OpponentListViewPanel extends Panel { private class ContactsForm extends Form<Void> { /** - * - */ + * + */ private static final long serialVersionUID = -8271761600388217566L; public ContactsForm(String name, final FinalSeminar seminar) { @@ -316,8 +325,8 @@ public class OpponentListViewPanel extends Panel { add(new AjaxButton("contacts", new Model<String>("Details")) { /** - * - */ + * + */ private static final long serialVersionUID = 1211337464815824507L; @Override