From 1d9d7b5f03b3e7b6af5600574a0ae6053843b77b Mon Sep 17 00:00:00 2001
From: rsanchez <rsanchez@curisit.net>
Date: Tue, 28 Oct 2014 13:07:05 +0000
Subject: [PATCH] #2021 feature - Fixing pack cacnellation and deletion actions

---
 securis/src/main/java/net/curisit/securis/services/helpers/LicenseHelper.java |   64 ++++++++++++
 securis/src/main/java/net/curisit/securis/services/helpers/UserHelper.java    |   29 +++++
 securis/src/main/resources/static/licenses.html                               |   19 ---
 securis/src/main/java/net/curisit/securis/db/Application.java                 |    3 
 securis/src/main/java/net/curisit/securis/services/LicenseResource.java       |   97 +++++--------------
 securis/src/main/resources/static/js/licenses.js                              |   20 ++-
 securis/src/main/java/net/curisit/securis/db/LicenseType.java                 |    3 
 securis/src/main/java/net/curisit/securis/db/Pack.java                        |   10 +
 securis/src/main/java/net/curisit/securis/services/PackResource.java          |   35 +++++-
 9 files changed, 173 insertions(+), 107 deletions(-)

diff --git a/securis/src/main/java/net/curisit/securis/db/Application.java b/securis/src/main/java/net/curisit/securis/db/Application.java
index 46d896d..17885c8 100644
--- a/securis/src/main/java/net/curisit/securis/db/Application.java
+++ b/securis/src/main/java/net/curisit/securis/db/Application.java
@@ -4,6 +4,7 @@
 import java.util.Date;
 import java.util.Set;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
@@ -56,7 +57,7 @@
     @OneToMany(fetch = FetchType.LAZY, mappedBy = "application")
     private Set<LicenseType> licenseTypes;
 
