Ver código fonte

[security] Added pagination support for HDFS

Enrico Berti 11 anos atrás
pai
commit
052392260c

+ 6 - 2
apps/security/src/security/api/hdfs.py

@@ -21,7 +21,7 @@ from django.http import HttpResponse
 from django.utils.translation import ugettext as _
 
 from desktop.lib.exceptions_renderable import PopupException
-from filebrowser.views import listdir_paged
+from filebrowser.views import display, listdir_paged
 
 
 def _get_acl_name(acl):
@@ -48,7 +48,11 @@ def _diff_list_dir(user_listing, hdfs_listing):
 
 def list_hdfs(request, path):
   try:
-    json_response = listdir_paged(request, path)
+    stats = request.fs.stats(path)
+    if stats.isDir:
+        json_response = listdir_paged(request, path)
+    else:
+        json_response = display(request, path)
   except:
     json_response = HttpResponse(json.dumps({'files': []}), mimetype="application/json") # AccessControlException: Permission denied: user=test, access=READ_EXECUTE, inode="/tmp/dir":romain:supergroup:drwxr-xr-x:group::r-x,group:bob:---,group:test:---,default:user::rwx,default:group::r--,default:mask::r--,default:other::rwx (error 403)
   if json.loads(request.GET.get('isDiffMode', 'false')):

+ 1 - 1
apps/security/src/security/templates/hdfs.mako

@@ -218,7 +218,7 @@ ${ layout.menubar(section='hdfs') }
 </%def>
 
 
-${ tree.import_templates(itemClick='$root.assist.setPath', itemDblClick='$root.assist.openPath', itemSelected='$root.assist.path() == path()', iconModifier=treeIcons, styleModifier='aclBit', styleModifierPullRight=aclBitPullRight, anchorProperty='path') }
+${ tree.import_templates(itemClick='$root.assist.setPath', itemDblClick='$root.assist.openPath', itemSelected='$root.assist.path() == path()', iconModifier=treeIcons, styleModifier='aclBit', styleModifierPullRight=aclBitPullRight, anchorProperty='path', showMore='$root.assist.loadMore') }
 
 
 <script src="/static/ext/js/knockout-min.js" type="text/javascript" charset="utf-8"></script>

+ 39 - 13
apps/security/static/js/hdfs.ko.js

