Pārlūkot izejas kodu

[filebrowser] Unify breadcrumb display

* Show the root breadcrumb as a '/'.
* Fixed unit tests on breadcrumbs.
* HTML-escape all breadcrumbs.
bc Wong 13 gadi atpakaļ
vecāks
revīzija
3a36390486

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

@@ -25,6 +25,7 @@
   dirname_enc = urlencode(view['dirname'])
   dirname_enc = urlencode(view['dirname'])
   base_url = url('filebrowser.views.view', path=path_enc)
   base_url = url('filebrowser.views.view', path=path_enc)
 %>
 %>
+<%namespace name="fb_components" file="fb_components.mako" />
 
 
 ${commonheader(truncate(filename)+' :: File Viewer', 'filebrowser')}
 ${commonheader(truncate(filename)+' :: File Viewer', 'filebrowser')}
 
 
@@ -32,19 +33,7 @@ ${commonheader(truncate(filename)+' :: File Viewer', 'filebrowser')}
 
 
 <div class="container-fluid">
 <div class="container-fluid">
 	% if breadcrumbs:
 	% 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
 	%endif
 </div>
 </div>
 
 

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

@@ -23,23 +23,13 @@
   path_enc = urlencode(path)
   path_enc = urlencode(path)
   dirname_enc = urlencode(dirname)
   dirname_enc = urlencode(dirname)
 %>
 %>
+<%namespace name="fb_components" file="fb_components.mako" />
+
 ${commonheader(truncate(filename)+':: File Viewer', 'filebrowser')}
 ${commonheader(truncate(filename)+':: File Viewer', 'filebrowser')}
 
 
 <div class="container-fluid">
 <div class="container-fluid">
 	% if breadcrumbs:
 	% 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
 	%endif
 </div>
 </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
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## 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()">
 <%def name="footer()">
       <div class="fb-uploader jframe-hidden">
       <div class="fb-uploader jframe-hidden">
@@ -60,3 +29,25 @@ from django.template.defaultfilters import urlencode, escape
     </body>
     </body>
   </html>
   </html>
 </%def>
 </%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="dir" file="listdir_components.mako" />
+<%namespace name="fb_components" file="fb_components.mako" />
 
 
 ${commonheader('File Browser', 'filebrowser')}
 ${commonheader('File Browser', 'filebrowser')}
 <div class="container-fluid">
 <div class="container-fluid">
 	<h1>File Browser</h1>
 	<h1>File Browser</h1>
 	% if breadcrumbs:
 	% 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
 	%endif
     <div id="dirlist" class="view">
     <div id="dirlist" class="view">
     ${dir.list_table_browser(files, path_enc, current_request_path, cwd_set)}
     ${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.lib import xxd
 from filebrowser.forms import RenameForm, UploadForm, MkDirForm, RmDirForm, RmTreeForm,\
 from filebrowser.forms import RenameForm, UploadForm, MkDirForm, RmDirForm, RmTreeForm,\
     RemoveForm, ChmodForm, ChownForm, EditorForm
     RemoveForm, ChmodForm, ChownForm, EditorForm
-from hadoop.fs import normpath
+from hadoop.fs.hadoopfs import Hdfs
 
 
 
 
 DEFAULT_CHUNK_SIZE_BYTES = 1024 * 4 # 4KB
 DEFAULT_CHUNK_SIZE_BYTES = 1024 * 4 # 4KB
@@ -161,7 +161,7 @@ def edit(request, path, form=None):
         path=path,
         path=path,
         filename=os.path.basename(path),
         filename=os.path.basename(path),
         dirname=os.path.dirname(path),
         dirname=os.path.dirname(path),
-		breadcrumbs = parse_breadcrumbs(path))
+        breadcrumbs = parse_breadcrumbs(path))
     return render("edit.mako", request, data)
     return render("edit.mako", request, data)
 
 
 
 
@@ -273,9 +273,9 @@ def _do_newfile_save(fs, path, data, encoding):
 
 
 
 
 def parse_breadcrumbs(path):
 def parse_breadcrumbs(path):
-    breadcrumbs_parts = path.split('/')
+    breadcrumbs_parts = Hdfs.normpath(path).split('/')
     i = 1
     i = 1
-    breadcrumbs = [{'url': '', 'label': '.'}]
+    breadcrumbs = [{'url': '', 'label': '/'}]
     while (i < len(breadcrumbs_parts)):
     while (i < len(breadcrumbs_parts)):
         breadcrumb_url = breadcrumbs[i - 1]['url'] + '/' + breadcrumbs_parts[i]
         breadcrumb_url = breadcrumbs[i - 1]['url'] + '/' + breadcrumbs_parts[i]
         if breadcrumb_url != '/':
         if breadcrumb_url != '/':
@@ -318,7 +318,7 @@ def listdir(request, path, chooser):
     stats = request.fs.listdir_stats(path)
     stats = request.fs.listdir_stats(path)
 
 
     # Include parent dir, unless at filesystem root.
     # 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_path = request.fs.join(path, "..")
         parent_stat = request.fs.stats(parent_path)
         parent_stat = request.fs.stats(parent_path)
         # The 'path' field would be absolute, but we want its basename to be
         # 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.
     into the format that the views would like it in.
     """
     """
     path = stats['path']
     path = stats['path']
-    normalized = normpath(path)
+    normalized = Hdfs.normpath(path)
     return {
     return {
         'path': normalized,
         'path': normalized,
         'name': posixpath.basename(path),
         'name': posixpath.basename(path),