Skip to content

Commit c77ce14

Browse files
authored
Merge pull request #18 from graphql-python/feat-support-embedded-list-field
Feature: Support EmbeddedListField
2 parents 5ca293a + 2a322e5 commit c77ce14

File tree

11 files changed

+142
-19
lines changed

11 files changed

+142
-19
lines changed

examples/flask_mongoengine/app.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,26 @@
1717
id,
1818
name
1919
},
20-
role {
20+
roles {
21+
edges {
22+
node {
23+
id,
24+
name
25+
}
26+
}
27+
},
28+
leader {
2129
id,
2230
name
2331
}
32+
tasks {
33+
edges {
34+
node {
35+
name,
36+
deadline
37+
}
38+
}
39+
}
2440
}
2541
}
2642
}

examples/flask_mongoengine/database.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from mongoengine import connect
22

3-
from models import Department, Employee, Role
3+
from models import Department, Employee, Role, Task
44

55
connect('graphene-mongo-example', host='mongomock://localhost', alias='default')
66

@@ -19,12 +19,31 @@ def init_db():
1919
engineer = Role(name='engineer')
2020
engineer.save()
2121

22-
peter = Employee(name='Peter', department=engineering, role=engineer)
23-
peter.save()
24-
25-
roy = Employee(name='Roy', department=engineering, role=engineer)
26-
roy.save()
22+
debug = Task(name='Debug')
23+
test = Task(name='Test')
2724

28-
tracy = Employee(name='Tracy', department=hr, role=manager)
25+
tracy = Employee(
26+
name='Tracy',
27+
department=hr,
28+
roles=[engineer, manager],
29+
tasks=[]
30+
)
2931
tracy.save()
3032

33+
peter = Employee(
34+
name='Peter',
35+
department=engineering,
36+
leader=tracy,
37+
roles=[engineer],
38+
tasks=[debug, test]
39+
)
40+
peter.save()
41+
42+
roy = Employee(
43+
name='Roy',
44+
department=engineering,
45+
leader=tracy,
46+
roles=[engineer],
47+
tasks=[debug]
48+
)
49+
roy.save()

examples/flask_mongoengine/models.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,35 @@
11
from datetime import datetime
2-
from mongoengine import Document
2+
from mongoengine import Document, EmbeddedDocument
33
from mongoengine.fields import (
4-
DateTimeField, ReferenceField, StringField,
4+
DateTimeField, EmbeddedDocumentField,
5+
ListField, ReferenceField, StringField,
56
)
67

78

89
class Department(Document):
10+
911
meta = {'collection': 'department'}
1012
name = StringField()
1113

1214

1315
class Role(Document):
16+
1417
meta = {'collection': 'role'}
1518
name = StringField()
1619

1720

21+
class Task(EmbeddedDocument):
22+
23+
name = StringField()
24+
deadline = DateTimeField(default=datetime.now)
25+
26+
1827
class Employee(Document):
28+
1929
meta = {'collection': 'employee'}
2030
name = StringField()
2131
hired_on = DateTimeField(default=datetime.now)
2232
department = ReferenceField(Department)
23-
role = ReferenceField(Role)
24-
33+
roles = ListField(ReferenceField(Role))
34+
leader = ReferenceField('Employee')
35+
tasks = ListField(EmbeddedDocumentField(Task))

examples/flask_mongoengine/schema.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from models import Department as DepartmentModel
55
from models import Employee as EmployeeModel
66
from models import Role as RoleModel
7+
from models import Task as TaskModel
78

89
class Department(MongoengineObjectType):
910

@@ -19,6 +20,12 @@ class Meta:
1920
interfaces = (Node,)
2021

2122

23+
class Task(MongoengineObjectType):
24+
25+
class Meta:
26+
model = TaskModel
27+
interfaces = (Node,)
28+
2229
class Employee(MongoengineObjectType):
2330

2431
class Meta:

graphene_mongo/converter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ def convert_date_to_string(field, registry=None):
5858

5959

