瀏覽代碼

[filebrowser] Unify breadcrumb display

* Show the root breadcrumb as a '/'.
* Fixed unit tests on breadcrumbs.
* HTML-escape all breadcrumbs.
bc Wong 13 年之前
父節點
當前提交
3a36390486

+ 2 - 13
apps/filebrowser/src/filebrowser/templates/display.mako

@@ -25,6 +25,7 @@
   dirname_enc = urlencode(view['dirname'])
   base_url = url('filebrowser.views.view', path=path_enc)
 %>
+<%namespace name="fb_components" file="fb_components.mako" />
 
 ${commonheader(truncate(filename)+' :: File Viewer', 'filebrowser')}
 
@@ -32,19 +33,7 @@ ${commonheader(truncate(filename)+' :: File Viewer', 'filebrowser')}
 
 <div class="container-fluid">
 	% if breadcrumbs:
-		<div class="subnav">
-		    <ul class="nav nav-pills">
-		      <li><a href="${url('filebrowser.views.view', path=urlencode(path))}?default_to_home"><i class="icon-home"></i> Home</a></li>
-		      <li>
-				<ul class="hueBreadcrumb">
-					% for breadcrumb_item in breadcrumbs:
-					<li><a href="/filebrowser/view${breadcrumb_item['url']}">${breadcrumb_item['label']}</a> <span class="divider">/</span></li>
-					% endfor
-				</ul>
-			  </li>
-		    </ul>
-		</div>
-		<br/>
+        ${fb_components.breadcrumbs(path, breadcrumbs)}
 	%endif
 </div>
 

+ 3 - 13
apps/filebrowser/src/filebrowser/templates/edit.mako

@@ -23,23 +23,13 @@
   path_enc = urlencode(path)
   dirname_enc = urlencode(dirname)
 %>
+<%namespace name="fb_components" file="fb_components.mako" />
+
 ${commonheader(truncate(filename)+':: File Viewer', 'filebrowser')}
 
 <div class="container-fluid">
 	% if breadcrumbs:
-		<div class="subnav">
-		    <ul class="nav nav-pills">
-		      <li><a href="${url('filebrowser.views.view', path=urlencode(path))}?default_to_home"><i class="icon-home"></i> Home</a></li>
-		      <li>
-				<ul class="hueBreadcrumb">
-					% for breadcrumb_item in breadcrumbs:
-					<li><a href="/filebrowser/view${breadcrumb_item['url']}">${breadcrumb_item['label']}</a> <span class="divider">/</span></li>
-					% endfor
-				</ul>
-			  </li>
-		    </ul>
-		</div>
-		<br/>
+        ${fb_components.breadcrumbs(path, breadcrumbs)}
 	%endif
 </div>
 

+ 23 - 32
apps/filebrowser/src/filebrowser/templates/fb_components.mako

@@ -14,39 +14,8 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 <%!
-import datetime
-from django.template.defaultfilters import urlencode, escape
+from django.template.defaultfilters import urlencode
 %>
-<%def name="header(path, current_request_path=False, toolbar=True, cwd_set=True, show_upload=True)">
-  <html>
-    <head>
-      <title>${path}</title>
-    </head>
-    <body>
-
-      % if toolbar:
-      <div class="toolbar">
-
-        <a href="${url('filebrowser.views.view', path='/')}"><img src="/filebrowser/static/art/icon_large.png" class="fb_icon"/></a>
-        % if current_request_path:
-          <div class="fb-actions" data-filters="ArtButtonBar">
-            % if home_directory:
-              <% my_home_disabled = "" %>
-            % else:
-              <% my_home_disabled = "disabled" %>
-            % endif
-            <a class="fb-home ${my_home_disabled}" data-filters="ArtButton" data-icon-styles="{'width' : 16, 'height': 16}" href="${url('filebrowser.views.view', path=(home_directory or "/"))}">My Home</a>
-            % if cwd_set:
-              % if show_upload:
-                <a class="fb-upload" data-filters="ArtButton" data-icon-styles="{'width' : 16, 'height': 16}" href="${url('filebrowser.views.upload')}?dest=${path|urlencode}&next=${current_request_path|urlencode}">Upload Files</a>
-              % endif
-              <a class="fb-mkdir" data-filters="ArtButton" data-icon-styles="{'width' : 16, 'height': 16}" href="${url('filebrowser.views.mkdir')}?path=${path|urlencode}&next=${current_request_path|urlencode}">New Directory</a>
-            % endif
-          </div>
-        % endif
-      </div>
-      % endif
-</%def>
 
 <%def name="footer()">
       <div class="fb-uploader jframe-hidden">
