azkaban-aplcache

Added description changer.

7/19/2012 8:01:27 PM

Details

diff --git a/src/java/azkaban/project/FileProjectManager.java b/src/java/azkaban/project/FileProjectManager.java
index c0aba7e..2a0a2ed 100644
--- a/src/java/azkaban/project/FileProjectManager.java
+++ b/src/java/azkaban/project/FileProjectManager.java
@@ -440,5 +440,21 @@ public class FileProjectManager implements ProjectManager {
 		}
 	}
 
+	@Override
+	public void commitProject(String projectName) throws ProjectManagerException {
+		Project project = projects.get(projectName);
+		if (project == null) {
+			throw new ProjectManagerException("Project " + projectName + " doesn't exist.");
+		}
+		
+		File projectPath = new File(projectDirectory, projectName);
+		try {
+			writeProjectFile(projectPath, project);
+		}
+		catch (IOException e) {
+			throw new ProjectManagerException("Error committing project " + projectName, e);
+		}
+	}
+
 
 }
\ No newline at end of file
diff --git a/src/java/azkaban/project/ProjectManager.java b/src/java/azkaban/project/ProjectManager.java
index e6e9046..d135d94 100644
--- a/src/java/azkaban/project/ProjectManager.java
+++ b/src/java/azkaban/project/ProjectManager.java
@@ -12,6 +12,8 @@ public interface ProjectManager {
     
     public List<Project> getProjects(User user);
     
+    public void commitProject(String name) throws ProjectManagerException;
+    
     public Project getProject(String name, User user);
     
     public void uploadProject(String projectName, File projectDir, User uploader, boolean force) throws ProjectManagerException;
diff --git a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index fcacdc1..3287115 100644
--- a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -32,7 +32,6 @@ import org.apache.log4j.Logger;
 
 import azkaban.flow.Edge;
 import azkaban.flow.Flow;
-import azkaban.flow.FlowProps;
 import azkaban.flow.Node;
 import azkaban.project.Project;
 import azkaban.project.ProjectManager;
@@ -130,18 +129,49 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 
 		String jsonName = getParam(req, "json");
 		if (jsonName.equals("fetchflowjobs")) {
-			jsonFetchFlow(project, ret, req, resp);
+			if (handleJsonPermission(project, user, Type.READ, ret)) {
+				jsonFetchFlow(project, ret, req, resp);
+			}
 		}
 		else if (jsonName.equals("fetchflowgraph")) {
-			jsonFetchFlowGraph(project, ret, req, resp);
+			if (handleJsonPermission(project, user, Type.READ, ret)) {
+				jsonFetchFlowGraph(project, ret, req, resp);
+			}
 		}
 		else if (jsonName.equals("fetchprojectflows")) {
-			jsonFetchProjectFlows(project, ret, req, resp);
+			if (handleJsonPermission(project, user, Type.READ, ret)) {
+				jsonFetchProjectFlows(project, ret, req, resp);
+			}
+		}
+		else if (jsonName.equals("changeDescription")) {
+			if (handleJsonPermission(project, user, Type.WRITE, ret)) {
+				jsonChangeDescription(project, ret, req, resp);
+			}
 		}
 		
 		this.writeJSON(resp, ret);
 	}
 	
