From 3af66f6903bac490f81519fd8221998470cef43f Mon Sep 17 00:00:00 2001 From: Mardanov Timur Rustemovich Date: Tue, 29 Jan 2019 10:28:59 +0300 Subject: [PATCH] added know_parent bool field in connectionfield --- graphene_django/fields.py | 4 ++++ graphene_django/filter/fields.py | 20 +++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/graphene_django/fields.py b/graphene_django/fields.py index 9c87696..612a582 100644 --- a/graphene_django/fields.py +++ b/graphene_django/fields.py @@ -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 = ')) super(DjangoConnectionField, self).__init__(*args, **kwargs) @property diff --git a/graphene_django/filter/fields.py b/graphene_django/filter/fields.py index 8320a4e..bb08724 100644 --- a/graphene_django/filter/fields.py +++ b/graphene_django/filter/fields.py @@ -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)