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 graphene.types import Field, List
from graphene.types.scalars import Boolean
from graphene.relay import ConnectionField, PageInfo
from graphql_relay.connection.arrayconnection import connection_from_list_slice
@ -39,6 +40,9 @@ class DjangoConnectionField(ConnectionField):
"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)
@property

View File

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