from django.core.paginator import Paginator


def paginate(request, queryset, per_page=12, page_param='page'):
    """Return (page_obj, query_string, page_range) preserving GET filters except page."""
    paginator = Paginator(queryset, per_page)
    page_obj = paginator.get_page(request.GET.get(page_param))
    query_params = request.GET.copy()
    query_params.pop(page_param, None)
    query_string = query_params.urlencode()
    page_range = paginator.get_elided_page_range(
        page_obj.number,
        on_each_side=1,
        on_ends=1,
    )
    return page_obj, query_string, page_range
