From 339f570cfaaf6d2cc019df1c91a560a3acf04a80 Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Wed, 18 Nov 2020 13:02:34 +0100
Subject: [PATCH] Now you can delete SeasonTrapsites

---
 .../controller/servlet/HttpErrorServlet.java  |  4 ++
 .../modules/barkbeetle/BarkbeetleBean.java    | 15 +++++
 .../barkbeetle/BarkbeetleController.java      | 58 +++++++++++++++++++
 .../modules/barkbeetle/SeasonTrapsite.java    |  2 +-
 .../no/nibio/vips/logic/util/Globals.java     |  1 +
 src/main/webapp/WEB-INF/web.xml               | 11 ++--
 src/main/webapp/templates/400.ftl             | 14 +++++
 .../barkbeetleSeasonTrapsiteDeleteForm.ftl    | 47 +++++++++++++++
 .../barkbeetleSeasonTrapsiteForm.ftl          |  3 +
 .../barkbeetleSeasonTrapsiteList.ftl          |  3 +
 10 files changed, 152 insertions(+), 6 deletions(-)
 create mode 100644 src/main/webapp/templates/400.ftl
 create mode 100644 src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteDeleteForm.ftl

diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/HttpErrorServlet.java b/src/main/java/no/nibio/vips/logic/controller/servlet/HttpErrorServlet.java
index a5412020..8fc80543 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/HttpErrorServlet.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/HttpErrorServlet.java
@@ -62,6 +62,10 @@ public class HttpErrorServlet extends HttpServlet {
         {
             request.getRequestDispatcher("/404.ftl").forward(request, response);
         }
+        else if(statusCode.equals(400))
+        {
+            request.getRequestDispatcher("/400.ftl").forward(request, response);
+        }
         else
         {
             request.getRequestDispatcher("/error_unknown.ftl").forward(request, response);
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java
index 8ac18540..d798eb42 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java
@@ -228,4 +228,19 @@ public class BarkbeetleBean {
         });
         return kml;
     }
+    
+    public Boolean deleteSeasonTrapsite(Integer seasonTrapsiteId)
+    {
+        SeasonTrapsite stToDelete = em.find(SeasonTrapsite.class, seasonTrapsiteId);
+        if(stToDelete == null)
+        {
+            return false;
+        }
+        // Need to manually delete bivolt model calculations for this trap site
+        em.createNativeQuery("DELETE FROM barkbeetle.season_trapsite_bivolt WHERE season_trapsite_id = :seasonTrapsiteId")
+                .setParameter("seasonTrapsiteId", seasonTrapsiteId)
+                .executeUpdate();
+        em.remove(stToDelete);
+        return true;
+    }
 }
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleController.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleController.java
index ccd032f8..56c796ae 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleController.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleController.java
@@ -32,6 +32,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 import java.util.stream.Collectors;
+import javax.ejb.EJBException;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -82,6 +83,7 @@ public class BarkbeetleController extends HttpServlet {
                 Collections.sort(seasonTrapSites);
                 request.setAttribute("season", season);
                 request.setAttribute("seasonTrapsites", seasonTrapSites);
+                request.setAttribute("messageKey", request.getParameter("messageKey"));
                 request.getRequestDispatcher("/modules/barkbeetle/barkbeetleSeasonTrapsiteList.ftl").forward(request, response);
             }
             else if(action.equals("editSeasonTrapsite"))
@@ -277,6 +279,62 @@ public class BarkbeetleController extends HttpServlet {
                     response.sendError(Response.Status.BAD_REQUEST.getStatusCode(),"Kan ikke registrere data, fordi fellelokalitet med id=" + request.getParameter("seasonTrapsiteId") + " ikke ble funnet.");
                 }
             }
