merge with neomodel branch (edges updated)

This commit is contained in:
MardanovTimur 2019-06-07 20:42:27 +03:00
commit ab52178a94
4 changed files with 25 additions and 21 deletions

View File

@ -11,7 +11,7 @@ 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
from .settings import graphene_settings from .settings import graphene_settings
from .utils import maybe_queryset, is_parent_set from .utils import maybe_queryset, is_parent_set, set_parent
class DjangoListField(Field): class DjangoListField(Field):
@ -183,11 +183,7 @@ class DjangoConnectionField(ConnectionField):
if qs is None: if qs is None:
qs = default_manager.filter() qs = default_manager.filter()
if _parent and root is not None: if _parent and root is not None:
instances = [] return list(map(lambda instance: set_parent(instance, root), qs))
for instance in qs:
setattr(instance, '_parent', root)
instances.append(instance)
return instances
return qs return qs
return cls.connection_resolver_original( return cls.connection_resolver_original(

View File

@ -6,7 +6,7 @@ from ..fields import DjangoConnectionField
from .utils import get_filterset_class, get_filtering_args_from_filterset, \ from .utils import get_filterset_class, get_filtering_args_from_filterset, \
make_qs make_qs
from ..utils import is_parent_set from ..utils import is_parent_set, set_parent
class DjangoFilterConnectionField(DjangoConnectionField): class DjangoFilterConnectionField(DjangoConnectionField):
@ -116,6 +116,7 @@ class DjangoFilterConnectionField(DjangoConnectionField):
order = args.get('order', None) order = args.get('order', None)
_parent = is_parent_set(info) _parent = is_parent_set(info)
if not _parent: if not _parent:
_parent = args.get('know_parent', False) _parent = args.get('know_parent', False)
@ -157,11 +158,7 @@ class DjangoFilterConnectionField(DjangoConnectionField):
# 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=[] return list(map(lambda instance: set_parent(instance, root), qs))
for instance in qs:
setattr(instance, '_parent', root)
instances.append(instance)
return instances
return qs return qs
if custom_resolver: if custom_resolver:

View File

@ -178,16 +178,16 @@ def list_resolver(node_type, edge_node) -> Callable:
rel_data = [] rel_data = []
relation_field = getattr(root, edge_node.target_field) relation_field = getattr(root, edge_node.target_field)
# know_parent == None or False, return all relationships
if not kwargs.get('know_parent'): if not kwargs.get('know_parent'):
for rel_node in relation_field.filter(): return relation_field.all_relationships()
rel_data.append(relation_field.relationship(rel_node))
else: else:
if not hasattr(root, '_parent'): if not hasattr(root, '_parent'):
raise EdgeNodeClass.parent_type_exception raise EdgeNodeClass.parent_type_exception
else: else:
rel_data = relation_field.filter_relationships(root._parent) rel_data = relation_field.all_relationships(root._parent)
if kwargs.get('id'): if kwargs.get('id'):
rel_data = relation_field.filter_relationships( rel_data = relation_field.all_relationships(
edge_node.target_model.nodes.get(uid=kwargs['id'])) edge_node.target_model.nodes.get(uid=kwargs['id']))
return rel_data return rel_data
@ -203,16 +203,17 @@ def field_resolver(node_type, edge_node) -> Callable:
relation_field = getattr(root, edge_node.target_field) relation_field = getattr(root, edge_node.target_field)
if not kwargs.get('know_parent'): if not kwargs.get('know_parent'):
data = relation_field.filter().first_or_none() rels = relation_field.all_relationships()
if rels:
return rels[0]
return None
else: else:
if not hasattr(root, '_parent'): if not hasattr(root, '_parent'):
raise EdgeNodeClass.parent_type_exception raise EdgeNodeClass.parent_type_exception
else: else:
data = relation_field.relationship(root._parent) data = relation_field.relationship(root._parent)
if kwargs.get('id'): if kwargs.get('id'):
data = relation_field.relationship( data = relation_field.relationship(
edge_node.target_model.nodes.get(uid=kwargs['id'])) edge_node.target_model.nodes.get(uid=kwargs['id']))
return data return data
return default_resolver return default_resolver

View File

@ -1,4 +1,4 @@
import inspect import inspect, re
from django.db import models from django.db import models
from graphene.types.scalars import Int from graphene.types.scalars import Int
@ -11,15 +11,25 @@ from neomodel import (
pagination_params = dict(first=Int(default_value=100), last=Int()) pagination_params = dict(first=Int(default_value=100), last=Int())
# from graphene.utils import LazyList # from graphene.utils import LazyList
def convert(name):
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
def is_parent_set(info): def is_parent_set(info):
if hasattr(info.parent_type.graphene_type._meta, 'know_parent_fields'): if hasattr(info.parent_type.graphene_type._meta, 'know_parent_fields'):
options = info.parent_type.graphene_type._meta.know_parent_fields options = info.parent_type.graphene_type._meta.know_parent_fields
field_name = convert(info.field_name)
assert isinstance(options, (list, tuple)), \ assert isinstance(options, (list, tuple)), \
"know_parent_fields should be list or tuple" "know_parent_fields should be list or tuple"
return info.field_name in options return field_name in options
return False return False
def set_parent(item, root):
setattr(item, '_parent', root)
return item
class LazyList(object): class LazyList(object):
pass pass