5
5
from django .db .models .fields import FieldDoesNotExist
6
6
from django .utils .text import capfirst
7
7
from django .db .models .options import get_verbose_name
8
+ from django .utils .functional import LazyObject , empty
8
9
9
10
from mongoengine .fields import ReferenceField , ListField
10
11
@@ -57,6 +58,56 @@ def __setattr__(self, attr, value):
57
58
super (PkWrapper , self ).__setattr__ (attr , value )
58
59
59
60
61
+ class LazyDocumentMetaWrapper (LazyObject ):
62
+ _document = None
63
+ _meta = None
64
+
65
+ def __init__ (self , document ):
66
+ self ._document = document
67
+ self ._meta = document ._meta
68
+ super (LazyDocumentMetaWrapper , self ).__init__ ()
69
+
70
+ def _setup (self ):
71
+ self ._wrapped = DocumentMetaWrapper (self ._document , self ._meta )
72
+
73
+ def __setattr__ (self , name , value ):
74
+ if name in ["_document" , "_meta" ,]:
75
+ # Assign to __dict__ to avoid infinite __setattr__ loops.
76
+ object .__setattr__ (self , name , value )
77
+ else :
78
+ super (LazyDocumentMetaWrapper , self ).__setattr__ (name , value )
79
+
80
+ def __dir__ (self ):
81
+ if self ._wrapped is empty :
82
+ self ._setup ()
83
+ return self ._wrapped .__dir__ ()
84
+
85
+ def __getitem__ (self , key ):
86
+ if self ._wrapped is empty :
87
+ self ._setup ()
88
+ return self ._wrapped .__getitem__ (key )
89
+
90
+ def __setitem__ (self , key , value ):
91
+ if self ._wrapped is empty :
92
+ self ._setup ()
93
+ return self ._wrapped .__getitem__ (key , value )
94
+
95
+ def __delitem__ (self , key ):
96
+ if self ._wrapped is empty :
97
+ self ._setup ()
98
+ return self ._wrapped .__delitem__ (key )
99
+
100
+ def __len__ (self ):
101
+ if self ._wrapped is empty :
102
+ self ._setup ()
103
+ return self ._wrapped .__len__ ()
104
+
105
+ def __contains__ (self , key ):
106
+ if self ._wrapped is empty :
107
+ self ._setup ()
108
+ return self ._wrapped .__contains__ (key )
109
+
110
+
60
111
class DocumentMetaWrapper (MutableMapping ):
61
112
"""
62
113
Used to store mongoengine's _meta dict to make the document admin
@@ -81,14 +132,19 @@ class DocumentMetaWrapper(MutableMapping):
81
132
concrete_model = None
82
133
concrete_managers = []
83
134
84
- def __init__ (self , document ):
135
+ def __init__ (self , document , meta = None ):
85
136
super (DocumentMetaWrapper , self ).__init__ ()
86
137
138
+ print "__init__'s document is:"
139
+ print type (document )
87
140
self .document = document
88
141
# used by Django to distinguish between abstract and concrete models
89
142
# here for now always the document
90
143
self .concrete_model = document
91
- self ._meta = getattr (document , '_meta' , {})
144
+ if meta is None :
145
+ self ._meta = getattr (document , '_meta' , {})
146
+ else :
147
+ self ._meta = meta
92
148
93
149
try :
94
150
self .object_name = self .document .__name__
@@ -131,9 +187,10 @@ def _setup_document_fields(self):
131
187
flat .append ((choice , value ))
132
188
f .flatchoices = flat
133
189
if isinstance (f , ReferenceField ) and not \
134
- isinstance (f .document_type ._meta , DocumentMetaWrapper ) \
135
- and self .document != f .document_type :
136
- f .document_type ._meta = DocumentMetaWrapper (f .document_type )
190
+ isinstance (f .document_type ._meta , DocumentMetaWrapper ) and not \
191
+ isinstance (f .document_type ._meta , LazyDocumentMetaWrapper ) and \
192
+ self .document != f .document_type :
193
+ f .document_type ._meta = LazyDocumentMetaWrapper (f .document_type )
137
194
138
195
def _init_pk (self ):
139
196
"""
0 commit comments