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 a5412020d9fd70a41688c2ee69e8bf4a1b29e6ba..8fc80543ad2bf86191a8b77ea331b9948f905dfb 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 8ac185403ae0f889b69a6bd9b45df8321d6c25f5..d798eb42f14ef1797225bbc36328380b280cdd36 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 ccd032f8e4662994958f477fc04927cd0427904a..56c796ae9b6253ee05fa83ff4125c73a23a257bb 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 316145894830de3173783536e2d80a82a6568b94..fca1de2c5f183955bfc62829ab92c7b3aafaf96d 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 fa4bac9ace1d6099154373f08c315db1d9ff6495..407c77c74eb97674895ff5478560f7455a69cf71 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 2b0f993a745b2a4b3046d9ad61aef23be41c9b72..39d9ae9147275900d44614c1ed5173d58df3d4a6 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 0000000000000000000000000000000000000000..b4954ed2136e997dfa50ad98a40b23b8264346ed --- /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 0000000000000000000000000000000000000000..1769fd87e623c50d850d0175e339e4e53af6e452 --- /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 5ab1126e617f51a46aea67df370dcb4077fc63bd..fb448d739d87e3f3c9dcd5a3b48a1eb7c46353fc 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 31450f759690e15fa3930b45db6fd7af8a7fe890..3e6cb54f373d1787233062ff3d1c2d5ffcfa7b40 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">