+            // Only admins can do this
+            else if(action.equals("seasonTrapsiteDeleteForm"))
+            {
+                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER))
+                {
+                    SeasonTrapsite trapsite = request.getParameter("seasonTrapsiteId") != null ? 
+                        BarkbeetleBean.getInstance().getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
+                        : null;
+                
+                    if(trapsite != null)
+                    {
+                        // Get any registrations
+                        request.setAttribute("seasonTrapsite", trapsite);
+                        // Display them
+                        
+                        request.getRequestDispatcher("/modules/barkbeetle/barkbeetleSeasonTrapsiteDeleteForm.ftl").forward(request, response);
+                    }
+                    else
+                    {
+                        response.sendError(404,"Den etterspurte fellelokaliteten finnes ikke i databasen"); // HTTP Forbidden
+                    }
+                }
+                else
+                {
+                    response.sendError(403,"Access not authorized"); // HTTP Forbidden
+                }
+            }
+            // Only admins can do this
+            else if(action.equals("seasonTrapsiteDelete"))
+            {
+                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER))
+                {
+                    try
+                    {
+                        if(BarkbeetleBean.getInstance().deleteSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId"))))
+                        {
+                            response.sendRedirect(Globals.PROTOCOL + "://"
+                                    + ServletUtil.getServerName(request)
+                                    + "/barkbeetle?messageKey=deleteOK"
+                            );
+                        }
+                        else
+                        {
+                            response.sendError(404,"Den etterspurte fellelokaliteten finnes ikke i databasen. <a href='/barkbeetle'>Gå tilbake til listen over fellelokaliteter</a>."); // HTTP Not found
+                        }
+                    }
+                    catch(NumberFormatException ex)
+                    {
+                        response.sendError(400, "Feil med id for fellelokalitet. <a href='/barkbeetle'>Gå tilbake til listen over fellelokaliteter</a>."); // HTTP Bad request
+                    }
+                }
+                else
+                {
+                    response.sendError(403,"Access not authorized"); // HTTP Forbidden
+                }
+            }
         }
         else
         {
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsite.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsite.java
index 31614589..fca1de2c 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsite.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsite.java
@@ -120,7 +120,7 @@ public class SeasonTrapsite implements Serializable, Comparable {
     private Integer propertyNo;
     @Column(name = "property_section_no")
     private Integer propertySectionNo;
-    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "seasonTrapsite", fetch = FetchType.EAGER)
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "seasonTrapsite", fetch = FetchType.EAGER)
     private Collection<TrapsiteRegistration> trapsiteRegistrationCollection;
     @JoinColumn(name = "trapsite_type", referencedColumnName = "trapsite_type_id")
     @ManyToOne
