From a34e7dbc3bada7ee05c47a382901a4823dad7a3d Mon Sep 17 00:00:00 2001 From: gabn88 Date: Sat, 19 Mar 2016 10:01:15 +0100 Subject: [PATCH 01/10] Update sorting_tags.py python 3 or django 1.8 fix (don't know which was the culprit) --- 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 7cdeb42..9e306ae 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -21,7 +21,7 @@ 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" + raise TemplateSyntaxError("anchor tag takes at least 1 argument") try: title = bits[2] except IndexError: @@ -79,7 +79,7 @@ def render(self, context): def autosort(parser, token): bits = [b.strip('"\'') for b in token.split_contents()] if len(bits) != 2: - raise TemplateSyntaxError, "autosort tag takes exactly one argument" + raise TemplateSyntaxError("autosort tag takes exactly one argument") return SortedDataNode(bits[1]) class SortedDataNode(template.Node): From 9d3424f4582c3d971b5fbb97693a53e4092e2109 Mon Sep 17 00:00:00 2001 From: gabn88 Date: Mon, 21 Mar 2016 20:55:58 +0100 Subject: [PATCH 02/10] Update sorting_tags.py --- django_sorting/templatetags/sorting_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index 9e306ae..1afc5d3 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -79,7 +79,7 @@ def render(self, context): def autosort(parser, token): bits = [b.strip('"\'') for b in token.split_contents()] if len(bits) != 2: - raise TemplateSyntaxError("autosort tag takes exactly one argument") + raise template.TemplateSyntaxError("autosort tag takes exactly one argument") return SortedDataNode(bits[1]) class SortedDataNode(template.Node): From a5d1f586ed1f4a60bd99b5bc6ad61a4f76dc7ded Mon Sep 17 00:00:00 2001 From: gabn88 Date: Mon, 21 Mar 2016 22:03:37 +0100 Subject: [PATCH 03/10] Update sorting_tags.py --- django_sorting/templatetags/sorting_tags.py | 29 ++++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index 1afc5d3..b0dcadc 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -21,7 +21,7 @@ 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") + raise template.TemplateSyntaxError, "anchor tag takes at least 1 argument" try: title = bits[2] except IndexError: @@ -76,11 +76,24 @@ def render(self, context): return '%s' % (url, self.title, title) + def autosort(parser, token): - bits = [b.strip('"\'') for b in token.split_contents()] - if len(bits) != 2: - raise template.TemplateSyntaxError("autosort tag takes exactly one argument") - return SortedDataNode(bits[1]) + bits = token.split_contents() + if len(bits) not in (2, 4): + raise template.TemplateSyntaxError, "autosort tag takes exactly one argument" + try: + if bits[2] != 'as': + raise template.TemplateSyntaxError( + "Context variable assignment must take the form of {%% %s" + " queryset as context_var_name %%}" % bits[0] + ) + except IndexError: + pass + try: + return SortedDataNode(bits[1], bits[-1]) + except IndexError: + return SortedDataNode(bits[1]) + class SortedDataNode(template.Node): """ @@ -91,7 +104,10 @@ def __init__(self, queryset_var, context_var=None): self.context_var = context_var def render(self, context): - key = self.queryset_var.var + if self.context_var is None: + key = self.queryset_var.var + else: + key = self.context_var value = self.queryset_var.resolve(context) order_by = context['request'].field if len(order_by) > 1: @@ -109,4 +125,3 @@ def render(self, context): anchor = register.tag(anchor) autosort = register.tag(autosort) - From b41d26c6b1ed4dec668f57ffed8fadff9425f44e Mon Sep 17 00:00:00 2001 From: gabn88 Date: Mon, 21 Mar 2016 22:04:44 +0100 Subject: [PATCH 04/10] Update sorting_tags.py --- 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 b0dcadc..5272342 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -21,7 +21,7 @@ def anchor(parser, token): """ bits = [b.strip('"\'') for b in token.split_contents()] if len(bits) < 2: - raise template.TemplateSyntaxError, "anchor tag takes at least 1 argument" + raise template.TemplateSyntaxError("anchor tag takes at least 1 argument") try: title = bits[2] except IndexError: @@ -80,7 +80,7 @@ def render(self, context): def autosort(parser, token): bits = token.split_contents() if len(bits) not in (2, 4): - raise template.TemplateSyntaxError, "autosort tag takes exactly one argument" + raise template.TemplateSyntaxError("autosort tag takes exactly one argument") try: if bits[2] != 'as': raise template.TemplateSyntaxError( From 5828f7b15a87081de5b063e6dbca286e24b51456 Mon Sep 17 00:00:00 2001 From: gabn88 Date: Fri, 21 Jul 2017 14:44:21 +0200 Subject: [PATCH 05/10] updated for latest middleware and removed self.REQUEST self.REQUEST is replaced by self.GET and self.POST --- django_sorting/middleware.py | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/django_sorting/middleware.py b/django_sorting/middleware.py index cd8a076..9a67d47 100644 --- a/django_sorting/middleware.py +++ b/django_sorting/middleware.py @@ -1,17 +1,39 @@ +try: + from django.utils.deprecation import MiddlewareMixin +except ImportError: + MiddlewareMixin = object + + def get_field(self): try: - field = self.REQUEST['sort'] - except (KeyError, ValueError, TypeError): + get = self.GET + if 'sort' in get: + field = get['sort'] + else: + post = self.POST + if 'sort' in post: + field = post['sort'] + else: + field = '' + except AttributeError: field = '' return (self.direction == 'desc' and '-' or '') + field def get_direction(self): try: - return self.REQUEST['dir'] - except (KeyError, ValueError, TypeError): + get = self.GET + if 'dir' in get: + return get['dir'] + else: + post = self.POST + if 'dir' in post: + return post['sort'] + else: + return 'desc' + except AttributeError: return 'desc' -class SortingMiddleware(object): +class SortingMiddleware(MiddlewareMixin): """ Inserts a variable representing the field (with direction of sorting) onto the request object if it exists in either **GET** or **POST** @@ -19,4 +41,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 6cff8b5e863ee3b15eaff018d8ce60ca110d92cd Mon Sep 17 00:00:00 2001 From: gabn88 Date: Mon, 23 Jul 2018 18:40:14 +0200 Subject: [PATCH 06/10] Update sorting_tags.py Make title translatable --- django_sorting/templatetags/sorting_tags.py | 26 +++++++++++++-------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index 5272342..888dd24 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -6,34 +6,34 @@ DEFAULT_SORT_UP = getattr(settings, 'DEFAULT_SORT_UP' , '↑') DEFAULT_SORT_DOWN = getattr(settings, 'DEFAULT_SORT_DOWN' , '↓') -INVALID_FIELD_RAISES_404 = getattr(settings, +INVALID_FIELD_RAISES_404 = getattr(settings, 'SORTING_INVALID_FIELD_RAISES_404' , False) sort_directions = { - 'asc': {'icon':DEFAULT_SORT_UP, 'inverse': 'desc'}, - 'desc': {'icon':DEFAULT_SORT_DOWN, 'inverse': 'asc'}, - '': {'icon':DEFAULT_SORT_DOWN, 'inverse': 'asc'}, + 'asc': {'icon':DEFAULT_SORT_UP, 'inverse': 'desc'}, + 'desc': {'icon':DEFAULT_SORT_DOWN, 'inverse': 'asc'}, + '': {'icon':DEFAULT_SORT_DOWN, 'inverse': 'asc'}, } def anchor(parser, token): """ - Parses a tag that's supposed to be in this format: {% anchor field title %} + Parses a tag that's supposed to be in this format: {% anchor field title %} """ bits = [b.strip('"\'') for b in token.split_contents()] if len(bits) < 2: raise template.TemplateSyntaxError("anchor tag takes at least 1 argument") try: - title = bits[2] + title = template.Variable(bits[2]) except IndexError: title = bits[1].capitalize() - return SortAnchorNode(bits[1].strip(), title.strip()) - + return SortAnchorNode(bits[1].strip(), title) + class SortAnchorNode(template.Node): """ - Renders an HTML tag with a link which href attribute + Renders an HTML tag with a link which href attribute includes the field on which we sort and the direction. - and adds an up or down arrow if the field is the one + and adds an up or down arrow if the field is the one currently being sorted on. Eg. @@ -67,6 +67,12 @@ def render(self, context): urlappend = "&%s" % getvars.urlencode() else: urlappend = '' + + try: + self.title = self.title.resolve(context).strip() + except template.VariableDoesNotExist: + self.title = str(self.title.var).strip() + if icon: title = "%s %s" % (self.title, icon) else: From e186832a39253ab474db8badec4546b8c88bcb1b Mon Sep 17 00:00:00 2001 From: gabn88 Date: Sat, 28 Jul 2018 22:41:41 +0200 Subject: [PATCH 07/10] Update sorting_tags.py --- django_sorting/templatetags/sorting_tags.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index 888dd24..0003946 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -72,6 +72,8 @@ def render(self, context): self.title = self.title.resolve(context).strip() except template.VariableDoesNotExist: self.title = str(self.title.var).strip() + except AttributeError: + self.title = str(self.title) if icon: title = "%s %s" % (self.title, icon) From 5682b0636e835c6a15b57cc773a884ac2a256a69 Mon Sep 17 00:00:00 2001 From: gabn88 Date: Tue, 24 Mar 2020 20:42:55 +0100 Subject: [PATCH 08/10] Update sorting tags for rendering variables as field and title --- django_sorting/templatetags/sorting_tags.py | 41 ++++++++++----------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index 0003946..167d2e7 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -18,15 +18,14 @@ def anchor(parser, token): """ Parses a tag that's supposed to be in this format: {% anchor field title %} - """ - bits = [b.strip('"\'') for b in token.split_contents()] - if len(bits) < 2: - raise template.TemplateSyntaxError("anchor tag takes at least 1 argument") + """ try: - title = template.Variable(bits[2]) + + tag_name, field, title = token.split_contents() except IndexError: - title = bits[1].capitalize() - return SortAnchorNode(bits[1].strip(), title) + tag_name, field = token.split_contents() + title = field.capitalize() + return SortAnchorNode(field, title) class SortAnchorNode(template.Node): @@ -42,10 +41,17 @@ class SortAnchorNode(template.Node): """ def __init__(self, field, title): - self.field = field - self.title = title + self.field = template.Variable(field) + self.title = template.Variable(title) def render(self, context): + self.rendered_field = self.field.resolve(context) + try: + self.rendered_title = self.title.resolve(context) + except template.VariableDoesNotExist: + self.rendered_title = self.title + except AttributeError: + self.rendered_title = self.title request = context['request'] getvars = request.GET.copy() if 'sort' in getvars: @@ -58,7 +64,7 @@ def render(self, context): del getvars['dir'] else: sortdir = '' - if sortby == self.field: + if sortby == self.rendered_field: getvars['dir'] = sort_directions[sortdir]['inverse'] icon = sort_directions[sortdir]['icon'] else: @@ -68,20 +74,13 @@ def render(self, context): else: urlappend = '' - try: - self.title = self.title.resolve(context).strip() - except template.VariableDoesNotExist: - self.title = str(self.title.var).strip() - except AttributeError: - self.title = str(self.title) - if icon: - title = "%s %s" % (self.title, icon) + title = "%s %s" % (self.rendered_title, icon) else: - title = self.title + title = self.rendered_title - url = '%s?sort=%s%s' % (request.path, self.field, urlappend) - return '%s' % (url, self.title, title) + url = '%s?sort=%s%s' % (request.path, self.rendered_field, urlappend) + return '%s' % (url, self.rendered_title, title) From ead56a32d0b129e608826b6462c01a1c4e51ef53 Mon Sep 17 00:00:00 2001 From: gabn88 Date: Tue, 24 Mar 2020 22:13:01 +0100 Subject: [PATCH 09/10] Update sorting_tags.py Fix issue with template field does not exist --- django_sorting/templatetags/sorting_tags.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index 167d2e7..a508410 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -45,13 +45,19 @@ def __init__(self, field, title): self.title = template.Variable(title) def render(self, context): - self.rendered_field = self.field.resolve(context) + try: + self.rendered_field = self.field.resolve(context) + except template.VariableDoesNotExist: + self.rendered_field = str(self.field) try: self.rendered_title = self.title.resolve(context) except template.VariableDoesNotExist: - self.rendered_title = self.title + self.rendered_title = str(self.title) except AttributeError: - self.rendered_title = self.title + self.rendered_title = str(self.title) + + self.rendered_title = self.rendered_title.capitalize() + request = context['request'] getvars = request.GET.copy() if 'sort' in getvars: From 5809ce68d020fd302e35ee90a07660d2628a321c Mon Sep 17 00:00:00 2001 From: gabn88 Date: Mon, 8 Mar 2021 20:51:53 +0100 Subject: [PATCH 10/10] Update sorting_tags.py minor --- django_sorting/templatetags/sorting_tags.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/django_sorting/templatetags/sorting_tags.py b/django_sorting/templatetags/sorting_tags.py index a508410..fae37db 100644 --- a/django_sorting/templatetags/sorting_tags.py +++ b/django_sorting/templatetags/sorting_tags.py @@ -56,8 +56,6 @@ def render(self, context): except AttributeError: self.rendered_title = str(self.title) - self.rendered_title = self.rendered_title.capitalize() - request = context['request'] getvars = request.GET.copy() if 'sort' in getvars: