From 43c2e13dc3c16eeb729ef9a26bc2ef40a47f7384 Mon Sep 17 00:00:00 2001
From: Fredrik Norberg <fnorbe@dsv.su.se>
Date: Wed, 27 Jul 2011 17:20:13 +0200
Subject: [PATCH 01/14] added the 4th option to traffic lights

---
 .../checklists/panels/TrafficLightPanel.java     |   4 ++++
 .../se/su/dsv/scipro/data/enums/StateOfMind.java |   3 ++-
 src/main/webapp/images/icons/grey_ball_32.png    | Bin 0 -> 1081 bytes
 3 files changed, 6 insertions(+), 1 deletion(-)
 create mode 100644 src/main/webapp/images/icons/grey_ball_32.png

diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java
index 1aa44102c5..51082c7eb6 100644
--- a/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java
+++ b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java
@@ -64,6 +64,10 @@ public class TrafficLightPanel extends Panel {
 					image = new StaticImage("image", new Model<String>(
 					"images/icons/yellow_ball_32.png"));
 				}
+				else if (stateOfMind.equals(StateOfMind.NOTAPLICABLE)) {
+					image = new StaticImage("image", new Model<String>(
+					"images/icons/grey_ball_32.png"));
+				}
 				item.add(image);
 			};
 		};