-    @OneToMany(fetch = FetchType.LAZY, mappedBy = "application")
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "application")
     private Set<ApplicationMetadata> metadata;
 
     public Integer getId() {
diff --git a/securis/src/main/java/net/curisit/securis/db/LicenseType.java b/securis/src/main/java/net/curisit/securis/db/LicenseType.java
index 3196743..c42353b 100644
--- a/securis/src/main/java/net/curisit/securis/db/LicenseType.java
+++ b/securis/src/main/java/net/curisit/securis/db/LicenseType.java
@@ -4,6 +4,7 @@
 import java.util.Date;
 import java.util.Set;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
@@ -62,7 +63,7 @@
     @JoinColumn(name = "application_id")
     private Application application;
 
-    @OneToMany(fetch = FetchType.LAZY, mappedBy = "licenseType")
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "licenseType")
     private Set<LicenseTypeMetadata> metadata;
 
     public Set<LicenseTypeMetadata> getMetadata() {
diff --git a/securis/src/main/java/net/curisit/securis/db/Pack.java b/securis/src/main/java/net/curisit/securis/db/Pack.java
index 1cd05ca..b44548c 100644
--- a/securis/src/main/java/net/curisit/securis/db/Pack.java
+++ b/securis/src/main/java/net/curisit/securis/db/Pack.java
@@ -99,7 +99,7 @@
     @JsonProperty("default_valid_period")
     private Integer defaultValidPeriod;
 
-    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pack")
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pack")
     private Set<PackMetadata> metadata;
 
     public Integer getId() {
@@ -317,6 +317,14 @@
         this.endValidDate = endValidDate;
     }
 
+    public Set<License> getLicenses() {
+        return licenses;
+    }
+
+    public void setLicenses(Set<License> licenses) {
+        this.licenses = licenses;
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (!(obj instanceof Pack))
diff --git a/securis/src/main/java/net/curisit/securis/services/LicenseResource.java b/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
index ae36938..e338592 100644
--- a/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
@@ -1,7 +1,6 @@
 package net.curisit.securis.services;
 
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.text.MessageFormat;
@@ -51,6 +50,8 @@
 import net.curisit.securis.security.Securable;
 import net.curisit.securis.services.exception.SeCurisServiceException;
 import net.curisit.securis.services.exception.SeCurisServiceException.ErrorCodes;
+import net.curisit.securis.services.helpers.LicenseHelper;
+import net.curisit.securis.services.helpers.UserHelper;
 import net.curisit.securis.utils.EmailManager;
 import net.curisit.securis.utils.JsonUtils;
 import net.curisit.securis.utils.Params;
@@ -75,16 +76,22 @@
     private static final Logger LOG = LogManager.getLogger(LicenseResource.class);
 
     @Inject
-    TokenHelper tokenHelper;
+    private TokenHelper tokenHelper;
 
     @Inject
-    EmailManager emailManager;
+    private EmailManager emailManager;
 
     @Inject
-    Provider<EntityManager> emProvider;
+    private UserHelper userHelper;
 
     @Inject
-    LicenseGenerator licenseGenerator;
+    private LicenseHelper licenseHelper;
+
+    @Inject
+    private Provider<EntityManager> emProvider;
+
+    @Inject
+    private LicenseGenerator licenseGenerator;
 
     /**
      * 
@@ -162,7 +169,7 @@
             LOG.error("License with id {} is not active, so It can not downloaded", licId, bsc.getUserPrincipal());
             throw new SeCurisServiceException(ErrorCodes.WRONG_STATUS, "License is not active, so It can not be downloaded");
         }
-        em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.DOWNLOAD));
+        em.persist(licenseHelper.createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.DOWNLOAD));
         return Response
                 .ok(lic.getLicenseData())
                 .header("Content-Disposition",
@@ -210,8 +217,8 @@
         lic.setModificationTimestamp(new Date());
 
         em.persist(lic);
-        User user = getUser(bsc.getUserPrincipal().getName(), em);
-        em.persist(createLicenseHistoryAction(lic, user, LicenseHistory.Actions.ACTIVATE));
+        User user = userHelper.getUser(bsc.getUserPrincipal().getName(), em);
+        em.persist(licenseHelper.createLicenseHistoryAction(lic, user, LicenseHistory.Actions.ACTIVATE));
         return Response.ok(lic).build();
     }
 
@@ -243,12 +250,12 @@
             throw new SeCurisServiceException(Status.NOT_FOUND.getStatusCode(), "There is no license file available");
         }
 
-        User user = getUser(bsc.getUserPrincipal().getName(), em);
+        User user = userHelper.getUser(bsc.getUserPrincipal().getName(), em);
         try {
             String subject = MessageFormat.format(Params.get(Params.KEYS.EMAIL_LIC_DEFAULT_SUBJECT), lic.getPack().getAppName());
             String email_tpl = IOUtils.toString(this.getClass().getResourceAsStream("/lic_email_template.en"));
             String body = MessageFormat.format(email_tpl, lic.getFullName(), app.getName());
-            licFile = createTemporaryLicenseFile(lic, app.getLicenseFilename());
+            licFile = licenseHelper.createTemporaryLicenseFile(lic, app.getLicenseFilename());
 
             emailManager.sendEmail(subject, body, lic.getEmail(), addCC ? user.getEmail() : null, licFile);
         } catch (IOException e) {
@@ -262,7 +269,7 @@
 
         lic.setModificationTimestamp(new Date());
         em.persist(lic);
-        em.persist(createLicenseHistoryAction(lic, user, LicenseHistory.Actions.SEND, "Email sent to: " + lic.getEmail()));
+        em.persist(licenseHelper.createLicenseHistoryAction(lic, user, LicenseHistory.Actions.SEND, "Email sent to: " + lic.getEmail()));
         return Response.ok(lic).build();
     }
 
@@ -301,23 +308,8 @@
                     + " can not be canceled without a reason");
         }
 
-        lic.setStatus(LicenseStatus.CANCELLED);
-        lic.setCancelledById(bsc.getUserPrincipal().getName());
-        lic.setModificationTimestamp(new Date());
-        em.persist(lic);
-
-        em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.CANCEL, "Cancellation reason: " + reason));
+        licenseHelper.cancelLicense(lic, reason, bsc, em);
         return Response.ok(lic).build();
-    }
-
-    /**
-     * Cancel the license
-     * 
-     * @param lic
-     * @param em
-     */
-    public static void cancelLicense(License lic, EntityManager em) throws SeCurisServiceException {
-
     }
 
     @POST
@@ -349,7 +341,7 @@
             }
         }
 
