From 40e79b11a0e24685a5b42a1b4010d298fc25df5f Mon Sep 17 00:00:00 2001 From: pmichal Date: Wed, 26 Feb 2014 10:45:08 +0100 Subject: [PATCH 1/9] Add multiple fields sorting (part1) --- django_sorting/templatetags/sorting_tags.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index 7cdeb42..8593f75 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -22,12 +22,9 @@ def anchor(parser, token): bits = [b.strip('"\'') for b in token.split_contents()] if len(bits) < 2: raise TemplateSyntaxError, "anchor tag takes at least 1 argument" - try: - title = bits[2] - except IndexError: - title = bits[1].capitalize() - return SortAnchorNode(bits[1].strip(), title.strip()) - + sort_tag = ','.join(bits[1:-1]) + return SortAnchorNode(sort_tag, bits[-1].strip()) + class SortAnchorNode(template.Node): """ From 7c7762525863665066bcc1495e7841e5a3bb313b Mon Sep 17 00:00:00 2001 From: pmichal Date: Wed, 26 Feb 2014 10:46:21 +0100 Subject: [PATCH 2/9] Add multiple fields sorting (part2) --- django_sorting/middleware.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/django_sorting/middleware.py b/django_sorting/middleware.py index cd8a076..77dceef 100644 --- a/django_sorting/middleware.py +++ b/django_sorting/middleware.py @@ -2,8 +2,11 @@ def get_field(self): try: field = self.REQUEST['sort'] except (KeyError, ValueError, TypeError): - field = '' - return (self.direction == 'desc' and '-' or '') + field + pass + else: + for key in field.split(','): + ordering.append((self.direction == 'desc' and '-' or '') + key) + return ordering def get_direction(self): try: @@ -19,4 +22,4 @@ class SortingMiddleware(object): """ def process_request(self, request): request.__class__.field = property(get_field) - request.__class__.direction = property(get_direction) \ No newline at end of file + request.__class__.direction = property(get_direction) From 82e29a8893084d8b09f5ed394b123146a463abfc Mon Sep 17 00:00:00 2001 From: pmichal Date: Wed, 26 Feb 2014 10:47:25 +0100 Subject: [PATCH 3/9] Add multiple fields sorting (part3) --- django_sorting/templatetags/sorting_tags.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index 8593f75..c281cdd 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -91,9 +91,9 @@ def render(self, context): key = self.queryset_var.var value = self.queryset_var.resolve(context) order_by = context['request'].field - if len(order_by) > 1: + if len(order_by) > 0: try: - context[key] = value.order_by(order_by) + context[key] = value.order_by(*order_by) except template.TemplateSyntaxError: if INVALID_FIELD_RAISES_404: raise Http404('Invalid field sorting. If DEBUG were set to ' + From 7eb96171c459e12ad2bd4ed775f3b15e92635508 Mon Sep 17 00:00:00 2001 From: pmichal Date: Wed, 26 Feb 2014 10:49:20 +0100 Subject: [PATCH 4/9] Add multiple fields sorting (part4) --- django_sorting/middleware.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/django_sorting/middleware.py b/django_sorting/middleware.py index 77dceef..80a4cb2 100644 --- a/django_sorting/middleware.py +++ b/django_sorting/middleware.py @@ -5,7 +5,8 @@ def get_field(self): pass else: for key in field.split(','): - ordering.append((self.direction == 'desc' and '-' or '') + key) + if key: + ordering.append((self.direction == 'desc' and '-' or '') + key) return ordering def get_direction(self): From f06890bfd00f6f3170b16ddf8675d0f58aa7ac95 Mon Sep 17 00:00:00 2001 From: pmichal Date: Wed, 26 Feb 2014 12:14:22 +0100 Subject: [PATCH 5/9] Fix mistake --- django_sorting/middleware.py | 1 + 1 file changed, 1 insertion(+) diff --git a/django_sorting/middleware.py b/django_sorting/middleware.py index 80a4cb2..c0c4bb0 100644 --- a/django_sorting/middleware.py +++ b/django_sorting/middleware.py @@ -1,4 +1,5 @@ def get_field(self): + ordering = [] try: field = self.REQUEST['sort'] except (KeyError, ValueError, TypeError): From b0f0603b37218564e2abadf777735e01a0580712 Mon Sep 17 00:00:00 2001 From: pmichal Date: Fri, 20 Nov 2015 13:47:32 +0100 Subject: [PATCH 6/9] non model field sort protection --- django_sorting/templatetags/sorting_tags.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index c281cdd..e246308 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -1,4 +1,5 @@ from django import template +from django.core.exceptions import FieldError from django.http import Http404 from django.conf import settings @@ -94,7 +95,8 @@ def render(self, context): if len(order_by) > 0: try: context[key] = value.order_by(*order_by) - except template.TemplateSyntaxError: + context[key].first() # evaluate query to protect from being sorted by non model field + except (template.TemplateSyntaxError, FieldError): if INVALID_FIELD_RAISES_404: raise Http404('Invalid field sorting. If DEBUG were set to ' + 'False, an HTTP 404 page would have been shown instead.') From ac1021b8acd687be501a6422e0bda3d460b4079a Mon Sep 17 00:00:00 2001 From: pmichal Date: Thu, 28 Jan 2016 09:38:43 +0100 Subject: [PATCH 7/9] prevent passing wrong dir parameter --- django_sorting/templatetags/sorting_tags.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index e246308..e0abd2e 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -57,8 +57,11 @@ def render(self, context): else: sortdir = '' if sortby == self.field: - getvars['dir'] = sort_directions[sortdir]['inverse'] - icon = sort_directions[sortdir]['icon'] + try: + getvars['dir'] = sort_directions[sortdir]['inverse'] + icon = sort_directions[sortdir]['icon'] + except KeyError: + icon = DEFAULT_SORT_UP else: icon = '' if len(getvars.keys()) > 0: From 7450fe24d73f87d58f2757e54aed253a8e830579 Mon Sep 17 00:00:00 2001 From: pmichal Date: Thu, 20 Apr 2017 13:31:26 +0200 Subject: [PATCH 8/9] REQUEST deprecated --- django_sorting/middleware.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/django_sorting/middleware.py b/django_sorting/middleware.py index c0c4bb0..e255faa 100644 --- a/django_sorting/middleware.py +++ b/django_sorting/middleware.py @@ -1,7 +1,10 @@ def get_field(self): ordering = [] try: - field = self.REQUEST['sort'] + # REQUEST is deprecated as of Django 1.7. + field = self.POST.get('sort') + if field is None: + field = self.GET.get('sort') except (KeyError, ValueError, TypeError): pass else: @@ -12,7 +15,11 @@ def get_field(self): def get_direction(self): try: - return self.REQUEST['dir'] + # REQUEST is deprecated as of Django 1.7. + value = self.POST.get('dir') + if value is None: + value = self.GET.get('dir') + return value except (KeyError, ValueError, TypeError): return 'desc' From a841aad5b30997175541cb6bc1cee0e8db002730 Mon Sep 17 00:00:00 2001 From: pmichal Date: Thu, 20 Apr 2017 13:49:05 +0200 Subject: [PATCH 9/9] fix bug --- django_sorting/middleware.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django_sorting/middleware.py b/django_sorting/middleware.py index e255faa..6e974ff 100644 --- a/django_sorting/middleware.py +++ b/django_sorting/middleware.py @@ -4,7 +4,7 @@ def get_field(self): # REQUEST is deprecated as of Django 1.7. field = self.POST.get('sort') if field is None: - field = self.GET.get('sort') + field = self.GET.get('sort', '') except (KeyError, ValueError, TypeError): pass else: @@ -18,7 +18,7 @@ def get_direction(self): # REQUEST is deprecated as of Django 1.7. value = self.POST.get('dir') if value is None: - value = self.GET.get('dir') + value = self.GET.get('dir', '') return value except (KeyError, ValueError, TypeError): return 'desc'