@@ -60,3 +29,25 @@ from django.template.defaultfilters import urlencode, escape
     </body>
   </html>
 </%def>
+
+<%def name="breadcrumbs(path, breadcrumbs)">
+    <div class="subnav">
+        <ul class="nav nav-pills">
+          <li><a href="${url('filebrowser.views.view', path=urlencode(path))}?default_to_home"><i class="icon-home"></i>Home</a></li>
+          <li>
+            <ul class="hueBreadcrumb">
+                % for breadcrumb_item in breadcrumbs:
+                    <% label = breadcrumb_item['label'] %>
+                    %if label == '/':
+                        <li><a href="/filebrowser/view${breadcrumb_item['url']}"><span
+                            class="divider">${label | h}<span></a></li>
+                    %else:
+                        <li><a href="/filebrowser/view${breadcrumb_item['url']}">${label | h}</a><span class="divider">/</span></li>
+                    %endif
+                % endfor
+            </ul>
+          </li>
+        </ul>
+    </div>
+    <br/>
+</%def>

+ 2 - 13
apps/filebrowser/src/filebrowser/templates/listdir.mako

@@ -20,24 +20,13 @@ from desktop.views import commonheader, commonfooter
 %>
 
 <%namespace name="dir" file="listdir_components.mako" />
+<%namespace name="fb_components" file="fb_components.mako" />
 
 ${commonheader('File Browser', 'filebrowser')}
 <div class="container-fluid">
 	<h1>File Browser</h1>
 	% if breadcrumbs:
-		<div class="subnav">
-		    <ul class="nav nav-pills">
-		      <li><a href="${url('filebrowser.views.view', path=urlencode(path))}?default_to_home"><i class="icon-home"></i> Home</a></li>
-		      <li>
-				<ul class="hueBreadcrumb">
-					% for breadcrumb_item in breadcrumbs:
-					<li><a href="/filebrowser/view${breadcrumb_item['url']}">${breadcrumb_item['label']}</a> <span class="divider">/</span></li>
-					% endfor
-				</ul>
-			  </li>
-		    </ul>
-		</div>
-		<br/>
+        ${fb_components.breadcrumbs(path, breadcrumbs)}
 	%endif
     <div id="dirlist" class="view">
     ${dir.list_table_browser(files, path_enc, current_request_path, cwd_set)}

+ 6 - 6
apps/filebrowser/src/filebrowser/views.py

@@ -45,7 +45,7 @@ from filebrowser.lib.rwx import filetype, rwx
 from filebrowser.lib import xxd
 from filebrowser.forms import RenameForm, UploadForm, MkDirForm, RmDirForm, RmTreeForm,\
     RemoveForm, ChmodForm, ChownForm, EditorForm
-from hadoop.fs import normpath
+from hadoop.fs.hadoopfs import Hdfs
 
 
 DEFAULT_CHUNK_SIZE_BYTES = 1024 * 4 # 4KB
@@ -161,7 +161,7 @@ def edit(request, path, form=None):
         path=path,
         filename=os.path.basename(path),
         dirname=os.path.dirname(path),
-		breadcrumbs = parse_breadcrumbs(path))
+        breadcrumbs = parse_breadcrumbs(path))
     return render("edit.mako", request, data)
 
 
@@ -273,9 +273,9 @@ def _do_newfile_save(fs, path, data, encoding):
 
 
 def parse_breadcrumbs(path):
-    breadcrumbs_parts = path.split('/')
+    breadcrumbs_parts = Hdfs.normpath(path).split('/')
     i = 1
-    breadcrumbs = [{'url': '', 'label': '.'}]
+    breadcrumbs = [{'url': '', 'label': '/'}]
     while (i < len(breadcrumbs_parts)):
         breadcrumb_url = breadcrumbs[i - 1]['url'] + '/' + breadcrumbs_parts[i]
         if breadcrumb_url != '/':
@@ -318,7 +318,7 @@ def listdir(request, path, chooser):
     stats = request.fs.listdir_stats(path)
 
     # Include parent dir, unless at filesystem root.
-    if normpath(path) != posixpath.sep:
+    if Hdfs.normpath(path) != posixpath.sep:
         parent_path = request.fs.join(path, "..")
         parent_stat = request.fs.stats(parent_path)
         # The 'path' field would be absolute, but we want its basename to be
@@ -358,7 +358,7 @@ def _massage_stats(request, stats):
     into the format that the views would like it in.
     """
     path = stats['path']
-    normalized = normpath(path)
+    normalized = Hdfs.normpath(path)
     return {
         'path': normalized,
         'name': posixpath.basename(path),