-        User createdBy = getUser(bsc.getUserPrincipal().getName(), em);
+        User createdBy = userHelper.getUser(bsc.getUserPrincipal().getName(), em);
 
         if (lic.getRequestData() != null) {
             License existingLicense = License.findLicenseByRequestData(lic.getRequestData(), em);
@@ -380,9 +372,9 @@
         lic.setCreationTimestamp(new Date());
         lic.setModificationTimestamp(lic.getCreationTimestamp());
         em.persist(lic);
-        em.persist(createLicenseHistoryAction(lic, createdBy, LicenseHistory.Actions.CREATE));
+        em.persist(licenseHelper.createLicenseHistoryAction(lic, createdBy, LicenseHistory.Actions.CREATE));
         if (lic.getStatus() == LicenseStatus.ACTIVE) {
-            em.persist(createLicenseHistoryAction(lic, createdBy, LicenseHistory.Actions.CREATE, "Activated on creation"));
+            em.persist(licenseHelper.createLicenseHistoryAction(lic, createdBy, LicenseHistory.Actions.CREATE, "Activated on creation"));
         }
 
         return Response.ok(lic).build();
@@ -486,7 +478,7 @@
 
         currentLicense.setModificationTimestamp(new Date());
         em.persist(currentLicense);
-        em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.MODIFY));
+        em.persist(licenseHelper.createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.MODIFY));
 
         return Response.ok(currentLicense).build();
     }
@@ -547,12 +539,12 @@
         }
         BlockedRequest blockedReq = new BlockedRequest();
         blockedReq.setCreationTimestamp(new Date());
-        blockedReq.setBlockedBy(getUser(bsc, em));
+        blockedReq.setBlockedBy(userHelper.getUser(bsc, em));
         blockedReq.setRequestData(lic.getRequestData());
 
         em.persist(blockedReq);
 
-        em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.BLOCK));
+        em.persist(licenseHelper.createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.BLOCK));
         return Response.ok(Utils.createMap("success", true, "id", licId)).build();
     }
 
@@ -571,7 +563,7 @@
         if (BlockedRequest.isRequestBlocked(lic.getRequestData(), em)) {
             BlockedRequest blockedReq = em.find(BlockedRequest.class, lic.getReqDataHash());
             em.remove(blockedReq);
-            em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.UNBLOCK));
+            em.persist(licenseHelper.createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.UNBLOCK));
         } else {
             LOG.info("Request data for license {} is NOT blocked", licId);
         }
@@ -595,43 +587,6 @@
             throw new SeCurisServiceException(Status.UNAUTHORIZED.getStatusCode(), "Unathorized access to license data");
         }
         return lic;
