Browse Source

Fix 404 error page when data is empty on filtering page and pagination

devel
bashmak 8 years ago
parent
commit
1713beb93e
  1. 5
      abonapp/views.py
  2. 57
      djing/global_base_views.py

5
abonapp/views.py

@ -26,14 +26,13 @@ from dialing_app.models import AsteriskCDR
from statistics.models import getModel
from guardian.shortcuts import get_objects_for_user, assign_perm
from guardian.decorators import permission_required_or_403 as permission_required
from djing.global_base_views import OrderingMixin
from djing.global_base_views import OrderingMixin, BaseListWithFiltering
PAGINATION_ITEMS_PER_PAGE = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10)
@method_decorator([login_required, mydefs.only_admins], name='dispatch')
class BaseAbonListView(OrderingMixin, ListView):
class BaseAbonListView(OrderingMixin, BaseListWithFiltering):
paginate_by = PAGINATION_ITEMS_PER_PAGE
http_method_names = ['get']

57
djing/global_base_views.py

@ -1,14 +1,26 @@
from hashlib import sha256
from django.views.generic.base import View
from django.http.response import HttpResponseForbidden
from django.http.response import HttpResponseForbidden, Http404, HttpResponseRedirect
from django.utils.translation import gettext_lazy as _
from django.conf import settings
from django.views.generic import ListView
from netaddr import IPNetwork, IPAddress
from django.core.paginator import InvalidPage, EmptyPage
API_AUTH_SECRET = getattr(settings, 'API_AUTH_SECRET')
API_AUTH_SUBNET = getattr(settings, 'API_AUTH_SUBNET')
class RedirectWhenError(Exception):
def __init__(self, url, failed_message=None):
self.url = url
if failed_message is not None:
self.message = failed_message
def __str__(self):
return self.message or ''
class HashAuthView(View):
@staticmethod
@ -88,3 +100,44 @@ class OrderingMixin(object):
dfx = '-'
if order_by:
return "%s%s" % (dfx, order_by)
class BaseListWithFiltering(ListView):
"""
When queryset contains filter and pagination than data may be missing,
and original code is raising 404 error. We want to redirect without pagination.
"""
def paginate_queryset(self, queryset, page_size):
paginator = self.get_paginator(
queryset, page_size, orphans=self.get_paginate_orphans(),
allow_empty_first_page=self.get_allow_empty())
page_kwarg = self.page_kwarg
page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1
try:
page_number = int(page)
except ValueError:
if page == 'last':
page_number = paginator.num_pages
else:
raise Http404(_("Page is not 'last', nor can it be converted to an int."))
try:
page = paginator.page(page_number)
return paginator, page, page.object_list, page.has_other_pages()
except EmptyPage:
# remove pagination from url
url = self.request.GET.copy()
del url[self.page_kwarg]
raise RedirectWhenError("%s?%s" % (self.request.path, url.urlencode()),
_('Filter does not contains data, filter without pagination'))
except InvalidPage as e:
raise Http404(_('Invalid page (%(page_number)s): %(message)s') % {
'page_number': page_number,
'message': str(e)
})
def get(self, request, *args, **kwargs):
try:
return super(BaseListWithFiltering, self).get(request, *args, **kwargs)
except RedirectWhenError as e:
return HttpResponseRedirect(e.url)
Loading…
Cancel
Save