diff --git a/src/main/java/se/su/dsv/scipro/data/enums/StateOfMind.java b/src/main/java/se/su/dsv/scipro/data/enums/StateOfMind.java
index 85f0570407..67842eaf5b 100644
--- a/src/main/java/se/su/dsv/scipro/data/enums/StateOfMind.java
+++ b/src/main/java/se/su/dsv/scipro/data/enums/StateOfMind.java
@@ -10,7 +10,8 @@ package se.su.dsv.scipro.data.enums;
 public enum StateOfMind {
     NEEDHELP(0, "Need Help", "You think you need help to proceed or you are unsure of what to do next.", "som-needhelp"), 
     NEUTRAL(1, "Neutral", "This is the default option and signals that you don't have a clear standpoint on your status but no imminent help is needed.", "som-neutral"), 
-    FINE(2, "Everything is fine", "This means your work proceeds as planned and that no issues regarding the continuation are on the horizon.", "som-fine");
+    FINE(2, "Everything is fine", "This means your work proceeds as planned and that no issues regarding the continuation are on the horizon.", "som-fine"),
+    NOTAPLICABLE(3, "moo", "moo","som-moo");
 
     private int value;
     private String status;
diff --git a/src/main/webapp/images/icons/grey_ball_32.png b/src/main/webapp/images/icons/grey_ball_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9017f0aa57e508ee1854248ce8ab4877107c403
GIT binary patch
literal 1081
zcmV-91jhS`P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipf5
z4+;b6ue8qq00X&6L_t(o!_`;KYZOTo|8-4wM<<h=RmVvrhzHq=jE;<{5xj~2f=BTb
z7WV2vSlGKDd*6#kkNyvWcuI$`lMG%K7D9~UXf&u3GwH6b_E7b@s%vKQrJy!E>Z4!1
zkKe2Js>;LfIQF-&cJ>YcEMI>6__#8>!y2%#TECst1`j)1jSEOZhS*^U0R*vZ*1GG#
zR^|Tkl{Zhmi2=M@Ta3i~KiHk|kL23PPlEfKe?*O~N5?XNubityIMqXPx&o;u83R0K
zTKmf+Af;&mfB^{Jf8^Mnk6OLKp$%wvW*bZ1g${N?mMbp#hDbTnEh)?-kP1UIKOM_<
zw%%N7_PeewHb(jNC0ty~m6v=VJfX-B6$PQ0BML(EpXN$BYC9oY!o{_AXZHHO2=JA2
zmB>H;p`e@u+X&d9AOr|{8vzjmNv!%B2`)COb~p+fE0QxW$110mLg6vvoxKNAVR(d2
z6ORG$Q2pBpSrp8?1bV-Ygn)Nzi%9F$5#<EE3%flI9O&(Fpx2VYX}!w3wZ+j8{M$;f
zTlT?NQK{V?B?JV&-Nr-3bMmvm)s-MeU}3d>8@pvc_nv5+^25@kwE(bN_6Y?B0C8>b
zcOl&<#%}t#!fAXIBQ<Kn`rtus!0J}xe7<20E5zoda7^O0ozgXA?RE2v$$~wr;E*tT
zp*?oz0l?FH078k(B#>D~royz00V#mJzykorJF_<-U{Z!!&ndfK+lQk=0K7AM(}yn`
z#oB0jObhHWV`H*F2Qy<pD%E_(iY42X3jn@sFns6FhhW76LP|sSDd$O`1k-2QbDM|O
zNb6*DWfBhn2-am$v;Q<N$eE=ylf@(UYx{6?_(0U`KUJ!yVhItlLPevhR`QM4sov!f
zD!$o-N@ycM<5U#y3R6jz*MTdw?ndE2anE&^Y~i-xNxZg9jlku(&b!=z@ZI!ZxhLZm
zyJR1;sW7#EKck&X%856XKYyIV2mpAnaZl}RIqDIOMLa6lRbunF#z>VtJlME5{!X}Z
z=>zso|5CV$(V=5sNbGx|dm$m1$pPCy0GN9J5v>>1v3Ej_?RiYcDoCkNki|o_m|E(`
zL*uQ@XY&#dDW8rd$M*chOKH^V4cgiI4U~1NxbTyrgGe|b0)VnaJ6pfuUe8OoRzz}h
zZfBGC<7cme>RlwvQ=2Q*>60nS^F7ruPE=nCAWe(`GS$jO#_|8HsM&vhl!wV&gj4^0
zgNMn0WBa$L)qDMOJ<WcY$LT@n0Kh?B?)QBG3P9~LWaMsd00000NkvXXu0mjf3Bv$?

literal 0
HcmV?d00001


From 532b93f008d8bcaff78339d86b282fb8e219ef15 Mon Sep 17 00:00:00 2001
From: mpeters <mpeters@dsv.su.se>
Date: Thu, 28 Jul 2011 15:45:11 +0200
Subject: [PATCH 02/14] Fix of hiding of "Last 12 months" on peer portal page
 depending on what's currently visible

Change-Id: I6b0b25817373bacc2af8e3413fc432955b7d9f4a
---
 .../java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.html | 2 +-
 .../java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.java | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.html b/src/main/java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.html
index 721f5125e9..21fac7dd7d 100644
--- a/src/main/java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.html
+++ b/src/main/java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.html
@@ -89,7 +89,7 @@
 			<span class="box-title">Best rated reviewers</span>
 			<div wicket:id="bestRatedPanel" class="append-bottom"></div>
 		</div>
-		<div>
+		<div wicket:id="statsTimespanContainer">
 			<i><span class="small right">Last 12 months</span></i>
 		</div>
 	</div>
diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.java b/src/main/java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.java
index 3d70815e37..d4db753c68 100644
--- a/src/main/java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.java
+++ b/src/main/java/se/su/dsv/scipro/peer/panels/PeerPortalPanel.java
@@ -221,16 +221,23 @@ public class PeerPortalPanel extends Panel {
 		int displayedReviews = gsettings.getNumberOfLatestReviewsDisplayed();
 		
 		
+		boolean showStatsTimespan = false;
 		if(gsettings.isPeerDisplayNumberOfReviewsPerformed()){
 			add(new MostFrequentReviewersPanel(mostFrequentPanel));
+			showStatsTimespan = true;
 		} else {
 			add(new InvisiblePanel(mostFrequentPanel));
 		}
 		if( gsettings.isPeerRatingsEnabled() ){
 			add(new WebMarkupContainer(bestRatedContainer).add(new BestRatedReviewersPanel("bestRatedPanel") ) );
+			showStatsTimespan = true;
 		} else {
 			add(new InvisiblePanel(bestRatedContainer));
 		}
+		WebMarkupContainer statsTimespanContainer = new WebMarkupContainer("statsTimespanContainer");
+		statsTimespanContainer.setVisible(showStatsTimespan);
+		add(statsTimespanContainer);
+		
 		if(gsettings.isPeerDisplayLatestReviews()) {
 			// Checkbox on the AdminPeerSettingsPage is not visible since it's
 			// not decided what kind of info that should be public for students.

From 4bb3c8570776bc64a18b9f2d42fcbfea83887565 Mon Sep 17 00:00:00 2001
From: joha-asc <aschan.johan@gmail.com>
Date: Thu, 28 Jul 2011 15:47:19 +0200
Subject: [PATCH 03/14] test fix for board messages

---
 .../java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java
index abd9ebcab1..5203a6add4 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java
@@ -110,7 +110,7 @@ public class TestBoardMessageDaoJPA {
 		
 		messageBoard = new MessageBoard(presenterProject);	
 		messageBoard.setTitle("test");
-		messageBoard.getBoardMessages().add(boardMessage);
+		messageBoard.addToBoardMessages(boardMessage);
 		messageBoard = messageBoardDao.save(messageBoard);
 
 		

From 44c9b82b5aab7ab8c3058a0175574294e6d98080 Mon Sep 17 00:00:00 2001
From: Fredrik Norberg <fnorbe@dsv.su.se>
Date: Thu, 28 Jul 2011 15:53:56 +0200
Subject: [PATCH 04/14] changed trafficlightpanel to not use stateofmind

---
 .../admin/pages/AdminProjectPartnerPage.java  |  2 +-
 .../checklists/panels/TrafficLightPanel.html  | 45 ++++++++++++++----
 .../checklists/panels/TrafficLightPanel.java  | 46 +++++++++++--------
 .../su/dsv/scipro/data/enums/StateOfMind.java |  3 +-
 .../dsv/scipro/project/pages/ProjectPage.java |  1 +
 src/main/webapp/WEB-INF/web.xml               |  4 +-
 6 files changed, 68 insertions(+), 33 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/AdminProjectPartnerPage.java b/src/main/java/se/su/dsv/scipro/admin/pages/AdminProjectPartnerPage.java
index cc47dc9a00..9913aa204e 100644
--- a/src/main/java/se/su/dsv/scipro/admin/pages/AdminProjectPartnerPage.java
+++ b/src/main/java/se/su/dsv/scipro/admin/pages/AdminProjectPartnerPage.java
@@ -19,7 +19,7 @@ import se.su.dsv.scipro.security.auth.roles.Roles;
  *
  */
 
-@Authorization(authorizedRoles={Roles.SYSADMIN})
+@Authorization(authorizedRoles={Roles.SYSADMIN, Roles.ADMIN})
 public class AdminProjectPartnerPage extends AbstractAdminPage {
 	
 	@SpringBean
diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.html b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.html
index a235198823..5bc9e200e2 100644
--- a/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.html
+++ b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.html
@@ -6,16 +6,41 @@
 </head>
 <body>
 	<wicket:panel>
-		<div wicket:id="stateOfMindContainer">
-			<form wicket:id="form">
-				<table wicket:id="group">
-					<tr wicket:id="persons">
+		<div wicket:id="trafficLightContainer">
+			<div wicket:id="group">
+				<div wicket:id="lights">
+				<table >
+					<tr >
 						<td><input type="radio" wicket:id="radio" /></td>
-						<td> <img wicket:id="image"/></td>
-					</tr> 
-				</table>
-			</form>
-		</div>
+						<td><img wicket:id="image"/></td>
+						</tr> 
+						<tr>
+							
+						</tr>
+					</table>
+					</div>
+				</div>
+			</div>
 	</wicket:panel>
 </body>
-</html>
\ No newline at end of file
+</html>
+<!--
+<!DOCTYPE html>
+<html
+	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<head>
+<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
+</head>
+<body>
+	<wicket:panel>
+		<div wicket:id="trafficLightContainer">
+			<table wicket:id="group">
+				<tr wicket:id="lights">
+					<td><input type="radio" wicket:id="radio" /></td>
+					<td> <img wicket:id="image"/></td>
+					</tr> 
+				</table>
+			</div>
+	</wicket:panel>
+</body>
+</html> -->
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java
index 51082c7eb6..35bc079230 100644
--- a/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java
+++ b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java
@@ -1,5 +1,8 @@
 package se.su.dsv.scipro.checklists.panels;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -32,46 +35,53 @@ import edu.emory.mathcs.backport.java.util.Arrays;
  */
 
 public class TrafficLightPanel extends Panel {
-
+	
+	private List<TrafficLight> lights;
+	
+	enum TrafficLight{
+		GREEN, YELLOW, RED, NOT
+	}
 
 	private static final long serialVersionUID = 8862892008428526067L;
 
 
 	public TrafficLightPanel(String id, WebPage parent) {
 		super(id);
-		WebMarkupContainer stateOfMindContainer = new WebMarkupContainer(
-				"stateOfMindContainer");
-		add(stateOfMindContainer);
+		WebMarkupContainer trafficLightContainer = new WebMarkupContainer(
+				"trafficLightContainer");
+		add(trafficLightContainer);
+		lights = new ArrayList<TrafficLight>();
+		lights.add(TrafficLight.GREEN);lights.add(TrafficLight.YELLOW);lights.add(TrafficLight.RED);lights.add(TrafficLight.NOT);
+		RadioGroup<TrafficLight> group = new RadioGroup<TrafficLight>("group");
+		trafficLightContainer.add(group);
+		
 
-		Form<StateOfMind> f = new Form<StateOfMind>("form");
-		stateOfMindContainer.add(f);
-		RadioGroup<StateOfMind> group = new RadioGroup<StateOfMind>("group");
-		f.add(group);
+		ListView<TrafficLight> lightList = new ListView<TrafficLight>("lights", lights) {
+	
+			private static final long serialVersionUID = 1L;
 
-		ListView<StateOfMind> persons = new ListView<StateOfMind>("persons",
-				Arrays.asList(StateOfMind.values())) {
-			protected void populateItem(ListItem<StateOfMind> item) {
-				StateOfMind stateOfMind = item.getModelObject();
-				item.add(new Radio<StateOfMind>("radio", item.getModel()));
+			protected void populateItem(ListItem<TrafficLight> item) {
+				TrafficLight trafficLight = item.getModelObject();
+				item.add(new Radio<TrafficLight>("radio", item.getModel()));
 				StaticImage image = null;
-				if (stateOfMind.equals(StateOfMind.FINE)) {
+				if (trafficLight.equals(TrafficLight.GREEN)) {
 					image = new StaticImage("image", new Model<String>(
 							"images/icons/green_ball_32.png"));
-				} else if (stateOfMind.equals(StateOfMind.NEEDHELP)) {
+				} else if (trafficLight.equals(TrafficLight.YELLOW)) {
 					image = new StaticImage("image", new Model<String>(
 					"images/icons/red_ball_32.png"));
-				} else if (stateOfMind.equals(StateOfMind.NEUTRAL)) {
+				} else if (trafficLight.equals(TrafficLight.RED)) {
 					image = new StaticImage("image", new Model<String>(
 					"images/icons/yellow_ball_32.png"));
 				}
-				else if (stateOfMind.equals(StateOfMind.NOTAPLICABLE)) {
+				else if (trafficLight.equals(TrafficLight.NOT)) {
 					image = new StaticImage("image", new Model<String>(
 					"images/icons/grey_ball_32.png"));
 				}
 				item.add(image);
 			};
 		};
-		group.add(persons);
+		group.add(lightList);
 	}
 
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/enums/StateOfMind.java b/src/main/java/se/su/dsv/scipro/data/enums/StateOfMind.java
index 67842eaf5b..85f0570407 100644
--- a/src/main/java/se/su/dsv/scipro/data/enums/StateOfMind.java
+++ b/src/main/java/se/su/dsv/scipro/data/enums/StateOfMind.java
@@ -10,8 +10,7 @@ package se.su.dsv.scipro.data.enums;
 public enum StateOfMind {
     NEEDHELP(0, "Need Help", "You think you need help to proceed or you are unsure of what to do next.", "som-needhelp"), 
     NEUTRAL(1, "Neutral", "This is the default option and signals that you don't have a clear standpoint on your status but no imminent help is needed.", "som-neutral"), 
-    FINE(2, "Everything is fine", "This means your work proceeds as planned and that no issues regarding the continuation are on the horizon.", "som-fine"),
-    NOTAPLICABLE(3, "moo", "moo","som-moo");
+    FINE(2, "Everything is fine", "This means your work proceeds as planned and that no issues regarding the continuation are on the horizon.", "som-fine");
 
     private int value;
     private String status;
diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectPage.java b/src/main/java/se/su/dsv/scipro/project/pages/ProjectPage.java
index 9dacb4dea1..68ee7374f8 100644
--- a/src/main/java/se/su/dsv/scipro/project/pages/ProjectPage.java
+++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectPage.java
@@ -27,6 +27,7 @@ public abstract class ProjectPage extends MenuPage implements FilePanelContainer
 	public ProjectPage(PageParameters pp)  {
 		
 		Project activeProject = SciProSession.get().getActiveProject();
+		User u = SciProSession.get().getUser();
 		
 		if(activeProject == null && (this.getClass() != NoActiveProjectPage.class && this.getClass() != ProjectPartnerPage.class)){
 			User user = SciProSession.get().getUser();
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 7ea6274a27..54e9218c03 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -64,8 +64,8 @@
 		<!-- Use deployment for production, development for development -->
 	<context-param>
 		<param-name>configuration</param-name>
-<!-- 			<param-value>development</param-value> -->
-			<param-value>deployment</param-value>
+			<param-value>development</param-value> 
+			<!-- <param-value>deployment</param-value>-->
 	</context-param>
 	
 

From 8506215602c5295bd58fcc1ea205f4fb6aaebdc2 Mon Sep 17 00:00:00 2001
From: mpeters <mpeters@dsv.su.se>
Date: Thu, 28 Jul 2011 16:07:37 +0200
Subject: [PATCH 05/14] Spelling+comments

Change-Id: I51065466031338b116ab185722915bae1c45c5cc
---
 .../scipro/components/AbstractMenuPanel.java  | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/components/AbstractMenuPanel.java b/src/main/java/se/su/dsv/scipro/components/AbstractMenuPanel.java
index aa60f5e574..75f046c4e0 100644
--- a/src/main/java/se/su/dsv/scipro/components/AbstractMenuPanel.java
+++ b/src/main/java/se/su/dsv/scipro/components/AbstractMenuPanel.java
@@ -56,7 +56,7 @@ public abstract class AbstractMenuPanel extends Panel {
 			protected void populateItem( ListItem<MenuItem> item ) {
 				final MenuItem mi = item.getModelObject();
 				boolean highLightAsCurrentByInterface = false;
-				Class<?> menuItemInterface = mi.getMenuHilightInterface();
+				Class<?> menuItemInterface = mi.getMenuHighlightInterface();
 				if( menuItemInterface != null ){
 					for( Class<?> actualPageInterface : containerClass.getInterfaces() ){
 						if( actualPageInterface.equals(menuItemInterface) ){
@@ -72,7 +72,7 @@ public abstract class AbstractMenuPanel extends Panel {
 						&& 
 							mi.getTargetClass().getSuperclass() != menuContainerCommonSuperClass
 						)				
-					){
+				){
 					//item.setMarkupId("current"); 
 					//item.setOutputMarkupId(true);
 					//Replaced the above because it generates invalid markup if two menus are added to the same page (id no longer unique)
@@ -99,7 +99,8 @@ public abstract class AbstractMenuPanel extends Panel {
 	}
 	/**
 	 * May not rely on anything in the implementing class's constructor as this will not have been initialized yet.
-	 * Items are rendered from left to right as you might expect, first item in the list will be first tab item on the left.
+	 * Items are rendered from left to right (or top to bottom depending on type of menu) as you might expect,
+	 * the first item in the list will be the first menu item on the left/top.
 	 * @return
 	 */
 	protected abstract List<MenuItem> getItemList();
@@ -118,7 +119,7 @@ public abstract class AbstractMenuPanel extends Panel {
 		private Class<? extends Page> targetClass;
 		private PageParameters pp;
 		private String iconName;
-		private Class<? extends MenuHighlight> menuHilightInterface;
+		private Class<? extends MenuHighlight> menuHighlightInterface;
 		
 		public MenuItem(final String name, final Class<? extends Page> targetClass) {
 			this(name, targetClass, null, null, null);
@@ -148,7 +149,7 @@ public abstract class AbstractMenuPanel extends Panel {
 		public MenuItem(final String name, final Class<? extends Page> targetClass, final Class<? extends MenuHighlight> menuHilightInterface, PageParameters pp, String iconName) {
 			this.name = name;
 			this.targetClass = targetClass;
-			this.menuHilightInterface = menuHilightInterface;
+			this.menuHighlightInterface = menuHilightInterface;
 			this.pp = pp;
 			this.iconName = iconName == null ? ImageIcon.ICON_EMPTY : iconName;
 		}
@@ -169,13 +170,13 @@ public abstract class AbstractMenuPanel extends Panel {
 			return iconName;
 		}
 
-		public MenuItem setMenuHilightInterface(Class<? extends MenuHighlight> menuHilightInterface) {
-			this.menuHilightInterface = menuHilightInterface;
+		public MenuItem setMenuHighlightInterface(Class<? extends MenuHighlight> menuHighlightInterface) {
+			this.menuHighlightInterface = menuHighlightInterface;
 			return this;
 		}
 
-		public Class<? extends MenuHighlight> getMenuHilightInterface() {
-			return menuHilightInterface;
+		public Class<? extends MenuHighlight> getMenuHighlightInterface() {
+			return menuHighlightInterface;
 		}
 
 		

From deab4f9271521ce2332c4686cb20368b4e2d05f9 Mon Sep 17 00:00:00 2001
From: mpeters <mpeters@dsv.su.se>
Date: Thu, 28 Jul 2011 16:36:50 +0200
Subject: [PATCH 06/14] Fix of broken ui-logic, was impossible to create new
 final seminar (unless there was one already)

Change-Id: Ia190765d0df29c0e730653e724b80e6018522b89
---
 .../panels/ProjectFinalSeminarContainerPanel.java   | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarContainerPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarContainerPanel.java
index 8a7fa59e52..adcd3edf62 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarContainerPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarContainerPanel.java
@@ -23,22 +23,15 @@ public class ProjectFinalSeminarContainerPanel extends Panel {
 	public ProjectFinalSeminarContainerPanel(final String id, final Project project, final boolean isSupervisorView){
 		super(id);
 		
-		final List<FinalSeminar> seminars = finalSeminarDao.findFinalSeminarsByProject(project);
+		List<FinalSeminar> seminars = finalSeminarDao.findFinalSeminarsByProject(project);
 		
-		if(isSupervisorView && !seminars.isEmpty() ){
+		if(isSupervisorView && seminars.isEmpty() ){
 			add(new OpponentPanel("addSeminar", project));
 		}
 		else {
 			add(new EmptyPanel("addSeminar"));
 		}
-		add(new Label("noSeminarsMessage", "No final seminar has been created for this project"){
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isVisible(){
-				return seminars.size() == 0;
-			}
-		});
+		add(new Label("noSeminarsMessage", "No final seminar has been created for this project").setVisible(seminars.isEmpty()));
 
 		add(new ListView<FinalSeminar>("seminarList", seminars){
 			private static final long serialVersionUID = 1L;

From 42f49be0a4699d2f6bff9be1cf27ea7a63937cab Mon Sep 17 00:00:00 2001
From: mpeters <mpeters@dsv.su.se>
Date: Thu, 28 Jul 2011 16:51:51 +0200
Subject: [PATCH 07/14] Fix of menu label

Change-Id: I5532e492381c36671c1bb1a6d1043715eb7b8dff
---
 .../se/su/dsv/scipro/admin/pages/AbstractAdminSettingsPage.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/AbstractAdminSettingsPage.java b/src/main/java/se/su/dsv/scipro/admin/pages/AbstractAdminSettingsPage.java
index c78d650e5e..54746f2ca4 100644
--- a/src/main/java/se/su/dsv/scipro/admin/pages/AbstractAdminSettingsPage.java
+++ b/src/main/java/se/su/dsv/scipro/admin/pages/AbstractAdminSettingsPage.java
@@ -34,7 +34,7 @@ public abstract class AbstractAdminSettingsPage extends AbstractAdminPage {
 				items.add(new MenuItem("Server Environment", AdminServerEnvironmentSettingsPage.class));
 				items.add(new MenuItem("Final seminar general settings", AdminFinalSeminarSettingsPage.class));
 				items.add(new MenuItem("Final seminar project level settings", AdminFinalSeminarSettingsPerProjectClassPage.class));
-				items.add(new MenuItem("Level settings", AdminPeerSettingsPage.class));
+				items.add(new MenuItem("Peer portal settings", AdminPeerSettingsPage.class));
 				items.add(new MenuItem("Edit levels", AdminProjectClassSettingsPage.class));
 
 				return items;

From 242f93fe2cf7ef86f0e6776062bad3120a9ae8be Mon Sep 17 00:00:00 2001
From: Fredrik Norberg <fnorbe@dsv.su.se>
Date: Thu, 28 Jul 2011 17:14:22 +0200
Subject: [PATCH 08/14] fixed test failure

---
 src/main/webapp/WEB-INF/web.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 54e9218c03..d1b02a7ae0 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -64,8 +64,8 @@
 		<!-- Use deployment for production, development for development -->
 	<context-param>
 		<param-name>configuration</param-name>
-			<param-value>development</param-value> 
-			<!-- <param-value>deployment</param-value>-->
+			<!--<param-value>development</param-value> -->
+			 <param-value>deployment</param-value>
 	</context-param>
 	
 

From 7fda6144a7b48983ed371ce1877040c42ead9baf Mon Sep 17 00:00:00 2001
From: mpeters <mpeters@dsv.su.se>
Date: Thu, 28 Jul 2011 17:32:27 +0200
Subject: [PATCH 09/14] Removal of old incorrectly added javascript code

Change-Id: I8e6930381d1b83e44795fe3cdfd38534bd09d4f5
---
 src/main/java/se/su/dsv/scipro/basepages/BasePage.html | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/basepages/BasePage.html b/src/main/java/se/su/dsv/scipro/basepages/BasePage.html
index a29f83d2cd..c9cbc78e51 100644
--- a/src/main/java/se/su/dsv/scipro/basepages/BasePage.html
+++ b/src/main/java/se/su/dsv/scipro/basepages/BasePage.html
@@ -25,10 +25,6 @@
 <link href='http://fonts.googleapis.com/css?family=Ubuntu:regular,bold' rel='stylesheet' type='text/css' /> -->
 <!--<link rel="stylesheet" href="css/scipro.css" media="screen,projection" />-->
 
-<!-- <link type="text/css" href="css/smoothness/jquery-ui-1.8.10.custom.css" rel="stylesheet" />
-  <script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
-  <script type="text/javascript" src="js/jquery-ui-1.8.10.custom.min.js"></script> -->
-
 <script type="text/javascript">
 
   var _gaq = _gaq || [];

From ea71229867ce9970e9fc73dff2b83482ba0341af Mon Sep 17 00:00:00 2001
From: mpeters <mpeters@dsv.su.se>
Date: Fri, 29 Jul 2011 10:04:41 +0200
Subject: [PATCH 10/14] Bugfix

Change-Id: Idd844e32c98e973b30e0f1dd7bc72bb5f63e0b52
---
 .../su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 aaa19fdec7..1f5223261e 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
@@ -221,7 +221,7 @@ public class ProjectFinalSeminarPanel extends Panel {
 			public boolean isVisible() {
 
 				return !isSupervisorView && seminar.getActiveParticipations().isEmpty()
-						&& seminar.getOppositions().isEmpty() && seminar.getTurnitinId() != null;
+						&& seminar.getOppositions().isEmpty() && seminar.getTurnitinId() == null;
 			}
 
 			@Override

From 45b238d7fe0b86f71c33b4e36cf35a89077eb5df Mon Sep 17 00:00:00 2001
From: joha-asc <aschan.johan@gmail.com>
Date: Fri, 29 Jul 2011 10:23:51 +0200
Subject: [PATCH 11/14] removed system out println

Change-Id: Ib8c29b473ec14538ef04f7bf2455ea0214cef60f
---
 .../se/su/dsv/scipro/conference/panels/ConferencePanel.java   | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

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 cf5a5225ff..083e4f8b85 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
@@ -92,10 +92,8 @@ public class ConferencePanel extends Panel {
 		webMarkupContainer.setOutputMarkupId(true);
 		webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView));
 		add(webMarkupContainer);
-		if (boardMessageModel != null) {
-			
+		if (boardMessageModel != null) {		
 			int index = boardMessageDao.getBoardMessageSortOrderIndex(boardMessageModel.getObject());
-			System.out.println(index);
 			dataView.setCurrentPage(index/BOARDMESSAGESPERPAGE);
 		}
 	}

From 04e4810d681fd311de0a3ea3ea22d8816801affa Mon Sep 17 00:00:00 2001
From: mpeters <mpeters@dsv.su.se>
Date: Fri, 29 Jul 2011 10:25:20 +0200
Subject: [PATCH 12/14] Removal of unused css file

Change-Id: I92c0fab31151c74194f027d01f9b25a84ddb9396
---
 src/main/webapp/styles/global.css | 230 ------------------------------
 1 file changed, 230 deletions(-)
 delete mode 100644 src/main/webapp/styles/global.css

diff --git a/src/main/webapp/styles/global.css b/src/main/webapp/styles/global.css
deleted file mode 100644
index f310472cf1..0000000000
--- a/src/main/webapp/styles/global.css
+++ /dev/null
@@ -1,230 +0,0 @@
-@CHARSET "UTF-8";
-
-html, body {
-	font-family: Calibri, Tahoma, Verdana, sans-serif;
-	margin: 0 0 0 0;
-	padding: 0 0 0 0;
-	font-size: 0.94em;
-	line-height: 1.5em;
-	padding-top: 30px;
-}
-
-h1, h2, h3 {
-	font-family: Cambria, Tahoma, Verdana, sans-serif;
-}
-
-#container {
-	width: 960px;
-	margin: auto;
-}
-
-#ajax-loader {
-	z-index:9999;
-	position: fixed;
-	top: 0;
-	left: 0;
-	width: 80px;
-	height: 30px;
-	background-color: #FFFF80;
-	border-bottom: 1px solid black;
-	border-right: 1px solid black;		
-}
-
-#veil {
-	opacity:0.3;
-	filter:alpha(opacity=50);
-	position:absolute;
-	width: 100%;
-	height: 100%;
-	z-index:9998;
-	background-color: white;
-}
-
-#veil-loader {
-	z-index:9999;
-	position: absolute;
-	top: 30%;
-	left: 45%;
-	width: 100px;
-	height: 100px;
-	background: url(../images/ajax-loader.gif) center no-repeat;	
-}
-
-p.inline {
-	display: inline;	
-}
-
-.connectedSortable {
-	cursor: move;	
-}
-
-.float-right {
-	float:right;
-}
-
-.float-left {
-	float:left;	
-}
-
-td.icon,
-span.icon {
-	padding-left: 20px;
-	line-height: 20px; /* To center the text vertically with the icon */
-}
-
-span.floating-icon {
-	width: 20px;
-	height: 20px;
-}
-
-td.icon-button,
-span.icon-button {
-	cursor: pointer;	
-}
-
-td.icon-user,
-span.icon-user { /*The background image*/
-	background: url(../images/user.png) no-repeat left center;
-}
-
-td.icon-project,
-span.icon-project { /*The background image*/
-	background: url(../images/project.png) no-repeat left center;
-}
-
-td.icon-arrowDown,
-span.icon-arrowDown {
-	background: url(../images/icons/arrow-down.png) no-repeat left center;	
-}
-
-td.icon-plus,
-span.icon-plus {
-	background: url(../images/icons/add.gif) no-repeat left center;
-}
-
-td.icon-minus,
-span.icon-minus {
-	background: url(../images/icons/minus.gif) no-repeat left center;
-}
-
-td.icon-check,
-span.icon-check {
-	background: url(../images/icons/circle-check.png) no-repeat left center;
-}
-
-td.icon-pencil,
-span.icon-pencil { /*The background image*/
-	background: url(../images/icons/pencil.png) no-repeat left center;
-}
-
-td.icon-delete,
-span.icon-delete { /*The background image*/
-	background: url(../images/icons/circle-delete.png) no-repeat left center;
-}
-
-td.icon-zoom-in,
-span.icon-zoom-in { /*The background image*/
-	background: url(../images/icons/zoom-in.png) no-repeat left center;
-}
-
-.bordered-box {
-	border: 1px solid #CCE6FF;
-	padding: 0.5em 0.5em;
-}
-
-.float-left {
-	float: left;
-}
-
-.float-right {
-	float: right;
-}
-
-.boxContent {
-	margin: 0.5em 0.5em;
-}
-
-.boxContent h4 {
-	border: 1px solid #0099CC;
-	background-color: #CCE6FF;
-	padding: 0.3em 0.3em;
-}
-
-.dashboardBox {
-	border: 1px solid #3300CC;
-	width: 50em;
-	min-height: 10em;
-}
-
-.dashboardBox h3 {
-	border-bottom: 1px solid #3300CC;
-	background-color: blue;
-	color: white;
-	padding: 0.2em;
-	margin: 0 0;
-}
-
-form.div {
-	display:block;	
-}
-
-form.formRow {
-	display: inline;	
-}
-
-#schedulePlannerCtrlContainer {
-	border: 1px solid #CCE6FF;
-}
-
-#schedulePlannerCtrlContainer ul {
-	list-style-type: none;
-	display: inline;
-}
-
-.scheduleEventList {
-	margin: 1em 0;
-}
-
-.scheduleEvent {
-	padding: 0.2em 0.2em;
-	-webkit-border-radius: 3px;
-	background-color: #E5F3FF;
-	border: 1px solid #B3DBFF;
-}
-
-.scheduleEventHeader {
-	padding: 0.4em 0.2em;
-}
-
-.scheduleEventHeaderBar {
-	margin-left: 0.5em;	
-}
-
-.scheduleEventHeaderBar img {
-	float:left;
-	margin-right: 1em;
-	margin-left: 0.5em;
-}
-
-.scheduleEventHeaderBar span {
-	display: inline;
-	margin-left: 0.1em;
-}
-
-.scheduleEventIconbar {
-	margin: 0.4em 1em;
-	padding: 0.3em;
-}
-
-.scheduleEventContent {
-	padding: 0.3em 0.5em;
-	width: 45em;
-}
-
-.scheduleEventFooter {
-	margin-top: 1em;
-}
-
-form.dialogForm {
-	font-size: 0.9em;	
-}
\ No newline at end of file

From 0da928464740e2fc8a4027137eed38b176f52463 Mon Sep 17 00:00:00 2001
From: mpeters <mpeters@dsv.su.se>
Date: Fri, 29 Jul 2011 13:25:15 +0200
Subject: [PATCH 13/14] Fix of several serious bugs in final seminar file
 handling and addition of possibility of deletion of all documents related to
 a final seminar by an admin

Change-Id: If75bee176893c36e14c12deee3d17098a83fa260
---
 .../FinalSeminarUploadController.java         |  12 +-
 .../FinalSeminarUploadControllerImpl.java     |  33 +++--
 .../panels/FinalSeminarDetailsPanel.html      | 131 +++++++++---------
 .../panels/FinalSeminarDetailsPanel.java      | 103 +++++++++++---
 .../panels/OpponentListViewPanel.html         |   1 +
 .../panels/OpponentListViewPanel.java         |  63 +++++----
 6 files changed, 214 insertions(+), 129 deletions(-)

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

From 169df83554d987cce071b54dc72271a3e803678b Mon Sep 17 00:00:00 2001
From: mpeters <mpeters@dsv.su.se>
Date: Fri, 29 Jul 2011 13:54:43 +0200
Subject: [PATCH 14/14] Allow supervisors to view opposition reports, not only
 admins

Change-Id: Ib089d2b7b784828fdb0ab6559ca02f4cf2b60735
---
 .../dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

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 1e307a63dc..21d74e01be 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
@@ -136,7 +136,8 @@ public class FinalSeminarDetailsPanel extends Panel {
 						return item.getModelObject().getOpponentReport() != null;
 					}
 				};
-				MetaDataActionStrategy.authorize(oppCon, Roles.ADMIN);
+				//Students are not allowed to view other students opposition reports
+				MetaDataActionStrategy.authorize(oppCon, Roles.EMPLOYEE);
 				item.add(oppCon);
 				
 				String reportTitle = "";
@@ -148,7 +149,7 @@ public class FinalSeminarDetailsPanel extends Panel {
 				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?"));
 					}