diff --git a/src/main/java/no/nibio/vips/logic/util/Globals.java b/src/main/java/no/nibio/vips/logic/util/Globals.java
index fa4bac9a..407c77c7 100755
--- a/src/main/java/no/nibio/vips/logic/util/Globals.java
+++ b/src/main/java/no/nibio/vips/logic/util/Globals.java
@@ -42,6 +42,7 @@ public class Globals {
         "/css",
         "/403",
         "/404",
+        "/400",
         "/rest",
         "/user",
         "/test/testlogin.jsp",
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 2b0f993a..39d9ae91 100755
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -123,11 +123,6 @@
         <servlet-name>ResourceBundleJSServlet</servlet-name>
         <url-pattern>/js/resourcebundle.js</url-pattern>
     </servlet-mapping>
-    <servlet-mapping>
-        <servlet-name>HttpErrorServlet</servlet-name>
-        <url-pattern>/error/404</url-pattern>
-        <url-pattern>/error/403</url-pattern>
-    </servlet-mapping>
     <servlet-mapping>
         <servlet-name>ForecastController</servlet-name>
         <url-pattern>/forecastConfiguration</url-pattern>
@@ -177,6 +172,12 @@
         <servlet-name>CorsProxyServlet</servlet-name>
         <url-pattern>/corsproxy/*</url-pattern>
     </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>HttpErrorServlet</servlet-name>
+        <url-pattern>/error/400</url-pattern>
+        <url-pattern>/error/404</url-pattern>
+        <url-pattern>/error/403</url-pattern>
+    </servlet-mapping>
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>
     </welcome-file-list>
diff --git a/src/main/webapp/templates/400.ftl b/src/main/webapp/templates/400.ftl
new file mode 100644
index 00000000..b4954ed2
--- /dev/null
+++ b/src/main/webapp/templates/400.ftl
@@ -0,0 +1,14 @@
+<#include "master.ftl">
+<#macro navbar_collapse>
+</#macro>
+<#macro page_head>
+        <title>ERROR 400</title>
+</#macro>
+<#macro page_contentwrap_start></#macro>
+<#macro page_contentwrap_end></#macro>
+<#macro page_contents>
+ <h1>ERROR 400 - bad request</h1>
+  <p>${message}</p>
+  <p><a href="/">To front page</a></p>
+</#macro>
+<@page_html/>
diff --git a/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteDeleteForm.ftl b/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteDeleteForm.ftl
new file mode 100644
index 00000000..1769fd87
--- /dev/null
+++ b/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteDeleteForm.ftl
@@ -0,0 +1,47 @@
+<#--
+    Copyright (c) 2020 NIBIO <http://www.nibio.no/>. 
+  
+  This file is part of VIPSLogic.
+  VIPSLogic is free software: you can redistribute it and/or modify
+  it under the terms of the NIBIO Open Source License as published by 
+  NIBIO, either version 1 of the License, or (at your option) any
+  later version.
+  
+  VIPSLogic is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  NIBIO Open Source License for more details.
+  
+  You should have received a copy of the NIBIO Open Source License
+  along with VIPSLogic.  If not, see <http://www.nibio.no/licenses/>.
+	
+--><#include "../../master.ftl">
+<#macro page_head>
+	<title>Barkbilleregistrering: Slett fellelokalitet for ${seasonTrapsite.season}</title>
+</#macro>
+<#macro custom_js>
+	
+</#macro>
+<#macro custom_css>
+	
+</#macro>
+<#macro page_contents>
+	
+	<h1>Slett fellelokalitet for sesongen ${seasonTrapsite.season}</h1>
+	
+	
+	
+<div class="singleBlockContainer">
+	<div class="row">
+	<div class="col-md-12">
+		<h2>${seasonTrapsite.countyName}/${seasonTrapsite.municipalityName}</h2>
+		<p>Denne lokaliteten har <a href="/barkbeetle?action=registerData&seasonTrapsiteId=${seasonTrapsite.seasonTrapsiteId}" target="new">${seasonTrapsite.trapsiteRegistrationCollection?size} registreringer</a></p>
+		<#if userIsAdmin && seasonTrapsite.seasonTrapsiteId?has_content>
+		  	<button type="button" class="btn btn-danger" onclick="window.location.href='/barkbeetle?action=seasonTrapsiteDelete&seasonTrapsiteId=${seasonTrapsite.seasonTrapsiteId}';">Jeg er ved mine fulle fem. Slett!</button>
+		  	<button type="button" class="btn btn-primary" onclick="window.location.href='/barkbeetle?action=editSeasonTrapsite&seasonTrapsiteId=${seasonTrapsite.seasonTrapsiteId}';">Avbryt</button>
+		  </#if>
+	</div>
+
+</div>
+</#macro>
+<@page_html/>
\ No newline at end of file
diff --git a/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteForm.ftl b/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteForm.ftl
index 5ab1126e..fb448d73 100644
--- a/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteForm.ftl
+++ b/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteForm.ftl
@@ -275,6 +275,9 @@
 				<span class="help-block" id="${formId}_installationRemarks_validation"></span>
 		  </div>
 		  <button type="submit" class="btn btn-default">Lagre</button>
+		  <#if userIsAdmin && seasonTrapsite.seasonTrapsiteId?has_content>
+		  	<button type="button" class="btn btn-danger" onclick="if(confirm('Ønsker du virkelig å slette?')){window.location.href='/barkbeetle?action=seasonTrapsiteDeleteForm&seasonTrapsiteId=${seasonTrapsite.seasonTrapsiteId}';}">Slett</button>
+		  </#if>
 	</form>
 	</div>
 	<div class="col-md-4">
diff --git a/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteList.ftl b/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteList.ftl
index 31450f75..3e6cb54f 100644
--- a/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteList.ftl
+++ b/src/main/webapp/templates/modules/barkbeetle/barkbeetleSeasonTrapsiteList.ftl
@@ -20,6 +20,9 @@
 	<title>Barkbilleregistrering: Fellelokaliteter for sesongen ${season}</title>
 </#macro>
 <#macro page_contents>
+<#if messageKey?has_content && messageKey=="deleteOK">
+		<div class="alert alert-success">Fellelokaliteten ble slettet</div>
+	</#if>
 <h1>Fellelokaliteter for sesongen ${season}</h1>
 <div class="row">
 	<div class="col-md-7">
-- 
GitLab