def _paginated(request, objects, context): session_prefs = context.preferences(request) pagesize = context.pagesize(request, session_prefs) page = context.page(request) sort, objects = context.sorted(objects, request, session_prefs) paginator = Paginator(objects, pagesize) 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)) 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&%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&%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 = '' context.set_preferences(request, session_prefs) objects.paginator = paginator return objects
def _paginated(request, objects, context): session_prefs = context.preferences(request) pagesize = context.pagesize(request, session_prefs) page = context.page(request) sort, objects = context.sorted(objects, request, session_prefs) paginator = Paginator(objects, pagesize) 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)) 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&%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&%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_text(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 = '' context.set_preferences(request, session_prefs) objects.paginator = paginator return objects
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&%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&%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