@@ -54,7 +54,7 @@ def to(self, value):
5454class PkWrapper (object ):
5555 editable = False
5656 fake = False
57-
57+
5858 def __init__ (self , wrapped ):
5959 self .obj = wrapped
6060
@@ -72,39 +72,39 @@ def __setattr__(self, attr, value):
7272class LazyDocumentMetaWrapper (LazyObject ):
7373 _document = None
7474 _meta = None
75-
75+
7676 def __init__ (self , document ):
7777 self ._document = document
7878 self ._meta = document ._meta
7979 super (LazyDocumentMetaWrapper , self ).__init__ ()
80-
80+
8181 def _setup (self ):
8282 self ._wrapped = DocumentMetaWrapper (self ._document , self ._meta )
83-
83+
8484 def __setattr__ (self , name , value ):
8585 if name in ["_document" , "_meta" ,]:
8686 object .__setattr__ (self , name , value )
8787 else :
8888 super (LazyDocumentMetaWrapper , self ).__setattr__ (name , value )
89-
89+
9090 def __dir__ (self ):
9191 return self ._wrapped .__dir__ ()
92-
92+
9393 def __getitem__ (self , key ):
9494 return self ._wrapped .__getitem__ (key )
95-
95+
9696 def __setitem__ (self , key , value ):
9797 return self ._wrapped .__getitem__ (key , value )
98-
98+
9999 def __delitem__ (self , key ):
100100 return self ._wrapped .__delitem__ (key )
101-
101+
102102 def __len__ (self ):
103103 return self ._wrapped .__len__ ()
104-
104+
105105 def __contains__ (self , key ):
106106 return self ._wrapped .__contains__ (key )
107-
107+
108108
109109class DocumentMetaWrapper (MutableMapping ):
110110 """
@@ -122,6 +122,7 @@ class DocumentMetaWrapper(MutableMapping):
122122 has_auto_field = False
123123 object_name = None
124124 proxy = []
125+ proxied_children = []
125126 parents = {}
126127 many_to_many = []
127128 _field_cache = None
@@ -168,12 +169,23 @@ def _setup_document_fields(self):
168169 if not hasattr (f , 'rel' ):
169170 # need a bit more for actual reference fields here
170171 if isinstance (f , ReferenceField ):
172+ # FIXME: Probably broken in Django 1.7
171173 f .rel = Relation (f .document_type )
172- elif isinstance (f , ListField ) and \
173- isinstance (f .field , ReferenceField ):
174+ f .is_relation = True
175+ elif isinstance (f , ListField ) and isinstance (f .field , ReferenceField ):
176+ # FIXME: Probably broken in Django 1.7
174177 f .field .rel = Relation (f .field .document_type )
178+ f .field .is_relation = True
175179 else :
180+ f .many_to_many = None
181+ f .many_to_one = None
182+ f .one_to_many = None
183+ f .one_to_one = None
184+ f .related_model = None
185+
186+ # FIXME: No longer used in Django 1.7?
176187 f .rel = None
188+ f .is_relation = False
177189 if not hasattr (f , 'verbose_name' ) or f .verbose_name is None :
178190 f .verbose_name = capfirst (create_verbose_name (f .name ))
179191 if not hasattr (f , 'flatchoices' ):
@@ -189,6 +201,8 @@ def _setup_document_fields(self):
189201 isinstance (f .document_type ._meta , (DocumentMetaWrapper , LazyDocumentMetaWrapper )) and \
190202 self .document != f .document_type :
191203 f .document_type ._meta = LazyDocumentMetaWrapper (f .document_type )
204+ if not hasattr (f , 'auto_created' ):
205+ f .auto_created = False
192206
193207 def _init_pk (self ):
194208 """
@@ -218,7 +232,7 @@ def _get_pk_val(obj):
218232 # needs to add a hidden pk field. It does not for embedded fields.
219233 # So we pretend to have an editable pk field and just ignore it otherwise
220234 self .pk .editable = True
221-
235+
222236 @property
223237 def app_label (self ):
224238 if self ._app_label is None :
@@ -228,28 +242,28 @@ def app_label(self):
228242 model_module = sys .modules [self .document .__module__ ]
229243 self ._app_label = model_module .__name__ .split ('.' )[- 2 ]
230244 return self ._app_label
231-
245+
232246 @property
233247 def verbose_name (self ):
234248 """
235249 Returns the verbose name of the document.
236-
250+
237251 Checks the original meta dict first. If it is not found
238252 then generates a verbose name from the object name.
239253 """
240254 if self ._verbose_name is None :
241255 verbose_name = self ._meta .get ('verbose_name' , self .object_name )
242256 self ._verbose_name = capfirst (create_verbose_name (verbose_name ))
243257 return self ._verbose_name
244-
258+
245259 @property
246260 def verbose_name_raw (self ):
247261 return self .verbose_name
248-
262+
249263 @property
250264 def verbose_name_plural (self ):
251265 return "%ss" % self .verbose_name
252-
266+
253267 def get_add_permission (self ):
254268 return 'add_%s' % self .object_name .lower ()
255269
@@ -258,10 +272,10 @@ def get_change_permission(self):
258272
259273 def get_delete_permission (self ):
260274 return 'delete_%s' % self .object_name .lower ()
261-
275+
262276 def get_ordered_objects (self ):
263277 return []
264-
278+
265279 def get_field_by_name (self , name ):
266280 """
267281 Returns the (field_object, model, direct, m2m), where field_object is
@@ -281,13 +295,16 @@ def get_field_by_name(self, name):
281295 else :
282296 raise FieldDoesNotExist ('%s has no field named %r' %
283297 (self .object_name , name ))
284-
298+
285299 def get_field (self , name , many_to_many = True ):
286300 """
287301 Returns the requested field by name. Raises FieldDoesNotExist on error.
288302 """
289303 return self .get_field_by_name (name )[0 ]
290-
304+
305+ def get_fields (self , include_hidden = False ):
306+ return self .document ._fields .values ()
307+
291308 @property
292309 def swapped (self ):
293310 """
@@ -296,7 +313,7 @@ def swapped(self):
296313
297314 For historical reasons, model name lookups using get_model() are
298315 case insensitive, so we make sure we are case insensitive here.
299-
316+
300317 NOTE: Not sure this is actually usefull for documents. So at the
301318 moment it's really only here because the admin wants it. It might
302319 prove usefull for someone though, so it's more then just a dummy.
@@ -318,28 +335,28 @@ def swapped(self):
318335 not in (None , model_label ):
319336 return swapped_for
320337 return None
321-
338+
322339 def __getattr__ (self , name ):
323340 if name in self ._deprecated_attrs :
324341 return getattr (self , self ._deprecated_attrs .get (name ))
325-
342+
326343 try :
327344 return self ._meta [name ]
328345 except KeyError :
329346 raise AttributeError
330-
347+
331348 def __setattr__ (self , name , value ):
332349 if not hasattr (self , name ):
333350 self ._meta [name ] = value
334351 else :
335352 super (DocumentMetaWrapper , self ).__setattr__ (name , value )
336-
353+
337354 def __contains__ (self , key ):
338355 return key in self ._meta
339-
356+
340357 def __getitem__ (self , key ):
341358 return self ._meta [key ]
342-
359+
343360 def __setitem__ (self , key , value ):
344361 self ._meta [key ] = value
345362
@@ -352,15 +369,21 @@ def __iter__(self):
352369 def __len__ (self ):
353370 return self ._meta .__len__ ()
354371
372+ def __cmp__ (self , other ):
373+ return hash (self ) == hash (other )
374+
375+ def __hash__ (self ):
376+ return id (self )
377+
355378 def get (self , key , default = None ):
356379 try :
357380 return self .__getitem__ (key )
358381 except KeyError :
359382 return default
360-
383+
361384 def get_parent_list (self ):
362385 return []
363-
386+
364387 def get_all_related_objects (self , * args , ** kwargs ):
365388 return []
366389
0 commit comments