6060
@convert_mongoengine_field.register(mongoengine.ListField)
61+
@convert_mongoengine_field.register(mongoengine.EmbeddedDocumentListField)
6162
def convert_field_to_list(field, registry=None):
6263
base_type = convert_mongoengine_field(field.field, registry=registry)
63-
6464
if isinstance(base_type, (Dynamic)):
6565
base_type = base_type.get_type()
6666
if base_type is None:

graphene_mongo/fields.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ def fields(self):
8686

8787
@classmethod
8888
def get_query(cls, model, info, **args):
89+
90+
if not callable(getattr(model, 'objects', None)):
91+
return []
92+
8993
objs = model.objects()
9094

9195
if args:

graphene_mongo/tests/fixtures.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ def setup_fixtures():
1717
article2.save()
1818

1919
Reporter.drop_collection()
20-
reporter = Reporter(id='1', first_name='Allen', last_name='Iverson',
20+
reporter1 = Reporter(id='1', first_name='Allen', last_name='Iverson',
2121
email='[email protected]', awards=['2010-mvp'])
22-
reporter.articles = [article1, article2]
22+
reporter1.articles = [article1, article2]
2323
embedded_article1 = EmbeddedArticle(
2424
headline='Real',
2525
editor=editor1
@@ -28,8 +28,9 @@ def setup_fixtures():
2828
headline='World',
2929
editor=editor2
3030
)
31-
reporter.embedded_articles = [embedded_article1, embedded_article2]
32-
reporter.save()
31+
reporter1.embedded_articles = [embedded_article1, embedded_article2]
32+
reporter1.embedded_list_articles = [embedded_article2, embedded_article1]
33+
reporter1.save()
3334

3435
Player.drop_collection()
3536
player1 = Player(first_name='Michael', last_name='Jordan')

graphene_mongo/tests/models.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
connect, Document, EmbeddedDocument
44
)
55
from mongoengine.fields import (
6-
DateTimeField, EmailField, EmbeddedDocumentField, ListField,
6+
DateTimeField, EmailField, EmbeddedDocumentField,
7+
EmbeddedDocumentListField, ListField,
78
MapField, ReferenceField, StringField
89
)
910

@@ -52,6 +53,7 @@ class Reporter(Document):
5253
email = EmailField()
5354
articles = ListField(ReferenceField(Article))
5455
embedded_articles = ListField(EmbeddedDocumentField(EmbeddedArticle))
56+
embedded_list_articles = EmbeddedDocumentListField(EmbeddedArticle)
5557
# FIXME
5658
# custom_map = MapField(field=StringField())
5759
awards = ListField(StringField())
@@ -63,3 +65,5 @@ class Player(Document):
6365
opponent = ReferenceField('Player')
6466
players = ListField(ReferenceField('Player'))
6567
articles = ListField(ReferenceField('Article'))
68+
embedded_list_articles = EmbeddedDocumentListField(EmbeddedArticle)
69+

graphene_mongo/tests/test_converter.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,19 @@ class Meta:
116116
assert dynamic_field._of_type == E
117117

118118

119+
def test_should_embedded_list_convert_list():
120+
121+
class E(MongoengineObjectType):
122+
123+
class Meta:
124+
model = EmbeddedArticle
125+
126+
graphene_field = convert_mongoengine_field(Reporter._fields['embedded_list_articles'], E._meta.registry)
127+
assert isinstance(graphene_field, graphene.List)
128+
dynamic_field = graphene_field.get_type()
129+
assert dynamic_field._of_type == E
130+
131+
119132
def test_should_self_reference_convert_dynamic():
120133
class P(MongoengineObjectType):
121134

graphene_mongo/tests/test_query.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ def resolve_reporter(self, *args, **kwargs):
7979
embeddedArticles {
8080
headline
8181
},
82+
embeddedListArticles {
83+
headline
84+
},
8285
awards
8386
}
8487
}
@@ -100,6 +103,14 @@ def resolve_reporter(self, *args, **kwargs):
100103
'headline': 'World'
101104
}
102105
],
106+
'embeddedListArticles': [
107+
{
108+
'headline': 'World'
109+
},
110+
{
111+
'headline': 'Real'
112+
}
113+
],
103114
'awards': ['2010-mvp']
104115
}
105116
}

0 commit comments

Comments
 (0)