-    }
-
-    private User getUser(BasicSecurityContext bsc, EntityManager em) throws SeCurisServiceException {
-        String username = bsc.getUserPrincipal().getName();
-        return getUser(username, em);
-    }
-
-    private User getUser(String username, EntityManager em) throws SeCurisServiceException {
-        User user = null;
-        if (username != null) {
-            user = em.find(User.class, username);
-            if (user == null) {
-                throw new SeCurisServiceException(Status.NOT_FOUND.getStatusCode(), "User not found with username: " + username);
-            }
-        }
-        return user;
-    }
-
-    private File createTemporaryLicenseFile(License lic, String licFileName) throws IOException {
-        File f = Files.createTempDirectory("securis-server").toFile();
-        f = new File(f, licFileName);
-        IOUtils.write(lic.getLicenseData(), new FileWriter(f));
-        return f;
-    }
-
-    private LicenseHistory createLicenseHistoryAction(License lic, User user, String action, String comments) {
-        LicenseHistory lh = new LicenseHistory();
-        lh.setLicense(lic);
-        lh.setUser(user);
-        lh.setTimestamp(new Date());
-        lh.setAction(action);
-        lh.setComments(comments);
-        return lh;
-    }
-
-    private LicenseHistory createLicenseHistoryAction(License lic, User user, String action) {
-        return createLicenseHistoryAction(lic, user, action, null);
     }
 
     public static void main(String[] args) throws IOException {
diff --git a/securis/src/main/java/net/curisit/securis/services/PackResource.java b/securis/src/main/java/net/curisit/securis/services/PackResource.java
index a3b65a9..cd18426 100644
--- a/securis/src/main/java/net/curisit/securis/services/PackResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/PackResource.java
@@ -12,6 +12,7 @@
 import javax.persistence.TypedQuery;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
@@ -26,6 +27,8 @@
 import net.curisit.integrity.commons.Utils;
 import net.curisit.securis.DefaultExceptionHandler;
 import net.curisit.securis.SeCurisException;
+import net.curisit.securis.db.License;
+import net.curisit.securis.db.LicenseStatus;
 import net.curisit.securis.db.LicenseType;
 import net.curisit.securis.db.Organization;
 import net.curisit.securis.db.Pack;
@@ -36,6 +39,8 @@
 import net.curisit.securis.security.Securable;
 import net.curisit.securis.services.exception.SeCurisServiceException;
 import net.curisit.securis.services.exception.SeCurisServiceException.ErrorCodes;
+import net.curisit.securis.services.helpers.LicenseHelper;
+import net.curisit.securis.services.helpers.UserHelper;
 import net.curisit.securis.utils.TokenHelper;
 
 import org.apache.logging.log4j.LogManager;
@@ -60,8 +65,11 @@
     @Inject
     Provider<EntityManager> emProvider;
 
-    public PackResource() {
-    }
+    @Inject
+    private UserHelper userHelper;
+
+    @Inject
+    private LicenseHelper licenseHelper;
 
     /**
      * 
@@ -297,8 +305,9 @@
     @Produces({
         MediaType.APPLICATION_JSON
     })
-    public Response cancel(@PathParam("packId") Integer packId) throws SeCurisServiceException {
-        LOG.info("Putting On hold pack with id: {}", packId);
+    public Response cancel(@PathParam("packId") Integer packId, @FormParam("reason") String reason, @Context BasicSecurityContext bsc)
+            throws SeCurisServiceException {
+        LOG.info("Cancelling pack with id: {}", packId);
         EntityManager em = emProvider.get();
 
         Pack currentPack = em.find(Pack.class, packId);
@@ -308,6 +317,12 @@
             throw new SeCurisServiceException(ErrorCodes.WRONG_STATUS, "Pack cannot be cancelled in status: " + currentPack.getStatus().name());
         }
 
+        Set<License> licenses = currentPack.getLicenses();
+        for (License license : licenses) {
+            if (license.getStatus() == LicenseStatus.ACTIVE || license.getStatus() == LicenseStatus.PRE_ACTIVE) {
+                licenseHelper.cancelLicense(license, "Pack cancellation. " + reason, bsc, em);
+            }
+        }
         currentPack.setStatus(PackStatus.CANCELLED);
         em.persist(currentPack);
 
@@ -334,7 +349,7 @@
     @Produces({
         MediaType.APPLICATION_JSON
     })
-    public Response delete(@PathParam("packId") String packId) {
+    public Response delete(@PathParam("packId") String packId) throws SeCurisServiceException {
         LOG.info("Deleting pack with id: {}", packId);
         EntityManager em = emProvider.get();
         Pack pack = em.find(Pack.class, Integer.parseInt(packId));
@@ -343,10 +358,14 @@
             return Response.status(Status.NOT_FOUND).header(DefaultExceptionHandler.ERROR_MESSAGE_HEADER, "Pack was not found, ID: " + packId)
                     .build();
         }
-        if (pack.getMetadata() != null) {
-            for (PackMetadata md : pack.getMetadata()) {
-                em.remove(md);
+        // Pack metadata is removed in cascade automatically.
+
+        Set<License> licenses = pack.getLicenses();
+        for (License license : licenses) {
+            if (license.getStatus() == LicenseStatus.ACTIVE || license.getStatus() == LicenseStatus.PRE_ACTIVE) {
+                throw new SeCurisServiceException(ErrorCodes.WRONG_STATUS, "An active license cannot be deleted. License code: " + license.getCode());
             }
+            em.remove(license);
         }
 
         em.remove(pack);
diff --git a/securis/src/main/java/net/curisit/securis/services/helpers/LicenseHelper.java b/securis/src/main/java/net/curisit/securis/services/helpers/LicenseHelper.java
new file mode 100644
index 0000000..191e53d
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/services/helpers/LicenseHelper.java
@@ -0,0 +1,64 @@
+package net.curisit.securis.services.helpers;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Date;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import javax.persistence.EntityManager;
+
+import net.curisit.securis.db.License;
+import net.curisit.securis.db.LicenseHistory;
+import net.curisit.securis.db.LicenseStatus;
+import net.curisit.securis.db.User;
+import net.curisit.securis.security.BasicSecurityContext;
+import net.curisit.securis.services.exception.SeCurisServiceException;
+
+import org.apache.commons.io.IOUtils;
+
+@Singleton
+public class LicenseHelper {
+
+    @Inject
+    private UserHelper userHelper;
+
+    /**
+     * Cancel the license
+     * 
+     * @param lic
+     * @param em
+     */
+    public void cancelLicense(License lic, String reason, BasicSecurityContext bsc, EntityManager em) throws SeCurisServiceException {
+        lic.setStatus(LicenseStatus.CANCELLED);
+        lic.setCancelledById(bsc.getUserPrincipal().getName());
+        lic.setModificationTimestamp(new Date());
+        em.persist(lic);
+
+        em.persist(createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.CANCEL, "Cancellation reason: " + reason));
+
+    }
+
+    public LicenseHistory createLicenseHistoryAction(License lic, User user, String action, String comments) {
+        LicenseHistory lh = new LicenseHistory();
+        lh.setLicense(lic);
+        lh.setUser(user);
+        lh.setTimestamp(new Date());
+        lh.setAction(action);
+        lh.setComments(comments);
+        return lh;
+    }
+
+    public LicenseHistory createLicenseHistoryAction(License lic, User user, String action) {
+        return createLicenseHistoryAction(lic, user, action, null);
+    }
+
+    public File createTemporaryLicenseFile(License lic, String licFileName) throws IOException {
+        File f = Files.createTempDirectory("securis-server").toFile();
+        f = new File(f, licFileName);
+        IOUtils.write(lic.getLicenseData(), new FileWriter(f));
+        return f;
+    }
+}
diff --git a/securis/src/main/java/net/curisit/securis/services/helpers/UserHelper.java b/securis/src/main/java/net/curisit/securis/services/helpers/UserHelper.java
new file mode 100644
index 0000000..5719764
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/services/helpers/UserHelper.java
@@ -0,0 +1,29 @@
+package net.curisit.securis.services.helpers;
+
+import javax.inject.Singleton;
+import javax.persistence.EntityManager;
+import javax.ws.rs.core.Response.Status;
+
+import net.curisit.securis.db.User;
+import net.curisit.securis.security.BasicSecurityContext;
+import net.curisit.securis.services.exception.SeCurisServiceException;
+
+@Singleton
+public class UserHelper {
+
+    public User getUser(BasicSecurityContext bsc, EntityManager em) throws SeCurisServiceException {
+        String username = bsc.getUserPrincipal().getName();
+        return getUser(username, em);
+    }
+
+    public User getUser(String username, EntityManager em) throws SeCurisServiceException {
+        User user = null;
+        if (username != null) {
+            user = em.find(User.class, username);
+            if (user == null) {
+                throw new SeCurisServiceException(Status.NOT_FOUND.getStatusCode(), "User not found with username: " + username);
+            }
+        }
+        return user;
+    }
+}
diff --git a/securis/src/main/resources/static/js/licenses.js b/securis/src/main/resources/static/js/licenses.js
index 6dfe849..2e250fa 100644
--- a/securis/src/main/resources/static/js/licenses.js
+++ b/securis/src/main/resources/static/js/licenses.js
@@ -105,11 +105,12 @@
 			var _error = _createErrorCallback(pack, $L.get('Put on hold'), _onerror);
 			packResource.putonhold({id: pack.id}, _success, _error);
 		}