+	private boolean handleJsonPermission(Project project, User user, Type type, Map<String, Object> ret) {
+		if (project.hasPermission(user, type)) {
+			return true;
+		}
+		
+		ret.put("error", "Permission denied. Need " + type.toString() + " access.");
+		return false;
+	}
+	
+	private void jsonChangeDescription(Project project, HashMap<String, Object> ret, HttpServletRequest req, HttpServletResponse resp) throws ServletException {
+		String description = getParam(req, "description");
+		project.setDescription(description);
+		
+		try {
+			manager.commitProject(project.getName());
+		} catch (ProjectManagerException e) {
+			ret.put("error", e.getMessage());
+		}
+	}
+	
 	private void jsonFetchProjectFlows(Project project, HashMap<String, Object> ret, HttpServletRequest req, HttpServletResponse resp) throws ServletException {
 		ArrayList<Map<String,Object>> flowList = new ArrayList<Map<String,Object>>();
 		for (Flow flow: project.getFlows()) {
@@ -364,6 +394,9 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 				page.add("errorMsg", "Project " + projectName + " not found.");
 			}
 			else {
+				if (project.hasPermission(user, Type.ADMIN)) {
+					page.add("admin", true);
+				}
 				page.add("project", project);
 				page.add("admins", Utils.flattenToString(project.getUsersWithPermission(Type.ADMIN), ","));
 				page.add("permissions", project.getUserPermission(user));
diff --git a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
index f7d52af..67780ff 100644
--- a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
@@ -57,7 +57,11 @@
 						<tr><td class="first">Created Date:</td><td>$utils.formatDate($project.lastModifiedTimestamp)</td></tr>
 						<tr><td class="first">Modified Date:</td><td>$utils.formatDate($project.createTimestamp)</td></tr>
 						<tr><td class="first">Last Modified by:</td><td>$project.lastModifiedUser</td></tr>
-						<tr><td class="first">Description:</td><td>$project.description</td></tr>
+						<tr><td class="first">Description:</td><td id="pdescription">$project.description</td>
+							#if($admin)
+								<td><div id="edit" class="btn5">Edit</div></td>
+							#end
+						</tr>
 					</table>
 				</div>
 
@@ -95,7 +99,7 @@
 						<tr><td class="last">No flows uploaded to this project.</td></tr>
 #end
 					</tbody>
-				</table
+				</table>
 			</div>
 #end
 		</div>
diff --git a/src/web/css/azkaban.css b/src/web/css/azkaban.css
index 43ffd2e..5f83039 100644
--- a/src/web/css/azkaban.css
+++ b/src/web/css/azkaban.css
@@ -1115,6 +1115,19 @@ table.parameters tr td {
 	padding-left: 10px;
 }
 
+#pdescription {
+	width: 70%;
+}
+
+.editTextArea {
+	width: 100%;
+}
+
+#edit {
+	width: 60px;
+	text-align: center;
+}
+
 /* old styles */
 
 .azkaban-charts .hitarea {
diff --git a/src/web/js/azkaban.main.view.js b/src/web/js/azkaban.main.view.js
index e452b07..a614a4a 100644
--- a/src/web/js/azkaban.main.view.js
+++ b/src/web/js/azkaban.main.view.js
@@ -61,6 +61,8 @@ azkaban.ProjectTableView= Backbone.View.extend({
   },
   createFlowListTable : function(data, innerTable) {
   	var flows = data.flows;
+  	flows.sort(function(a,b){return a.flowId.localeCompare(b.flowId);});
+  	
   	var requestURL = contextURL + "/manager?project=" + data.project + "&flow=";
   	for (var i = 0; i < flows.length; ++i) {
   		var id = flows[i].flowId;
diff --git a/src/web/js/azkaban.project.view.js b/src/web/js/azkaban.project.view.js
index 298eaec..b929c96 100644
--- a/src/web/js/azkaban.project.view.js
+++ b/src/web/js/azkaban.project.view.js
@@ -154,10 +154,62 @@ azkaban.FlowTableView= Backbone.View.extend({
   }
 });
 
+var projectSummary;
+azkaban.ProjectSummaryView= Backbone.View.extend({
+  events : {
+      "click #edit": "handleDescriptionEdit"
+  },
+  initialize : function(settings) {
+  },
+  handleDescriptionEdit : function(evt) {
+      console.log("Edit description");
+      var editText = $("#edit").text();
+      var descriptionTD = $('#pdescription');
+      
+      if (editText != "Edit") {
+          var requestURL = contextURL + "/manager";
+          var newText = $("#descEdit").val();
+
+          $.get(
+		      requestURL,
+		      {"project": projectId, "json":"changeDescription", "description":newText},
+		      function(data) {
+				if (data.error) {
+					alert(data.error);
+				}
+		      },
+		      "json"
+	    );
+          
+          $(descriptionTD).remove("#descEdit");
+          $(descriptionTD).text(newText);
+          
+          $("#edit").text("Edit");
+      }
+      else {
+      
+	      var text = $(descriptionTD).text();
+	      var edit = document.createElement("textarea");
+	      
+	      $(edit).addClass("editTextArea");
+	      $(edit).attr("id", "descEdit");
+	      $(edit).val(text);
+	      $(descriptionTD).text("");
+	      $(descriptionTD).append(edit);
+	      
+	      $("#edit").text("Commit");
+      }
+  },
+  render: function() {
+  }
+});
+
+
 $(function() {
 	projectView = new azkaban.ProjectView({el:$('#all-jobs-content')});
 	uploadView = new azkaban.UploadProjectView({el:$('#upload-project')});
 	flowTableView = new azkaban.FlowTableView({el:$('#flow-tabs')});
+	projectSummary = new azkaban.ProjectSummaryView({el:$('#project-summary')});
 	// Setting up the project tabs
 
 });