Skip to content

Commit df8e7cf

Browse files
authored
Merge pull request #85 from riverfr0zen/master
Let MongoengineObjectType subclasses pass their own _meta
2 parents 6f83ede + 7442167 commit df8e7cf

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

graphene_mongo/tests/test_types.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from graphene.relay import Node, is_node
55

66
from .. import registry
7-
from ..types import MongoengineObjectType
7+
from ..types import MongoengineObjectType, MongoengineObjectTypeOptions
88
from .models import Article, EmbeddedArticle, Reporter
99
from .models import Parent, Child
1010
from .utils import with_local_registry
@@ -127,3 +127,41 @@ class Meta:
127127
exclude_fields = ('headline')
128128

129129
assert 'headline' not in list(A._meta.fields.keys())
130+
131+
132+
@with_local_registry
133+
def test_passing_meta_when_subclassing_mongoengine_objecttype():
134+
class TypeSubclassWithBadOptions(MongoengineObjectType):
135+
class Meta:
136+
abstract = True
137+
138+
@classmethod
139+
def __init_subclass_with_meta__(cls, **kwargs):
140+
_meta = ['hi']
141+
super(TypeSubclassWithBadOptions, cls). \
142+
__init_subclass_with_meta__(_meta=_meta, **kwargs)
143+
144+
with raises(Exception) as einfo:
145+
class A(TypeSubclassWithBadOptions):
146+
class Meta:
147+
model = Article
148+
assert 'instance of MongoengineObjectTypeOptions' in str(einfo.value)
149+
150+
class TypeSubclass(MongoengineObjectType):
151+
class Meta:
152+
abstract = True
153+
154+
@classmethod
155+
def __init_subclass_with_meta__(cls, some_subclass_attr=None,
156+
**kwargs):
157+
_meta = MongoengineObjectTypeOptions(cls)
158+
_meta.some_subclass_attr = some_subclass_attr
159+
super(TypeSubclass, cls). \
160+
__init_subclass_with_meta__(_meta=_meta, **kwargs)
161+
162+
class B(TypeSubclass):
163+
class Meta:
164+
model = Article
165+
some_subclass_attr = 'someval'
166+
assert hasattr(B._meta, 'some_subclass_attr')
167+
assert B._meta.some_subclass_attr == 'someval'

graphene_mongo/types.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ class MongoengineObjectType(ObjectType):
7575
def __init_subclass_with_meta__(cls, model=None, registry=None, skip_registry=False,
7676
only_fields=(), exclude_fields=(), filter_fields=None,
7777
connection=None, connection_class=None, use_connection=None,
78-
connection_field_class=None, interfaces=(), **options):
78+
connection_field_class=None, interfaces=(),
79+
_meta=None, **options):
7980

8081
assert is_valid_mongoengine_model(model), (
8182
'The attribute model in {}.Meta must be a valid Mongoengine Model. '
@@ -118,7 +119,14 @@ def __init_subclass_with_meta__(cls, model=None, registry=None, skip_registry=Fa
118119
else:
119120
connection_field_class = MongoengineConnectionField
120121

121-
_meta = MongoengineObjectTypeOptions(cls)
122+
if _meta:
123+
assert isinstance(_meta, MongoengineObjectTypeOptions), (
124+
'_meta must be an instance of MongoengineObjectTypeOptions, '
125+
'received {}'
126+
).format(_meta.__class__)
127+
else:
128+
_meta = MongoengineObjectTypeOptions(cls)
129+
122130
_meta.model = model
123131
_meta.registry = registry
124132
_meta.fields = mongoengine_fields

0 commit comments

Comments
 (0)