-		this.cancel = function(pack, _onsuccess, _onerror) {
+		this.cancel = function(pack, extra_data, _onsuccess, _onerror) {
 			console.log('Cancellation on pack: ' + pack.id);
 			var _success = _createSuccessCallback($L.get('Cancellation'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("cancelled")), _onsuccess);
 			var _error = _createErrorCallback(pack, $L.get('Cancellation'), _onerror);
-			packResource.cancel({id: pack.id}, _success, _error);
+			var params = angular.extend({id: pack.id}, extra_data);
+			packResource.cancel(params, _success, _error);
 		}
 		this.delete = function(pack, _onsuccess, _onerror) {
 			console.log('Delete on pack: ' + pack.id);
@@ -334,10 +335,17 @@
 				 */
 				$scope.execute = function(action, pack) {
 					var _execute = function(extra_data) {
-						Packs[action](pack || $scope.pack, extra_data, function() {
-						    if (!$scope.isNew) $scope.showForm = false;
-							$scope.packs = Packs.getPacksList();
-						});
+						if (extra_data) {
+							Packs[action](pack || $scope.pack, extra_data, function() {
+							    if (!$scope.isNew) $scope.showForm = false;
+								$scope.packs = Packs.getPacksList();
+							});
+						} else {
+							Packs[action](pack || $scope.pack, function() {
+							    if (!$scope.isNew) $scope.showForm = false;
+								$scope.packs = Packs.getPacksList();
+							});
+						}
 					}
 					if (action === 'delete') {
 						BootstrapDialog.confirm($L.get("The pack '{0}' will be deleted, are you sure ?", $scope.pack.code), function(answer) {
diff --git a/securis/src/main/resources/static/licenses.html b/securis/src/main/resources/static/licenses.html
index 977f1e3..a51263c 100644
--- a/securis/src/main/resources/static/licenses.html
+++ b/securis/src/main/resources/static/licenses.html
@@ -266,24 +266,6 @@
 			</form>
 		</div>
 
-<div class="modal fade" id="cancellationReasonDialog" tabindex="-1" role="dialog" aria-labelledby="cancelDialogLabel" aria-hidden="true">
-  <div class="modal-dialog">
-    <div class="modal-content">
-      <div class="modal-header">
-        <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-        <h4 class="modal-title" id="cancelDialogLabel" i18n>Pack cancellation</h4>
-      </div>
-      <div class="modal-body">
-        	
-      </div>
-      <div class="modal-footer">
-        <button type="button" class="btn btn-default" data-dismiss="modal" i18n>Close</button>
-        <button type="button" class="btn btn-primary" i18n>Cancel pack</button>
-      </div>
-    </div>
-  </div>
-</div>
-
 		<div class="panel panel-default">
 			<div class="panel-heading">
 				Packs <span class="badge pull-right" ng-bind="packs.length || 0"></span>
@@ -323,7 +305,6 @@
 		</div>
 
 	</div>
-	{{license | json}}
 	<div id="licenses_section" class="col-md-6"
 		ng-controller="LicensesCtrl">
 		<nav class="navbar navbar-default navbar-static-top"

--
Gitblit v1.3.2