From edd47c68c6a08bd756d96213c38e896a0a257bd1 Mon Sep 17 00:00:00 2001
From: Roberto Sánchez <roberto.sanchez@curisit.net>
Date: Mon, 13 Jan 2014 18:12:51 +0000
Subject: [PATCH] #394 feature - Several fixes related with form management

---
 securis/src/main/resources/static/admin.html                                 |    3 ++-
 securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java  |    3 +++
 securis/src/main/resources/static/js/catalogs.json                           |    1 +
 securis/src/main/java/net/curisit/securis/db/Organization.java               |    8 ++++++--
 securis/src/main/java/net/curisit/securis/services/UserResource.java         |    4 ++--
 securis/src/main/resources/static/js/catalogs.js                             |    6 ++++--
 securis/src/main/java/net/curisit/securis/services/OrganizationResource.java |   17 +++++++++++++++--
 securis/src/main/resources/static/js/admin.js                                |   14 +++++++++++---
 8 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/securis/src/main/java/net/curisit/securis/db/Organization.java b/securis/src/main/java/net/curisit/securis/db/Organization.java
index fd107b9..57e536a 100644
--- a/securis/src/main/java/net/curisit/securis/db/Organization.java
+++ b/securis/src/main/java/net/curisit/securis/db/Organization.java
@@ -136,8 +136,12 @@
 	// information about the referenced entities.
 	@JsonProperty("org_parent_id")
 	public void setParentOrgId(Integer orgId) {
-		parentOrganization = new Organization();
-		parentOrganization.setId(orgId);
+		if (orgId != null) {
+			parentOrganization = new Organization();
+			parentOrganization.setId(orgId);
+		} else {
+			parentOrganization = null;
+		}
 	}
 
 	@JsonProperty("org_parent_id")
diff --git a/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java b/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java
index b229507..e805b47 100644
--- a/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java
@@ -111,6 +111,9 @@
 				log.error("LicenseType application with id {} not found in DB", lt.getApplicationId());
 				return Response.status(Status.NOT_FOUND).header(SecurisErrorHandler.HEADER_ERROR_MESSAGE, "License type's app not found with ID: " + lt.getApplicationId()).build();
 			}
+		} else {
+			log.error("Application is missing for current license type data");
+			return Response.status(Status.NOT_FOUND).header(SecurisErrorHandler.HEADER_ERROR_MESSAGE, "Application is missing for current license type data").build();
 		}
 
 		lt.setApplication(app);
diff --git a/securis/src/main/java/net/curisit/securis/services/OrganizationResource.java b/securis/src/main/java/net/curisit/securis/services/OrganizationResource.java
index b8b8cc3..a7cbbcf 100644
--- a/securis/src/main/java/net/curisit/securis/services/OrganizationResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/OrganizationResource.java
@@ -96,6 +96,15 @@
 		return Response.ok(lt).build();
 	}
 
+	private boolean isCyclicalRelationship(int currentId, Organization parent) {
+		while (parent != null) {
+			if (parent.getId() == currentId)
+				return true;
+			parent = parent.getParentOrganization();
+		}
+		return false;
+	}
+
 	@POST
 	@Path("/")
 	@Consumes(MediaType.APPLICATION_JSON)
@@ -157,6 +166,10 @@
 				log.error("Organization parent with id {} not found in DB", org.getParentOrgId());
 				return Response.status(Status.NOT_FOUND).header(SecurisErrorHandler.HEADER_ERROR_MESSAGE, "Organization's parent not found with ID: " + org.getParentOrgId()).build();
 			}
+			if (isCyclicalRelationship(currentOrg.getId(), parentOrg)) {
+				log.error("Organization parent generate a cyclical relationship, parent id {}, current id: {}", org.getParentOrgId(), currentOrg.getId());
+				return Response.status(Status.FORBIDDEN).header(SecurisErrorHandler.HEADER_ERROR_MESSAGE, "Cyclical relationships are not allowed, please change the parent organization, current Parent: " + parentOrg.getName()).build();
+			}
 		}
 
 		List<User> users = null;
