Skip to content

Commit dcb9133

Browse files
committed
fix: Take care all self-reference comparison and fix MongoengineConnectionField.default_filter_args.
1 parent 5686b15 commit dcb9133

File tree

6 files changed

+54
-37
lines changed

6 files changed

+54
-37
lines changed

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ clean:
22
@rm -f .coverage 2> /dev/null
33
@rm -rf .eggs 2> /dev/null
44
@rm -rf .cache 2> /dev/null
5+
@rm -rf ./graphene_mongo/.cache 2> /dev/null
56
@rm -rf build 2> /dev/null
67
@rm -rf dist 2> /dev/null
78
@rm -rf graphene_mongo.egg-info 2> /dev/null
89
@find . -name "*.pyc" -delete
10+
@find . -name "*.swp" -delete
911
@find . -name "__pycache__" -delete
1012

1113
lint:

graphene_mongo/fields.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,11 @@ def args(self, args):
6565

6666
@property
6767
def default_filter_args(self):
68+
def is_filterable(kv):
69+
return hasattr(kv[1], '_type') and hasattr(kv[1]._type, '_of_type')
70+
6871
return reduce(
69-
lambda r, kv: r.update({kv[0]: kv[1]._type._of_type()}) or r if hasattr(kv[1], '_type') else r,
72+
lambda r, kv: r.update({kv[0]: kv[1]._type._of_type()}) or r if is_filterable(kv) else r,
7073
self.fields.items(),
7174
{}
7275
)

graphene_mongo/tests/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,4 @@ class Player(Document):
6161
last_name = StringField(required=True)
6262
opponent = ReferenceField('Player')
6363
players = ListField(ReferenceField('Player'))
64-
articles = ListField(ReferenceField('Article'))
64+
# articles = ListField(ReferenceField('Article'))

graphene_mongo/tests/test_converter.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from .models import Article, Editor, EmbeddedArticle, Player, Reporter
1111

1212
from ..converter import convert_mongoengine_field
13+
from ..fields import MongoengineConnectionField
1314
from ..types import MongoengineObjectType
1415

1516

@@ -101,9 +102,8 @@ class Meta:
101102
dynamic_field = graphene_field.get_type()
102103
assert dynamic_field._of_type == A
103104

104-
105105
def test_should_self_reference_convert_dynamic():
106-
106+
# pass
107107
class P(MongoengineObjectType):
108108

109109
class Meta:
@@ -116,6 +116,9 @@ class Meta:
116116
assert isinstance(graphene_type, graphene.Field)
117117
assert graphene_type.type == P
118118

119+
graphene_field = convert_mongoengine_field(Player._fields['players'], P._meta.registry)
120+
assert isinstance(graphene_field, MongoengineConnectionField)
121+
119122

120123
def test_should_list_of_self_reference_convert_list():
121124

@@ -133,4 +136,3 @@ class Meta:
133136
assert isinstance(graphene_field, graphene.List)
134137
dynamic_field = graphene_field.get_type()
135138
assert dynamic_field._of_type == P
136-

graphene_mongo/tests/test_query.py

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ def setup_fixtures():
3434
player1.save()
3535
player2 = Player(first_name='Magic', last_name='Johnson', opponent=player1)
3636
player2.save()
37+
player3 = Player(first_name='Larry', last_name='Bird', players=[player1, player2])
38+
player3.save()
3739

3840
setup_fixtures()
3941

@@ -403,50 +405,56 @@ def test_should_self_reference():
403405

404406
class Query(graphene.ObjectType):
405407

406-
players = MongoengineConnectionField(PlayerNode)
408+
all_players = graphene.List(PlayerType)
409+
410+
def resolve_all_players(self, *args, **kwargs):
411+
return Player.objects.all()
407412

408413
query = '''
409-
query PlayerQuery {
410-
players {
411-
edges {
412-
cursor,
413-
node {
414-
firstName,
415-
opponent {
416-
firstName
417-
}
418-
}
414+
query PlayersQuery {
415+
allPlayers {
416+
firstName,
417+
opponent {
418+
firstName
419+
},
420+
players {
421+
firstName
419422
}
420423
}
421424
}
422425
'''
423426
expected = {
424-
'players': {
425-
'edges': [
426-
{
427-
'cursor': 'xxx',
428-
'node': {
429-
'firstName': 'Michael',
430-
'opponent': None
431-
}
427+
'allPlayers': [
428+
{
429+
'firstName': 'Michael',
430+
'opponent': None,
431+
'players': []
432+
},
433+
{
434+
'firstName': 'Magic',
435+
'opponent': {
436+
'firstName': 'Michael'
432437
},
433-
{
434-
'cursor': 'xxx',
435-
'node': {
436-
'firstName': 'Magic',
437-
'opponent': {
438-
'firstName': 'Michael'
439-
}
438+
'players': []
439+
},
440+
{
441+
'firstName': 'Larry',
442+
'opponent': None,
443+
'players': [
444+
{
445+
'firstName': 'Michael'
446+
},
447+
{
448+
'firstName': 'Magic'
440449
}
441-
}
442-
]
443-
}
450+
]
451+
}
452+
]
444453
}
445454
schema = graphene.Schema(query=Query)
446455
result = schema.execute(query)
447-
448456
assert not result.errors
449-
assert all(item in get_nodes(result.data, 'players') for item in get_nodes(expected, 'players'))
457+
assert json.dumps(result.data, sort_keys=True) == json.dumps(expected, sort_keys=True)
450458

451459

452460
# TODO:

graphene_mongo/types.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@ def construct_fields(model, registry, only_fields, exclude_fields):
2626
# Take care of list of self-reference.
2727
document_type_obj = field.field.__dict__.get('document_type_obj', None)
2828
if document_type_obj == model._class_name \
29-
or isinstance(document_type_obj, model):
29+
or isinstance(document_type_obj, model) \
30+
or document_type_obj == model:
3031
self_referenced[name] = field
3132
continue
3233
converted = convert_mongoengine_field(field, registry)
3334
if not converted:
3435
continue
3536
fields[name] = converted
37+
3638
return fields, self_referenced
3739

3840

0 commit comments

Comments
 (0)