Skip to content

Commit

Permalink
Merge pull request chibisov#75 from alexander-akhmetov/sql_queryset
Browse files Browse the repository at this point in the history
fix queryset.query.__str__() with EmptyResultSet
  • Loading branch information
chibisov committed Feb 26, 2015
2 parents 54c3217 + 45ec0ad commit 67e8c46
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 9 deletions.
Binary file modified docs/index.html
Binary file not shown.
1 change: 1 addition & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2172,6 +2172,7 @@ You can read about versioning, deprecation policy and upgrading from

#### Development version

* Fixed `ListSqlQueryKeyBit` and `RetrieveSqlQueryKeyBit` [problems](https://github.com/chibisov/drf-extensions/issues/28) with `EmptyResultSet` exception ([pull](https://github.com/chibisov/drf-extensions/pull/75/)).
* All items are now by default in [ArgsKeyBit](#argskeybit), [KwargsKeyBit](#kwargskeybit) and [QueryParamsKeyBit](#queryparamskeybit)

#### 0.2.7
Expand Down
26 changes: 17 additions & 9 deletions rest_framework_extensions/key_constructor/bits.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
from django.utils.translation import get_language
from django.db.models.query import EmptyQuerySet
from django.db.models.sql.datastructures import EmptyResultSet

from rest_framework_extensions.compat import force_text


Expand Down Expand Up @@ -176,28 +178,34 @@ def get_data(self, **kwargs):
return super(PaginationKeyBit, self).get_data(**kwargs)


class ListSqlQueryKeyBit(KeyBitBase):
def get_data(self, params, view_instance, view_method, request, args, kwargs):
queryset = view_instance.filter_queryset(view_instance.get_queryset())
class SqlQueryKeyBitBase(KeyBitBase):
def _get_queryset_query_string(self, queryset):
if isinstance(queryset, EmptyQuerySet):
return None
else:
return force_text(queryset.query.__str__())
try:
return force_text(queryset.query.__str__())
except EmptyResultSet:
return None


class ListSqlQueryKeyBit(SqlQueryKeyBitBase):
def get_data(self, params, view_instance, view_method, request, args, kwargs):
queryset = view_instance.filter_queryset(view_instance.get_queryset())
return self._get_queryset_query_string(queryset)


class RetrieveSqlQueryKeyBit(KeyBitBase):
class RetrieveSqlQueryKeyBit(SqlQueryKeyBitBase):
def get_data(self, params, view_instance, view_method, request, args, kwargs):
lookup_value = view_instance.kwargs[view_instance.lookup_field]
try:
queryset = view_instance.filter_queryset(view_instance.get_queryset()).filter(
**{view_instance.lookup_field: lookup_value}
)
if isinstance(queryset, EmptyQuerySet):
return None
else:
return force_text(queryset.query.__str__())
except ValueError:
return None
else:
return self._get_queryset_query_string(queryset)


class ArgsKeyBit(AllArgsMixin, KeyBitBase):
Expand Down
10 changes: 10 additions & 0 deletions tests_app/tests/unit/key_constructor/bits/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,11 @@ def test_should_return_none_if_empty_queryset(self):
response = ListSqlQueryKeyBit().get_data(**self.kwargs)
self.assertEqual(response, None)

def test_should_return_none_if_empty_result_set_raised(self):
self.kwargs['view_instance'].filter_queryset = lambda x: x.filter(pk__in=[])
response = ListSqlQueryKeyBit().get_data(**self.kwargs)
self.assertEqual(response, None)


class RetrieveSqlQueryKeyBitTest(TestCase):
def setUp(self):
Expand Down Expand Up @@ -443,6 +448,11 @@ def test_should_return_none_if_empty_queryset(self):
response = RetrieveSqlQueryKeyBit().get_data(**self.kwargs)
self.assertEqual(response, None)

def test_should_return_none_if_empty_result_set_raised(self):
self.kwargs['view_instance'].filter_queryset = lambda x: x.filter(pk__in=[])
response = RetrieveSqlQueryKeyBit().get_data(**self.kwargs)
self.assertEqual(response, None)


class ArgsKeyBitTest(TestCase):
def setUp(self):
Expand Down

0 comments on commit 67e8c46

Please sign in to comment.