@@ -165,8 +178,8 @@
 			users = new ArrayList<>();
 			for (String username : usersIds) {
 				User user = em.find(User.class, username);
-				if (parentOrg == null) {
-					log.error("Organization user with id {} not found in DB", username);
+				if (user == null) {
+					log.error("Organization user with id '{}' not found in DB", username);
 					return Response.status(Status.NOT_FOUND).header(SecurisErrorHandler.HEADER_ERROR_MESSAGE, "Organization's user not found with ID: " + username).build();
 				}
 				users.add(user);
diff --git a/securis/src/main/java/net/curisit/securis/services/UserResource.java b/securis/src/main/java/net/curisit/securis/services/UserResource.java
index 25d2445..28fab1d 100644
--- a/securis/src/main/java/net/curisit/securis/services/UserResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/UserResource.java
@@ -89,7 +89,7 @@
 		}
 
 		EntityManager em = emProvider.get();
-		User lt = em.find(User.class, Integer.parseInt(uid));
+		User lt = em.find(User.class, uid);
 		if (lt == null) {
 			log.error("User with id {} not found in DB", uid);
 			return Response.status(Status.NOT_FOUND).build();
@@ -187,7 +187,7 @@
 	public Response delete(@PathParam("uid") String uid, @Context HttpServletRequest request) {
 		log.info("Deleting app with id: {}", uid);
 		EntityManager em = emProvider.get();
-		User app = em.find(User.class, Integer.parseInt(uid));
+		User app = em.find(User.class, uid);
 		if (app == null) {
 			log.error("User with id {} can not be deleted, It was not found in DB", uid);
 			return Response.status(Status.NOT_FOUND).build();
diff --git a/securis/src/main/resources/static/admin.html b/securis/src/main/resources/static/admin.html
index c68eaac..3c313a2 100644
--- a/securis/src/main/resources/static/admin.html
+++ b/securis/src/main/resources/static/admin.html
@@ -154,7 +154,8 @@
 									<p ng-switch-when="readonly" class="form-control-static">{{formu[field.name]}}</p>
 									<p ng-switch-when="readonly_date" class="form-control-static">{{formu[field.name] | date:'medium'}}</p>
 									<select ng-switch-when="select" class="form-control" ng-required="field.mandatory" ng-model="formu[field.name]"
-										ng-options="o.id as o.label for o in refs[field.name]">
+										ng-options="o.id as o.label for o in refs[field.name]" >
+										<option selected="true" ng-if="!field.mandatory" value=""></option>
 									</select>
 									<select chosen multiple ng-switch-when="multiselect" class="form-control" ng-required="field.mandatory" ng-model="formu[field.name]"
 										ng-options="o.id as o.label for o in refs[field.name]" data-placeholder="...">
diff --git a/securis/src/main/resources/static/js/admin.js b/securis/src/main/resources/static/js/admin.js
index 53b2125..5953c1c 100644
--- a/securis/src/main/resources/static/js/admin.js
+++ b/securis/src/main/resources/static/js/admin.js
@@ -62,10 +62,15 @@
 				$scope.edit = function(data) {
 					$scope.showForm = true;
 					$scope.isNew = false;
+					// Next line is a wirkaround due to some issues with values with ID == 0
+					$('select').val(null);
 					$scope.formu = {}
-					for (var k in data) {
-						if (k.indexOf('$') !== 0 && k.indexOf('_') !== 0 && !Catalogs.getField(k).listingOnly) $scope.formu[k] = data[k]
-					}
+					var fields = Catalogs.getMetadata().fields;
+					console.log($scope);
+					
+					fields.forEach(function(field) {
+						if (!field.listingOnly) $scope.formu[field.name] = data[field.name] || null;
+					})
 
 					setTimeout(function() {
 						$('#'+Catalogs.getFFF()).focus();
@@ -117,6 +122,7 @@
 				$scope.editNew = function() {
 					$scope.$parent.isNew = true;
 					$scope.$parent.showForm = true;
+					$('select').val(null);
 					$scope.$parent.formu = {};
 					setTimeout(function() {
 						$('#'+Catalogs.getFFF()).focus();
@@ -125,6 +131,7 @@
 				}
 				$scope.cancel = function() {
 					$scope.$parent.showForm = false;
+					$scope.catalogForm.$setPristine();
 				}
 
 				$scope.saveCatalog = function() {
@@ -134,6 +141,7 @@
 						var promise = Catalogs.save($scope.formu).$promise;
 						promise.then(function(data, otro) {
 							if ($scope.isNew) {
+								$scope.catalogForm.$setPristine();
 								$scope.$parent.formu = {}
 								$('#'+ Catalogs.getFFF()).focus();
 							} else {
diff --git a/securis/src/main/resources/static/js/catalogs.js b/securis/src/main/resources/static/js/catalogs.js
index 518fd65..77ad975 100644
--- a/securis/src/main/resources/static/js/catalogs.js
+++ b/securis/src/main/resources/static/js/catalogs.js
@@ -183,13 +183,15 @@
 		$q.all(promises).then(function() {
 			
 			for (var k in refs) {
-				var pk = that.getPk(that.getMetadata(that.getField(k).resource))
+				var field = that.getField(k);
+				var pk = that.getPk(that.getMetadata(field.resource))
 				console.log('PK field for ' + k + ' is ' + pk)
 				var comboData = []
 				refs[k].forEach(function(row) {
+					console.log('field.resource !== _current.resource: ' + field.resource +' '+ _current.resource)
 					comboData.push({
 						id: row[pk],
-						label: row.label || row.name || row.code || row.first_name + ' ' + row.last_name
+						label: row.label || row.name || row.code || row.first_name + ' ' + (row.last_name || '')
 					});
 				})
 				refs[k] = comboData;
diff --git a/securis/src/main/resources/static/js/catalogs.json b/securis/src/main/resources/static/js/catalogs.json
index c2efe6b..a2c24d9 100644
--- a/securis/src/main/resources/static/js/catalogs.json
+++ b/securis/src/main/resources/static/js/catalogs.json
@@ -61,6 +61,7 @@
 		"name" : "application_id",
 		"display" : "Application",
 		"resource" : "application",
+		"mandatory" : true,
 		"type" : "select"
 	}, {
 		"name" : "creationTimestamp",

--
Gitblit v1.3.2