5
5
from django .db .models .fields import FieldDoesNotExist
6
6
from django .utils .text import capfirst
7
7
from django .utils .functional import LazyObject , new_method_proxy
8
- from django .conf import settings
9
8
try :
10
- from django .db .models .options import get_verbose_name
9
+ # New in Django 1.7+
10
+ from django .utils .text import camel_case_to_spaces
11
11
except ImportError :
12
- from django .utils .text import camel_case_to_spaces as get_verbose_name
13
-
12
+ # Backwards compatibility
13
+ from django .db .models .options import get_verbose_name as camel_case_to_spaces
14
+ from django .conf import settings
14
15
from mongoengine .fields import ReferenceField , ListField
15
16
16
17
@@ -23,7 +24,7 @@ def patch_document(function, instance, bound=True):
23
24
24
25
25
26
def create_verbose_name (name ):
26
- name = get_verbose_name (name )
27
+ name = camel_case_to_spaces (name )
27
28
name = name .replace ('_' , ' ' )
28
29
return name
29
30
@@ -106,6 +107,7 @@ class DocumentMetaWrapper(MutableMapping):
106
107
has_auto_field = False
107
108
object_name = None
108
109
proxy = []
110
+ proxied_children = []
109
111
parents = {}
110
112
many_to_many = []
111
113
_field_cache = None
@@ -152,12 +154,23 @@ def _setup_document_fields(self):
152
154
if not hasattr (f , 'rel' ):
153
155
# need a bit more for actual reference fields here
154
156
if isinstance (f , ReferenceField ):
157
+ # FIXME: Probably broken in Django 1.7
155
158
f .rel = Relation (f .document_type )
156
- elif isinstance (f , ListField ) and \
157
- isinstance (f .field , ReferenceField ):
159
+ f .is_relation = True
160
+ elif isinstance (f , ListField ) and isinstance (f .field , ReferenceField ):
161
+ # FIXME: Probably broken in Django 1.7
158
162
f .field .rel = Relation (f .field .document_type )
163
+ f .field .is_relation = True
159
164
else :
165
+ f .many_to_many = None
166
+ f .many_to_one = None
167
+ f .one_to_many = None
168
+ f .one_to_one = None
169
+ f .related_model = None
170
+
171
+ # FIXME: No longer used in Django 1.7?
160
172
f .rel = None
173
+ f .is_relation = False
161
174
if not hasattr (f , 'verbose_name' ) or f .verbose_name is None :
162
175
f .verbose_name = capfirst (create_verbose_name (f .name ))
163
176
if not hasattr (f , 'flatchoices' ):
@@ -173,6 +186,8 @@ def _setup_document_fields(self):
173
186
isinstance (f .document_type ._meta , (DocumentMetaWrapper , LazyDocumentMetaWrapper )) and \
174
187
self .document != f .document_type :
175
188
f .document_type ._meta = LazyDocumentMetaWrapper (f .document_type )
189
+ if not hasattr (f , 'auto_created' ):
190
+ f .auto_created = False
176
191
177
192
def _init_pk (self ):
178
193
"""
@@ -188,14 +203,13 @@ def _init_pk(self):
188
203
pk_field = None
189
204
self .pk = PkWrapper (pk_field )
190
205
191
- def _get_pk_val (self ):
192
- return self ._pk_val
206
+ def _get_pk_val (obj ):
207
+ return obj .pk
208
+ patch_document (_get_pk_val , self .document , False ) # document is a class...
193
209
194
210
if pk_field is not None :
195
211
self .pk .name = self .pk_name
196
212
self .pk .attname = self .pk_name
197
- self .document ._pk_val = pk_field
198
- patch_document (_get_pk_val , self .document )
199
213
else :
200
214
self .pk .fake = True
201
215
# this is used in the admin and used to determine if the admin
@@ -206,8 +220,11 @@ def _get_pk_val(self):
206
220
@property
207
221
def app_label (self ):
208
222
if self ._app_label is None :
209
- model_module = sys .modules [self .document .__module__ ]
210
- self ._app_label = model_module .__name__ .split ('.' )[- 2 ]
223
+ if self ._meta .get ('app_label' ):
224
+ self ._app_label = self ._meta ["app_label" ]
225
+ else :
226
+ model_module = sys .modules [self .document .__module__ ]
227
+ self ._app_label = model_module .__name__ .split ('.' )[- 2 ]
211
228
return self ._app_label
212
229
213
230
@property
@@ -269,6 +286,9 @@ def get_field(self, name, many_to_many=True):
269
286
"""
270
287
return self .get_field_by_name (name )[0 ]
271
288
289
+ def get_fields (self , include_hidden = False ):
290
+ return self .document ._fields .values ()
291
+
272
292
@property
273
293
def swapped (self ):
274
294
"""
@@ -333,6 +353,12 @@ def __iter__(self):
333
353
def __len__ (self ):
334
354
return self ._meta .__len__ ()
335
355
356
+ def __cmp__ (self , other ):
357
+ return hash (self ) == hash (other )
358
+
359
+ def __hash__ (self ):
360
+ return id (self )
361
+
336
362
def get (self , key , default = None ):
337
363
try :
338
364
return self .__getitem__ (key )
0 commit comments