Add feature to processor to generate based on related_models

This commit is contained in:
Alejandro Nunez Capote 2019-06-08 09:41:46 -04:00
parent 1836b8b4c2
commit 8692c82266
3 changed files with 37 additions and 30 deletions

View File

@ -4,7 +4,7 @@ from collections import OrderedDict
from elasticsearch_dsl import Q from elasticsearch_dsl import Q
from graphene import Enum, InputObjectType, Field, Int, Float from graphene import Enum, InputObjectType, Field, Int, Float
from django_elasticsearch_dsl import StringField, TextField, BooleanField, IntegerField, FloatField, LongField, \ from django_elasticsearch_dsl import StringField, TextField, BooleanField, IntegerField, FloatField, LongField, \
ShortField, DoubleField, DateField, KeywordField ShortField, DoubleField, DateField, KeywordField, ObjectField
from django.utils import six from django.utils import six
from django_filters.utils import try_dbfield from django_filters.utils import try_dbfield
@ -18,22 +18,10 @@ FILTER_FOR_ESFIELD_DEFAULTS = {
TextField: {'filter_class': StringFilterES}, TextField: {'filter_class': StringFilterES},
BooleanField: {'filter_class': BoolFilterES}, BooleanField: {'filter_class': BoolFilterES},
IntegerField: {'filter_class': NumberFilterES}, IntegerField: {'filter_class': NumberFilterES},
FloatField: {'filter_class': NumberFilterES, FloatField: {'filter_class': NumberFilterES, 'argument': Float()},
'extra': { LongField: {'filter_class': NumberFilterES, 'argument': Int()},
'argument': Float() ShortField: {'filter_class': NumberFilterES, 'argument': Int()},
}}, DoubleField: {'filter_class': NumberFilterES, 'argument': Int()},
LongField: {'filter_class': NumberFilterES,
'extra': {
'argument': Int()
}},
ShortField: {'filter_class': NumberFilterES,
'extra': {
'argument': Int()
}},
DoubleField: {'filter_class': NumberFilterES,
'extra': {
'argument': Int()
}},
DateField: {'filter_class': StringFilterES}, DateField: {'filter_class': StringFilterES},
KeywordField: {'filter_class': StringFilterES}, KeywordField: {'filter_class': StringFilterES},
} }
@ -219,8 +207,12 @@ class FilterSetESMetaclass(type):
meta_filters = OrderedDict() meta_filters = OrderedDict()
for name, index_field, data in index_fields: for name, index_field, data in index_fields:
filter_class = mcs.get_filter_exp(name, index_field, data) if isinstance(index_field, ObjectField):
meta_filters.update({name: filter_class}) filters_class = mcs.get_filter_object(name, index_field, data)
meta_filters.update(filters_class)
else:
filter_class = mcs.get_filter_exp(name, index_field, data)
meta_filters.update({name: filter_class})
return meta_filters return meta_filters
@ -254,7 +246,7 @@ class FilterSetESMetaclass(type):
:param field: ES index field :param field: ES index field
:param data: lookup_expr :param data: lookup_expr
""" """
index_fields = [] index_fields = OrderedDict()
properties = field._doc_class._doc_type.mapping.properties._params.get('properties', {}) properties = field._doc_class._doc_type.mapping.properties._params.get('properties', {})
@ -263,8 +255,11 @@ class FilterSetESMetaclass(type):
if data and inner_name not in data: if data and inner_name not in data:
# This inner field is not filterable # This inner field is not filterable
continue continue
inner_data = data[inner_name] if data else None inner_data = data[inner_name] if data else None
index_fields.append(mcs.get_filter_exp(inner_name, inner_field, inner_data, root=name))
filter_exp = mcs.get_filter_exp(inner_name, inner_field, inner_data, root=name)
index_fields.update({inner_name: filter_exp})
return index_fields return index_fields
@ -280,14 +275,10 @@ class FilterSetESMetaclass(type):
field_data = try_dbfield(FILTER_FOR_ESFIELD_DEFAULTS.get, field.__class__) or {} field_data = try_dbfield(FILTER_FOR_ESFIELD_DEFAULTS.get, field.__class__) or {}
filter_class = field_data.get('filter_class') filter_class = field_data.get('filter_class')
extra = field_data.get('extra', {}) kwargs = copy.deepcopy(data) if data is not None else {}
kwargs = copy.deepcopy(extra)
# Get lookup_expr from configuration
if data and 'lookup_expressions' in data:
kwargs['lookup_expressions'] = set(data['lookup_expressions'])
kwargs['field_name'], kwargs['field_name_es'] = mcs.get_name(name, root, data) kwargs['field_name'], kwargs['field_name_es'] = mcs.get_name(name, root, data)
return filter_class(**kwargs) return filter_class(**kwargs)
@staticmethod @staticmethod

View File

@ -1,7 +1,7 @@
from graphene import ObjectType from graphene import ObjectType
from django_elasticsearch_dsl import DocType, Index from django_elasticsearch_dsl import DocType, Index, fields
from graphene_django.tests.models import Article from graphene_django.tests.models import Article, Reporter
from graphene_django.filter.tests.test_fields import ArticleNode from graphene_django.filter.tests.test_fields import ArticleNode
from graphene_django.elasticsearch.filter import filters from graphene_django.elasticsearch.filter import filters
from graphene_django.elasticsearch.filter.fields import DjangoESFilterConnectionField from graphene_django.elasticsearch.filter.fields import DjangoESFilterConnectionField
@ -24,6 +24,13 @@ class ArticleDocument(DocType):
'lang', 'lang',
'importance', 'importance',
] ]
related_models = (Reporter,)
reporter = fields.ObjectField(properties={
'id': fields.IntegerField(),
'first_name': fields.KeywordField(),
'email': fields.KeywordField(),
})
class ArticleFilterESAsField(FilterSetES): class ArticleFilterESAsField(FilterSetES):
@ -64,7 +71,8 @@ class ArticleFilterESInMetaDict(FilterSetES):
'lte', 'lte',
'gte', 'gte',
] ]
} },
'reporter': {},
} }

View File

@ -136,6 +136,14 @@ def test_filter_in_meta_dict():
) )
def test_filter_in_meta_dict_foreign():
filter_generation(
"articlesInMetaDict",
"reporterEamail: \"A mail\"",
Bool(must=[Match(reporter__email={'query': 'A mail', 'fuzziness': 'auto'})]),
)
def test_filter_in_multi_field(): def test_filter_in_multi_field():
filter_generation( filter_generation(
"articlesInMultiField", "articlesInMultiField",