@@ -64,8 +64,8 @@ var Assist = function (vm, assist) {
   self.showAclsAsText = ko.observable(false);
   self.isDiffMode = ko.observable(false);
 
-  self.treeCollapseStatus = {};
-  self.treeLoadingStatus = {};
+  self.treeAdditionalData = {};
+  self.treeAdditionalDataObservable = ko.observable({});
   self.treeData = ko.observable({nodes: []});
   self.loadData = function (data) {
     self.treeData(new TreeNodeModel(data));
@@ -77,6 +77,7 @@ var Assist = function (vm, assist) {
     aclBit: false,
     striked: false,
     selected: false,
+    page: {},
     nodes: [
       {
         name: "/",
@@ -86,6 +87,7 @@ var Assist = function (vm, assist) {
         aclBit: false,
         striked: false,
         selected: false,
+        page: {},
         nodes: []
       }
     ]
@@ -93,9 +95,11 @@ var Assist = function (vm, assist) {
 
   self.path = ko.observable('');
   self.path.subscribe(function (path) {
+    self.pagenum(1);
     self.fetchPath();
     window.location.hash = path;
   });
+  self.pagenum = ko.observable(1);
   self.files = ko.observableArray();
 
   self.acls = ko.observableArray();
@@ -178,29 +182,41 @@ var Assist = function (vm, assist) {
         striked: item.striked != null,
         isExpanded: true,
         isDir: item.type == "dir",
+        page: {},
         nodes: []
       });
     }
     return leaf;
   }
 
-  self.updatePathExpanded = function (leaf, path, expanded) {
+  self.getTreeAdditionalDataForPath = function (path) {
+    if (typeof self.treeAdditionalData[path] == "undefined"){
+      var _add = {
+        loaded: false,
+        page: {}
+      }
+      self.treeAdditionalData[path] = _add;
+      self.treeAdditionalDataObservable(self.treeAdditionalData);
+    }
+    return self.treeAdditionalData[path];
+  }
+
+  self.updatePathProperty = function (leaf, path, property, value) {
     if (leaf.path == path) {
-      leaf.isExpanded = expanded;
+      leaf[property] = value;
     }
     if (leaf.nodes.length > 0) {
       leaf.nodes.forEach(function (node) {
-        self.updatePathExpanded(node, path, expanded);
+        self.updatePathProperty(node, path, property, value);
       });
     }
     return leaf;
   }
 
   self.setPath = function (obj) {
-    if (self.treeLoadingStatus[obj.path()] != null && self.treeLoadingStatus[obj.path()]) {
+    if (self.getTreeAdditionalDataForPath(obj.path()).loaded == true) {
       obj.isExpanded(!obj.isExpanded());
-      self.updatePathExpanded(self.growingTree(), obj.path(), obj.isExpanded());
-      self.treeCollapseStatus[obj.path()] = obj.isExpanded();
+      self.updatePathProperty(self.growingTree(), obj.path(), "isExpanded", obj.isExpanded());
     }
     self.path(obj.path());
   }
@@ -228,20 +244,25 @@ var Assist = function (vm, assist) {
   self.fetchPath = function () {
 	$.getJSON('/security/api/hdfs/list' + self.path(), {
       'pagesize': 15,
+      'pagenum': self.pagenum(),
       'format': 'json',
       'doas': vm.doAs(),
-      'isDiffMode': self.isDiffMode(),
-    }, function (data) {
-      self.treeLoadingStatus[self.path()] = true;
+      'isDiffMode': self.isDiffMode()
+    },
+    function (data) {
+      self.getTreeAdditionalDataForPath(self.path()).loaded = true;
+      self.getTreeAdditionalDataForPath(self.path()).page = data.page;
+      self.treeAdditionalDataObservable(self.treeAdditionalData);
+      self.updatePathProperty(self.growingTree(), self.path(), "page", data.page);
       self.loadParents(data.breadcrumbs);
-      if (data['files'] && data['files'][0]['type'] == 'dir') { // Hack for now
+      if (data['files'] && data['files'][0] && data['files'][0]['type'] == 'dir') { // Hack for now
         self.files.removeAll();
         $.each(data.files, function (index, item) {
           self.convertItemToObject(item);
           self.files.push(ko.mapping.fromJS({
               'path': item.path,
               'aclBit': item.rwx.indexOf('+') != -1,
-              'striked': item.striked != null,
+              'striked': item.striked != null
             })
           );
         });
@@ -256,6 +277,11 @@ var Assist = function (vm, assist) {
     });
   };
 
+  self.loadMore = function (what) {
+    self.pagenum(what.page().next_page_number());
+    self.fetchPath();
+  }
+
   self.getAcls = function () {
     $(".jHueNotify").hide();
     var _isLoading = window.setTimeout(function () {

+ 9 - 7
desktop/core/src/desktop/templates/common_tree.mako

@@ -25,7 +25,7 @@
   from django.utils.translation import ugettext as _
 %>
 
-<%def name="import_templates(itemClick=None, itemDblClick=None, itemSelected=None, iconModifier=None, styleModifier=None, styleModifierPullRight=None, limitCount=None, limitFunction=None, anchorProperty=None)">
+<%def name="import_templates(itemClick=None, itemDblClick=None, itemSelected=None, iconModifier=None, styleModifier=None, styleModifierPullRight=None, showMore=None, anchorProperty=None)">
 
   <script src="/static/js/ko.tree.js" type="text/javascript" charset="utf-8"></script>
 
@@ -41,20 +41,22 @@
   </script>
 
   <script type="text/html" id="folder-template">
-    <!-- ko if: nodes != null -->
-    <ul data-bind="foreach: nodes">
+    <ul>
+      <!-- ko foreach: nodes -->
       <li>
         <div data-bind="template: { name: 'node-template', data: $data }"></div>
       </li>
-      <!-- ko if: $index() == 14 -->
+      <!-- /ko -->
+      %if showMore:
+      <!-- ko if: page().number() != page().num_pages() -->
       <li>
-        <a href="javascript: void(0)">
-          <i class="fa fa-plus"></i>
+        <a href="javascript: void(0)" data-bind="click: ${showMore}" style="padding-left: 8px">
+          <i class="fa fa-plus"></i> ${_('Show more...')}
         </a>
       </li>
       <!-- /ko -->
+      %endif
     </ul>
-    <!-- /ko -->
   </script>
 
   <script type="text/html" id="node-template">

+ 1 - 0
desktop/core/static/js/ko.tree.js

@@ -20,6 +20,7 @@ var TreeNodeModel = function(data) {
   self.description = ko.observable();
   self.name = ko.observable();
   self.nodes = ko.observableArray([]);
+  self.page = ko.observable();
 
   self.toggleVisibility = function() {
     self.isExpanded(! self.isExpanded());