diff --git a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index d25ea39..ceccb4d 100644
--- a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -727,21 +727,49 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
private void handleProjectLogsPage(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException, IOException {
Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/projectlogpage.vm");
-
String projectName = getParam(req, "project");
-
- Project project = projectManager.getProject(projectName);
- if (project == null) {
- page.add("errorMsg", "Project " + projectName + " doesn't exist.");
+
+ User user = session.getUser();
+ Project project = null;
+ try {
+ project = projectManager.getProject(projectName);
+ if (project == null) {
+ page.add("errorMsg", "Project " + projectName + " doesn't exist.");
+ }
+ else {
+ if (!hasPermission(project,user,Type.READ)) {
+ throw new AccessControlException( "No permission to view project " + projectName + ".");
+ }
+
+ page.add("project", project);
+ page.add("admins", Utils.flattenToString(project.getUsersWithPermission(Type.ADMIN), ","));
+ Permission perm = this.getPermissionObject(project, user, Type.ADMIN);
+ page.add("userpermission", perm);
+
+ boolean adminPerm = perm.isPermissionSet(Type.ADMIN);
+ if (adminPerm) {
+ page.add("admin", true);
+ }
+ // Set this so we can display execute buttons only to those who have access.
+ if (perm.isPermissionSet(Type.EXECUTE) || adminPerm) {
+ page.add("exec", true);
+ }
+ else {
+ page.add("exec", false);
+ }
+ }
}
- page.add("projectName", projectName);
+ catch (AccessControlException e) {
+ page.add("errorMsg", e.getMessage());
+ }
+
//page.add("projectManager", projectManager);
//int bytesSkip = 0;
int numBytes = 1024;
- // Really sucks if we do a lot of these because it'll eat up memory fast. But it's expected
- // that this won't be a heavily used thing. If it is, then we'll revisit it to make it more stream
- // friendly.
+ // Really sucks if we do a lot of these because it'll eat up memory fast.
+ // But it's expected that this won't be a heavily used thing. If it is,
+ // then we'll revisit it to make it more stream friendly.
StringBuffer buffer = new StringBuffer(numBytes);
page.add("log", buffer.toString());
diff --git a/src/java/azkaban/webapp/servlet/velocity/jobnav.vm b/src/java/azkaban/webapp/servlet/velocity/jobnav.vm
index 70f974e..bb27f16 100644
--- a/src/java/azkaban/webapp/servlet/velocity/jobnav.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/jobnav.vm
@@ -14,7 +14,7 @@
* the License.
*#
- <ul class="nav nav-tabs">
+ <ul class="nav nav-pills">
<li#if($job_page == 'properties') class="active"#end><a href="${context}/manager?project=${project.name}&flow=${flowid}&job=${jobid}">Job</a></li>
<li#if($job_page == 'history') class="active"#end><a id="jobs-logs-btn" href="${context}/manager?project=${project.name}&job=$jobid&history">History</a></li>
</ul>
diff --git a/src/java/azkaban/webapp/servlet/velocity/projectlogpage.vm b/src/java/azkaban/webapp/servlet/velocity/projectlogpage.vm
index 1bf473a..3a5a7c7 100644
--- a/src/java/azkaban/webapp/servlet/velocity/projectlogpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/projectlogpage.vm
@@ -31,8 +31,9 @@
var timezone = "${timezone}";
var errorMessage = null;
var successMessage = null;
-
- var projectName = "${projectName}";
+
+ var projectId = ${project.id};
+ var projectName = "$project.name";
</script>
</head>
<body>
diff --git a/src/java/azkaban/webapp/servlet/velocity/projectnav.vm b/src/java/azkaban/webapp/servlet/velocity/projectnav.vm
index c19a6ab..01952bf 100644
--- a/src/java/azkaban/webapp/servlet/velocity/projectnav.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/projectnav.vm
@@ -14,7 +14,7 @@
* the License.
*#
- <ul class="nav nav-tabs">
+ <ul class="nav nav-pills">
<li#if($project_page == 'flows') class="active"#end><a href="${context}/manager?project=${project.name}">Flows</a></li>
<li#if($project_page == 'permissions') class="active"#end><a id="project-permission-btn" href="${context}/manager?project=${project.name}&permissions">Permissions</a></li>
#if ($admin)
diff --git a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
index e96d96e..543cc9a 100644
--- a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
@@ -104,6 +104,13 @@
#foreach ($flow in $flows)
<div class="panel panel-info" flow="${flow.id}" project="${project.name}">
<div class="panel-heading flow-expander" id="${flow.id}">
+ #if (${exec})
+ <div class="pull-right">
+ <button type="button" class="btn btn-xs btn-primary execute-flow" flowId="${flow.id}">Execute Flow</button>
+ <a href="${context}/manager?project=${project.name}&flow=${flow.id}#executions" class="btn btn-primary btn-xs">Executions</a>
+ <a href="${context}/manager?project=${project.name}&flow=${flow.id}#summary" class="btn btn-primary btn-xs">Summary</a>
+ </div>
+ #end
<a href="${context}/manager?project=${project.name}&flow=${flow.id}">${flow.id}</a>
</div>
<div id="${flow.id}-child" class="panel-collapse collapse">
@@ -112,13 +119,6 @@
</tbody>
</table>
</div>
- <div class="panel-footer">
- #if (${exec})
- <button type="button" class="btn btn-sm btn-primary execute-flow" flowId="${flow.id}">Execute Flow</button>
- <a href="${context}/manager?project=${project.name}&flow=${flow.id}#executions" class="btn btn-primary btn-sm">Executions</a>
- <a href="${context}/manager?project=${project.name}&flow=${flow.id}#summary" class="btn btn-primary btn-sm">Summary</a>
- #end
- </div>
</div>
#end
#else