EmbeddedDocuments dont support Reverse Delete Rules
Now throws an InvalidDocumentError Refs #227
This commit is contained in:
parent
d06c5f036b
commit
e231f71b4a
@ -8,10 +8,11 @@ Upgrading
|
|||||||
Embedded Documents - if you had a `pk` field you will have to rename it from `_id`
|
Embedded Documents - if you had a `pk` field you will have to rename it from `_id`
|
||||||
to `pk` as pk is no longer a property of Embedded Documents.
|
to `pk` as pk is no longer a property of Embedded Documents.
|
||||||
|
|
||||||
|
Reverse Delete Rules in Embedded Documents, MapFields and DictFields now throw
|
||||||
|
an InvalidDocument error as they aren't currently supported.
|
||||||
|
|
||||||
Document._get_subclasses - Is no longer used and the class method has been removed.
|
Document._get_subclasses - Is no longer used and the class method has been removed.
|
||||||
|
|
||||||
Reverse Delete Rules on MapFields and DictFields now throw a InvalidDocument error
|
|
||||||
as they aren't supported.
|
|
||||||
|
|
||||||
0.4 to 0.5
|
0.4 to 0.5
|
||||||
===========
|
===========
|
||||||
|
@ -518,6 +518,8 @@ class DocumentMetaclass(type):
|
|||||||
f = field.field
|
f = field.field
|
||||||
|
|
||||||
if delete_rule != DO_NOTHING:
|
if delete_rule != DO_NOTHING:
|
||||||
|
if issubclass(new_class, EmbeddedDocument):
|
||||||
|
raise InvalidDocumentError("Reverse delete rules are not supported for EmbeddedDocuments (field: %s)" % field.name)
|
||||||
f.document_type.register_delete_rule(new_class, field.name, delete_rule)
|
f.document_type.register_delete_rule(new_class, field.name, delete_rule)
|
||||||
|
|
||||||
if field.name and hasattr(Document, field.name) and EmbeddedDocument not in new_class.mro():
|
if field.name and hasattr(Document, field.name) and EmbeddedDocument not in new_class.mro():
|
||||||
@ -663,6 +665,18 @@ class TopLevelDocumentMetaclass(DocumentMetaclass):
|
|||||||
|
|
||||||
return new_class
|
return new_class
|
||||||
|
|
||||||
|
def __instancecheck__(cls, inst):
|
||||||
|
"""Custom instance check for isinstance() as registering delete rules or
|
||||||
|
calling a cls method in __new__ seems to change the cls so vanilla
|
||||||
|
isinstance() fails"""
|
||||||
|
is_instance = super(DocumentMetaclass, cls).__instancecheck__(inst)
|
||||||
|
if hasattr(cls, '_meta') and 'delete_rules' in cls._meta and not is_instance:
|
||||||
|
try:
|
||||||
|
is_instance = get_document(cls.__name__) == get_document(inst.__class__.__name__)
|
||||||
|
except NotRegistered:
|
||||||
|
pass
|
||||||
|
return is_instance
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _unique_with_indexes(cls, new_class, namespace=""):
|
def _unique_with_indexes(cls, new_class, namespace=""):
|
||||||
unique_indexes = []
|
unique_indexes = []
|
||||||
|
@ -2245,6 +2245,8 @@ class DocumentTest(unittest.TestCase):
|
|||||||
author.delete()
|
author.delete()
|
||||||
self.assertEqual(len(BlogPost.objects), 0)
|
self.assertEqual(len(BlogPost.objects), 0)
|
||||||
|
|
||||||
|
def test_invalid_reverse_delete_rules_raise_errors(self):
|
||||||
|
|
||||||
def throw_invalid_document_error():
|
def throw_invalid_document_error():
|
||||||
class Blog(Document):
|
class Blog(Document):
|
||||||
content = StringField()
|
content = StringField()
|
||||||
@ -2253,6 +2255,12 @@ class DocumentTest(unittest.TestCase):
|
|||||||
|
|
||||||
self.assertRaises(InvalidDocumentError, throw_invalid_document_error)
|
self.assertRaises(InvalidDocumentError, throw_invalid_document_error)
|
||||||
|
|
||||||
|
def throw_invalid_document_error_embedded():
|
||||||
|
class Parents(EmbeddedDocument):
|
||||||
|
father = ReferenceField('Person', reverse_delete_rule=DENY)
|
||||||
|
mother = ReferenceField('Person', reverse_delete_rule=DENY)
|
||||||
|
|
||||||
|
self.assertRaises(InvalidDocumentError, throw_invalid_document_error_embedded)
|
||||||
|
|
||||||
def test_reverse_delete_rule_cascade_recurs(self):
|
def test_reverse_delete_rule_cascade_recurs(self):
|
||||||
"""Ensure that a chain of documents is also deleted upon cascaded
|
"""Ensure that a chain of documents is also deleted upon cascaded
|
||||||
|
Loading…
x
Reference in New Issue
Block a user