def browser(request, path='', template="cloud_browser/browser.html"): """View files in a file path. :param request: The request. :param path: Path to resource, including container as first part of path. :param template: Template to render. """ from itertools import islice try: # pylint: disable=redefined-builtin from future_builtins import filter except ImportError: # pylint: disable=import-error from builtins import filter # Inputs. container_path, object_path = path_parts(path) incoming = request.POST or request.GET or {} marker = incoming.get('marker', None) marker_part = incoming.get('marker_part', None) if marker_part: marker = path_join(object_path, marker_part) # Get and adjust listing limit. limit_default = settings.CLOUD_BROWSER_DEFAULT_LIST_LIMIT def limit_test(num): return num > 0 and (MAX_LIMIT is None or num <= MAX_LIMIT - 1) limit = get_int(incoming.get('limit', limit_default), limit_default, limit_test) # Q1: Get all containers. # We optimize here by not individually looking up containers later, # instead going through this in-memory list. # TODO: Should page listed containers with a ``limit`` and ``marker``. conn = get_connection() containers = conn.get_containers() marker_part = None container = None objects = None if container_path != '': # Find marked container from list. def cont_eq(container): return container.name == container_path filtered_conts = filter(cont_eq, containers) cont_list = list(islice(filtered_conts, 1)) if not cont_list: raise Http404("No container at: %s" % container_path) # Q2: Get objects for instant list, plus one to check "next". container = cont_list[0] objects = container.get_objects(object_path, marker, limit + 1) marker = None # If over limit, strip last item and set marker. if len(objects) == limit + 1: objects = objects[:limit] marker = objects[-1].name marker_part = relpath(marker, object_path) return render( request, template, { 'path': path, 'marker': marker, 'marker_part': marker_part, 'limit': limit, 'breadcrumbs': _breadcrumbs(path), 'container_path': container_path, 'containers': containers, 'container': container, 'object_path': object_path, 'objects': objects })
def browser(request, path='', template="cloud_browser/browser.html"): """View files in a file path. :param request: The request. :param path: Path to resource, including container as first part of path. :param template: Template to render. """ from itertools import ifilter, islice # Inputs. container_path, object_path = path_parts(path) incoming = request.POST or request.GET or {} marker = incoming.get('marker', None) marker_part = incoming.get('marker_part', None) if marker_part: marker = path_join(object_path, marker_part) # Get and adjust listing limit. limit_default = settings.CLOUD_BROWSER_DEFAULT_LIST_LIMIT limit_test = lambda x: x > 0 and (MAX_LIMIT is None or x <= MAX_LIMIT - 1) limit = get_int(incoming.get('limit', limit_default), limit_default, limit_test) # Q1: Get all containers. # We optimize here by not individually looking up containers later, # instead going through this in-memory list. # TODO: Should page listed containers with a ``limit`` and ``marker``. conn = get_connection() containers = conn.get_containers() marker_part = None container = None objects = None if container_path != '': # Find marked container from list. cont_eq = lambda c: c.name == container_path cont_list = list(islice(ifilter(cont_eq, containers), 1)) if not cont_list: raise Http404("No container at: %s" % container_path) # Q2: Get objects for instant list, plus one to check "next". container = cont_list[0] objects = container.get_objects(object_path, marker, limit+1) marker = None # If over limit, strip last item and set marker. if len(objects) == limit + 1: objects = objects[:limit] marker = objects[-1].name marker_part = relpath(marker, object_path) return render_to_response(template, {'path': path, 'marker': marker, 'marker_part': marker_part, 'limit': limit, 'breadcrumbs': _breadcrumbs(path), 'container_path': container_path, 'containers': containers, 'container': container, 'object_path': object_path, 'objects': objects}, context_instance=RequestContext(request))