Skip to content

Commit 58216d6

Browse files
committed
Handle invalid values of nulls with 404 setting
1 parent ba22052 commit 58216d6

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

testproj/testproj/testapp/tests.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import django.template as django_template
22
from django.template.engine import Engine
33
from django.template.response import SimpleTemplateResponse
4-
from django.test import TestCase
54
from django.urls import reverse
5+
from webstack_django_sorting import settings
66

77
from . import models
88

@@ -99,3 +99,16 @@ def test_sorting_nulls_last(self):
9999
self.nulls_last_url, {"sort": "filename", "nulls": "last", "dir": "desc"}
100100
)
101101
self.assertQuerysetEqual(list(response.context["secret_files"]), values)
102+
103+
def test_check_values(self):
104+
# Internal INVALID_FIELD_RAISES_404 is set at loading (no override_settings)
105+
saved = settings.INVALID_FIELD_RAISES_404
106+
try:
107+
settings.INVALID_FIELD_RAISES_404 = True
108+
response = self.client.get(
109+
self.nulls_last_url, {"sort": "filename", "nulls": "foo", "dir": "asc"}
110+
)
111+
finally:
112+
settings.INVALID_FIELD_RAISES_404 = saved
113+
114+
self.assertEqual(response.status_code, 404)

webstack_django_sorting/common.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,18 @@
44
from operator import attrgetter
55

66
from django.db.models import F
7+
from django.http import Http404
78

8-
from .settings import SORT_DIRECTIONS
9+
from . import settings
910

1011

1112
def render_sort_anchor(request, field_name, title):
1213
get_params = request.GET.copy()
1314
sort_by = get_params.get("sort", None)
1415
if sort_by == field_name:
1516
# Render anchor link to next direction
16-
current_direction = SORT_DIRECTIONS.get(
17-
get_params.get("dir", ""), SORT_DIRECTIONS[""]
17+
current_direction = settings.SORT_DIRECTIONS.get(
18+
get_params.get("dir", ""), settings.SORT_DIRECTIONS[""]
1819
)
1920
icon = current_direction["icon"]
2021
next_direction_code = current_direction["next"]
@@ -89,6 +90,13 @@ def get_null_ordering(request, default_template_ordering=None):
8990
# Prioritize changes in URL parameter over the default template variable
9091
nulls_value = request.GET.get("nulls", default_template_ordering)
9192
if nulls_value:
93+
if nulls_value not in ("first", "last"):
94+
if settings.INVALID_FIELD_RAISES_404:
95+
raise Http404("The nulls query paramater should be 'first' or 'last'.")
96+
97+
# Else ignores invalid values
98+
return {}
99+
92100
return {f"nulls_{nulls_value}": True}
93101

94102
return {}

webstack_django_sorting/templatetags/sorting_tags.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
from django.http import Http404
33
from django.utils.translation import gettext_lazy as _
44

5-
from .. import common
6-
from ..settings import INVALID_FIELD_RAISES_404
5+
from .. import common, settings
76

87
register = template.Library()
98

@@ -81,17 +80,16 @@ def autosort(parser, token):
8180
if 2 > len(bits) > 7:
8281
raise template.TemplateSyntaxError(help_msg)
8382

84-
8583
context_var = None
8684
null_ordering = None
8785

8886
for index, bit in enumerate(bits):
8987
if index > 1:
90-
if bit == 'as' and index + 1 < len(bits):
88+
if bit == "as" and index + 1 < len(bits):
9189
context_var = bits[index + 1]
92-
del bits[index:index + 1]
93-
if bit.startswith('nulls'):
94-
null_ordering = bit[len('nulls='):]
90+
del bits[index : index + 1]
91+
if bit.startswith("nulls"):
92+
null_ordering = bit[len("nulls=") :]
9593

9694
return SortedDataNode(bits[1], null_ordering, context_var=context_var)
9795

@@ -114,14 +112,16 @@ def render(self, context):
114112

115113
queryset = self.queryset_var.resolve(context)
116114
order_by = common.get_order_by_from_request(context["request"])
117-
self.null_ordering = common.get_null_ordering(context["request"], self.null_ordering)
115+
self.null_ordering = common.get_null_ordering(
116+
context["request"], self.null_ordering
117+
)
118118

119119
try:
120120
context[key] = common.sort_queryset(queryset, order_by, self.null_ordering)
121121
except ValueError as e:
122122
raise template.TemplateSyntaxError from e
123123
except AttributeError:
124-
if INVALID_FIELD_RAISES_404:
124+
if settings.INVALID_FIELD_RAISES_404:
125125
raise Http404(
126126
"Invalid field sorting. If INVALID_FIELD_RAISES_404 were set to "
127127
"False, the error would have been ignored."

0 commit comments

Comments
 (0)