azkaban-aplcache
Changes
src/web/css/azkaban.css 13(+13 -0)
src/web/js/azkaban.main.view.js 2(+2 -0)
src/web/js/azkaban.project.view.js 52(+52 -0)
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>
src/web/css/azkaban.css 13(+13 -0)
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 {
src/web/js/azkaban.main.view.js 2(+2 -0)
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;
src/web/js/azkaban.project.view.js 52(+52 -0)
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
});