thin logic

This commit is contained in:
Shtarev 2015-06-25 21:14:00 +03:00
parent 745d8d0004
commit e8b23c4789

View File

@ -58,6 +58,7 @@ class DjangoFilterBackend(BaseFilterBackend):
class Meta: class Meta:
model = queryset.model model = queryset.model
fields = filter_fields fields = filter_fields
return AutoFilterSet return AutoFilterSet
return None return None
@ -98,22 +99,24 @@ class SearchFilter(BaseFilterBackend):
if not search_fields: if not search_fields:
return queryset return queryset
if settings.DATABASES[queryset.db]["ENGINE"] == "django.db.backends.oracle":
# Remember queryset for Oracle db users
original_queryset = queryset
orm_lookups = [self.construct_search(six.text_type(search_field)) orm_lookups = [self.construct_search(six.text_type(search_field))
for search_field in search_fields] for search_field in search_fields]
and_queries = []
for search_term in self.get_search_terms(request): for search_term in self.get_search_terms(request):
or_queries = [models.Q(**{orm_lookup: search_term}) or_queries = [models.Q(**{orm_lookup: search_term})
for orm_lookup in orm_lookups] for orm_lookup in orm_lookups]
and_queries.append(reduce(operator.or_, or_queries)) queryset = queryset.filter(reduce(operator.or_, or_queries))
if settings.DATABASES[queryset.db]["ENGINE"] != "django.db.backends.oracle":
# Oracle db don't support distinct on *LOB fields
queryset = queryset.distinct()
if settings.DATABASES[queryset.db]["ENGINE"] == "django.db.backends.oracle":
# distinct analogue for Oracle users
queryset = original_queryset.filter(pk__in=set(queryset.values_list('pk', flat=True)))
if and_queries:
# According to Oracle DB limits there is no capability to make a DISTINT on *LOB
if settings.DATABASES[queryset.db]["ENGINE"] == "django.db.backends.oracle":
pk_list = queryset.filter(reduce(operator.and_, and_queries)).values_list('pk', flat=True)
return queryset.filter(pk__in=frozenset(pk_list))
else:
return queryset.filter(reduce(operator.and_, and_queries)).distinct()
return queryset return queryset
@ -160,7 +163,7 @@ class OrderingFilter(BaseFilterBackend):
field.source or field_name field.source or field_name
for field_name, field in serializer_class().fields.items() for field_name, field in serializer_class().fields.items()
if not getattr(field, 'write_only', False) if not getattr(field, 'write_only', False)
] ]
elif valid_fields == '__all__': elif valid_fields == '__all__':
# View explicitly allows filtering on any model field # View explicitly allows filtering on any model field
valid_fields = [field.name for field in queryset.model._meta.fields] valid_fields = [field.name for field in queryset.model._meta.fields]
@ -182,6 +185,7 @@ class DjangoObjectPermissionsFilter(BaseFilterBackend):
A filter backend that limits results to those where the requesting user A filter backend that limits results to those where the requesting user
has read object level permissions. has read object level permissions.
""" """
def __init__(self): def __init__(self):
assert guardian, 'Using DjangoObjectPermissionsFilter, but django-guardian is not installed' assert guardian, 'Using DjangoObjectPermissionsFilter, but django-guardian is not installed'