Example #1
0
def _paginated(request, objects, context):
    session_prefs = context.preferences(request)
    
    pagesize = context.pagesize(request, session_prefs)
    
    list_template = context.list_template(request, session_prefs)
    page = context.page(request)
    sort, objects = context.sorted(objects, request, session_prefs)

    paginator = Paginator(objects, pagesize)
    paginator.list_template = list_template
    
    try:
        page_obj = paginator.page(page)
    except EmptyPage:
        logging.error('Found invalid page number "%s", loading %s, refered by %s' % (
            request.GET.get(context.PAGE, ''), request.path, request.META.get('HTTP_REFERER', 'UNKNOWN')
        ))
        raise Http404()

    if context.base_path:
        base_path = context.base_path
    else:
        base_path = request.path
        get_params = generate_uri(request.GET, (context.PAGE, context.PAGESIZE, context.SORT, context.TEMPLATE))

        if get_params:
            base_path += "?" + get_params

    url_joiner = "?" in base_path and "&" or "?"


    def get_page():
        object_list = page_obj.object_list

        #if hasattr(object_list, 'lazy'):
        #    return object_list.lazy()
        return object_list
    paginator.page = get_page()

    total_pages = paginator.num_pages

    if total_pages > 1:

        total_pages = paginator.num_pages

        has_previous = page > 1
        has_next = page < total_pages

        range_start = page - context.visible_page_range / 2
        range_end = page + context.visible_page_range / 2

        if range_start < 1:
            range_end = context.visible_page_range
            range_start = 1

        if range_end > total_pages:
            range_start = total_pages - context.visible_page_range + 1
            range_end = total_pages
            if range_start < 1:
                range_start = 1

        page_numbers = []

        if sort:
            url_builder = lambda n: mark_safe("%s%s%s=%s&amp;%s=%s" % (escape(base_path), url_joiner, context.SORT, sort, context.PAGE, n))
        else:
            url_builder = lambda n: mark_safe("%s%s%s=%s" % (escape(base_path), url_joiner, context.PAGE, n))

        if range_start > (context.outside_page_range + 1):
            page_numbers.append([(n, url_builder(n)) for n in range(1, context.outside_page_range + 1)])
            page_numbers.append(None)
        elif range_start > 1:
            page_numbers.append([(n, url_builder(n)) for n in range(1, range_start)])

        page_numbers.append([(n, url_builder(n)) for n in range(range_start, range_end + 1)])

        if range_end < (total_pages - context.outside_page_range):
            page_numbers.append(None)
            page_numbers.append([(n, url_builder(n)) for n in range(total_pages - context.outside_page_range + 1, total_pages + 1)])
        elif range_end < total_pages:
            page_numbers.append([(n, url_builder(n)) for n in range(range_end + 1, total_pages + 1)])

        page_numbers_context = {
            'has_previous': has_previous,
            'previous_url': has_previous and url_builder(page - 1) or None,
            'has_next': has_next,
            'next_url': has_next and url_builder(page + 1) or None,
            'current': page,
            'page_numbers': page_numbers
        }

        paginator.page_numbers_context = page_numbers_context

        def page_nums():
            return page_numbers_template.render(template.Context(page_numbers_context))

        paginator.page_numbers = page_nums
    else:
        paginator.page_numbers = ''

    if pagesize:
        def page_sizes():
            if sort:
                url_builder = lambda s: mark_safe("%s%s%s=%s&amp;%s=%s" % (escape(base_path), url_joiner, context.SORT, sort, context.PAGESIZE, s))
            else:
                url_builder = lambda s: mark_safe("%s%s%s=%s" % (escape(base_path), url_joiner, context.PAGESIZE, s))

            sizes = [(s, url_builder(s)) for s in context.pagesizes]

            return page_sizes_template.render(template.Context({
                'current': pagesize,
                'sizes': sizes
            }))

        paginator.page_sizes = page_sizes
    else:
        paginator.page_sizes = ''

    if sort:
        def sort_tabs():
            url_builder = lambda s: mark_safe("%s%s%s=%s" % (escape(base_path), url_joiner, context.SORT, s))
            sorts = [(n, s.label, url_builder(n), strip_tags(s.description)) for n, s in context.sort_methods.items()]

            for name, label, url, descr in sorts:
                paginator.__dict__['%s_sort_link' % name] = smart_unicode(url)            
                
            return sort_tabs_template.render(template.Context({
                'current': sort,
                'sorts': sorts,
                'sticky': session_prefs.get('sticky_sort', False),
            }))
        paginator.sort_tabs = sort_tabs()
        paginator.sort_description = mark_safe(context.sort_methods[sort].description)
        paginator.current_sort = sort
    else:
        paginator.sort_tabs = paginator.sort_description = ''
        paginator.current_sort = ''

    def template_tabs():
        if sort:
            template_path = "".join( (base_path, url_joiner, context.SORT, "=", sort, "&", context.TEMPLATE) )
        else:
            template_path = "".join( (base_path, url_joiner, context.TEMPLATE) )
                
        if list_template == 'kafelki.html':
            return mark_safe("""
            <div id="viewselect">
            <a id="grid" href="%s=kafelki.html" title="%s" class="on"><img src="%s" width="15" height="15"></a>
            <a id="list" href="%s=lista.html" title="%s"><img src="%s" width="15" height="15"></a></div>
            """ % (template_path, _("Switch to grid view"), media("/media/images/grid_view_on.png"), 
                   template_path, _("Switch to list view"), media("/media/images/list_view.png")))
        else:                             
            return mark_safe("""
            <div id="viewselect">
            <a id="grid" href="%s=kafelki.html" title="%s"><img src="%s" width="15" height="15"></a>
            <a id="list" href="%s=lista.html" title="%s" class="on"><img src="%s" width="15" height="15"></a></div>
            """ % (template_path, _("Switch to grid view"), media("/media/images/grid_view.png"), 
                   template_path, _("Switch to list view"), media("/media/images/list_view_on.png")))

    paginator.template_tabs = template_tabs
    context.set_preferences(request, session_prefs)
    objects.paginator = paginator
    return objects