浏览代码

HUE-6704 [fb] Handle empty page error on filebrowser filter requests

Jenny Kim 8 年之前
父节点
当前提交
1c76aa9d0f
共有 2 个文件被更改,包括 19 次插入5 次删除
  1. 12 5
      apps/filebrowser/src/filebrowser/views.py
  2. 7 0
      apps/filebrowser/src/filebrowser/views_test.py

+ 12 - 5
apps/filebrowser/src/filebrowser/views.py

@@ -33,6 +33,7 @@ from cStringIO import StringIO
 from gzip import GzipFile
 from gzip import GzipFile
 
 
 from django.contrib.auth.models import User, Group
 from django.contrib.auth.models import User, Group
+from django.core.paginator import EmptyPage
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.template.defaultfilters import stringformat, filesizeformat
 from django.template.defaultfilters import stringformat, filesizeformat
 from django.http import Http404, HttpResponse, HttpResponseNotModified, HttpResponseForbidden
 from django.http import Http404, HttpResponse, HttpResponseNotModified, HttpResponseForbidden
@@ -451,8 +452,13 @@ def listdir_paged(request, path):
 
 
 
 
     # Do pagination
     # Do pagination
-    page = paginator.Paginator(all_stats, pagesize).page(pagenum)
-    shown_stats = page.object_list
+    try:
+      page = paginator.Paginator(all_stats, pagesize).page(pagenum)
+      shown_stats = page.object_list
+    except EmptyPage:
+      logger.warn("No results found for requested page.")
+      page = None
+      shown_stats = []
 
 
     # Include parent dir always as second option, unless at filesystem root.
     # Include parent dir always as second option, unless at filesystem root.
     if not request.fs.isroot(path):
     if not request.fs.isroot(path):
@@ -472,7 +478,8 @@ def listdir_paged(request, path):
     current_stat['name'] = "."
     current_stat['name'] = "."
     shown_stats.insert(1, current_stat)
     shown_stats.insert(1, current_stat)
 
 
-    page.object_list = [ _massage_stats(request, s) for s in shown_stats ]
+    if page:
+      page.object_list = [ _massage_stats(request, s) for s in shown_stats ]
 
 
     is_trash_enabled = request.fs._get_scheme(path) == 'hdfs' and \
     is_trash_enabled = request.fs._get_scheme(path) == 'hdfs' and \
                        (request.fs.isdir(_home_trash_path(request.fs, request.user, path)) or
                        (request.fs.isdir(_home_trash_path(request.fs, request.user, path)) or
@@ -484,8 +491,8 @@ def listdir_paged(request, path):
         'breadcrumbs': breadcrumbs,
         'breadcrumbs': breadcrumbs,
         'current_request_path': request.path,
         'current_request_path': request.path,
         'is_trash_enabled': is_trash_enabled,
         'is_trash_enabled': is_trash_enabled,
-        'files': page.object_list,
-        'page': _massage_page(page),
+        'files': page.object_list if page else [],
+        'page': _massage_page(page) if page else None,
         'pagesize': pagesize,
         'pagesize': pagesize,
         'home_directory': request.fs.isdir(home_dir_path) and home_dir_path or None,
         'home_directory': request.fs.isdir(home_dir_path) and home_dir_path or None,
         'descending': descending_param,
         'descending': descending_param,

+ 7 - 0
apps/filebrowser/src/filebrowser/views_test.py

@@ -508,6 +508,13 @@ class TestFileBrowserWithHadoop(object):
     listing = self.c.get('/filebrowser/view=' + BASE + '?filter=1&sortby=name&descending=true&pagesize=1&pagenum=2').context['files']
     listing = self.c.get('/filebrowser/view=' + BASE + '?filter=1&sortby=name&descending=true&pagesize=1&pagenum=2').context['files']
     assert_equal(['..', '.', '1'], [ f['name'] for f in listing ])
     assert_equal(['..', '.', '1'], [ f['name'] for f in listing ])
 
 
+    # Check filter with empty results
+    resp = self.c.get('/filebrowser/view=' + BASE + '?filter=empty&sortby=name&descending=true&pagesize=1&pagenum=2')
+    listing = resp.context['files']
+    assert_equal([], listing)
+    page = resp.context['page']
+    assert_equal(None, page)
+
 
 
   def test_view_snappy_compressed(self):
   def test_view_snappy_compressed(self):
     if not snappy_installed():
     if not snappy_installed():