added know_parent bool field in connectionfield

This commit is contained in:
Mardanov Timur Rustemovich 2019-01-29 10:28:59 +03:00
parent 612eebdd55
commit 3af66f6903
2 changed files with 15 additions and 9 deletions

View File

@ -6,6 +6,7 @@ from promise import Promise
from neomodel import NodeSet from neomodel import NodeSet
from graphene.types import Field, List from graphene.types import Field, List
from graphene.types.scalars import Boolean
from graphene.relay import ConnectionField, PageInfo from graphene.relay import ConnectionField, PageInfo
from graphql_relay.connection.arrayconnection import connection_from_list_slice from graphql_relay.connection.arrayconnection import connection_from_list_slice
@ -39,6 +40,9 @@ class DjangoConnectionField(ConnectionField):
"enforce_first_or_last", "enforce_first_or_last",
graphene_settings.RELAY_CONNECTION_ENFORCE_FIRST_OR_LAST, graphene_settings.RELAY_CONNECTION_ENFORCE_FIRST_OR_LAST,
) )
kwargs.setdefault('know_parent', Boolean(default_value=False,
description='Know parent type in nodes?'
' \n Default = <False>'))
super(DjangoConnectionField, self).__init__(*args, **kwargs) super(DjangoConnectionField, self).__init__(*args, **kwargs)
@property @property

View File

@ -43,7 +43,6 @@ class DjangoFilterConnectionField(DjangoConnectionField):
self._filterset_class = get_filterset_class( self._filterset_class = get_filterset_class(
self._provided_filterset_class, **meta self._provided_filterset_class, **meta
) )
return self._filterset_class return self._filterset_class
@property @property
@ -116,8 +115,7 @@ class DjangoFilterConnectionField(DjangoConnectionField):
source_class = default_manager.source source_class = default_manager.source
def new_resolver(root, info, **args): def new_resolver(root, info, **args):
# filters
#filters
filters = dict(filter(lambda x: '__' in x[0], args.items())) filters = dict(filter(lambda x: '__' in x[0], args.items()))
qs = resolver(root, info, **args) qs = resolver(root, info, **args)
if qs is None: if qs is None:
@ -127,25 +125,29 @@ class DjangoFilterConnectionField(DjangoConnectionField):
base_filters, relationship_filters = make_qs(filters) base_filters, relationship_filters = make_qs(filters)
qs = qs.filter().filter(base_filters) qs = qs.filter().filter(base_filters)
# has filtering
if relationship_filters: if relationship_filters:
rels = {} rels = {}
# check that this field has relationship in model class
for item in relationship_filters.items(): for item in relationship_filters.items():
rel_field = getattr(source_class, item[0], None) rel_field = getattr(source_class, item[0], None)
if rel_field is None: if rel_field is None:
raise Exception('This relationship field not found ' raise Exception('This relationship field not found '
'in source class') 'in source class: {class_}'.format(class_=source_class.__name__))
node_class = rel_field.build_manager(0, item[0]).definition['node_class'] # build definition of node_class - source_class( which
rels[item[0]] = node_class.nodes.get(uid=item[1]) # must filter by uid - node_class.nodes.get(uid=item[1]))
node_class=rel_field.build_manager(0, item[0]).definition['node_class']
rels[item[0]]=node_class.nodes.get(uid=item[1])
for item in rels.items(): for item in rels.items():
qs = qs.has(**{item[0]: item[1]}) qs=qs.has(**{item[0]: item[1]})
if order: if order:
qs = qs.order_by(order) qs=qs.order_by(order)
# set parent to child fields # set parent to child fields
# in ''_parent'' attribute # in ''_parent'' attribute
if _parent and root is not None: if _parent and root is not None:
instances = [] instances=[]
for instance in qs: for instance in qs:
setattr(instance, '_parent', root) setattr(instance, '_parent', root)
instances.append(instance) instances.append(instance)