@@ -54,7 +54,7 @@ def to(self, value):
54
54
class PkWrapper (object ):
55
55
editable = False
56
56
fake = False
57
-
57
+
58
58
def __init__ (self , wrapped ):
59
59
self .obj = wrapped
60
60
@@ -72,39 +72,39 @@ def __setattr__(self, attr, value):
72
72
class LazyDocumentMetaWrapper (LazyObject ):
73
73
_document = None
74
74
_meta = None
75
-
75
+
76
76
def __init__ (self , document ):
77
77
self ._document = document
78
78
self ._meta = document ._meta
79
79
super (LazyDocumentMetaWrapper , self ).__init__ ()
80
-
80
+
81
81
def _setup (self ):
82
82
self ._wrapped = DocumentMetaWrapper (self ._document , self ._meta )
83
-
83
+
84
84
def __setattr__ (self , name , value ):
85
85
if name in ["_document" , "_meta" ,]:
86
86
object .__setattr__ (self , name , value )
87
87
else :
88
88
super (LazyDocumentMetaWrapper , self ).__setattr__ (name , value )
89
-
89
+
90
90
def __dir__ (self ):
91
91
return self ._wrapped .__dir__ ()
92
-
92
+
93
93
def __getitem__ (self , key ):
94
94
return self ._wrapped .__getitem__ (key )
95
-
95
+
96
96
def __setitem__ (self , key , value ):
97
97
return self ._wrapped .__getitem__ (key , value )
98
-
98
+
99
99
def __delitem__ (self , key ):
100
100
return self ._wrapped .__delitem__ (key )
101
-
101
+
102
102
def __len__ (self ):
103
103
return self ._wrapped .__len__ ()
104
-
104
+
105
105
def __contains__ (self , key ):
106
106
return self ._wrapped .__contains__ (key )
107
-
107
+
108
108
109
109
class DocumentMetaWrapper (MutableMapping ):
110
110
"""
@@ -122,6 +122,7 @@ class DocumentMetaWrapper(MutableMapping):
122
122
has_auto_field = False
123
123
object_name = None
124
124
proxy = []
125
+ proxied_children = []
125
126
parents = {}
126
127
many_to_many = []
127
128
_field_cache = None
@@ -168,12 +169,23 @@ def _setup_document_fields(self):
168
169
if not hasattr (f , 'rel' ):
169
170
# need a bit more for actual reference fields here
170
171
if isinstance (f , ReferenceField ):
172
+ # FIXME: Probably broken in Django 1.7
171
173
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
174
177
f .field .rel = Relation (f .field .document_type )
178
+ f .field .is_relation = True
175
179
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?
176
187
f .rel = None
188
+ f .is_relation = False
177
189
if not hasattr (f , 'verbose_name' ) or f .verbose_name is None :
178
190
f .verbose_name = capfirst (create_verbose_name (f .name ))
179
191
if not hasattr (f , 'flatchoices' ):
@@ -189,6 +201,8 @@ def _setup_document_fields(self):
189
201
isinstance (f .document_type ._meta , (DocumentMetaWrapper , LazyDocumentMetaWrapper )) and \
190
202
self .document != f .document_type :
191
203
f .document_type ._meta = LazyDocumentMetaWrapper (f .document_type )
204
+ if not hasattr (f , 'auto_created' ):
205
+ f .auto_created = False
192
206
193
207
def _init_pk (self ):
194
208
"""
@@ -218,7 +232,7 @@ def _get_pk_val(obj):
218
232
# needs to add a hidden pk field. It does not for embedded fields.
219
233
# So we pretend to have an editable pk field and just ignore it otherwise
220
234
self .pk .editable = True
221
-
235
+
222
236
@property
223
237
def app_label (self ):
224
238
if self ._app_label is None :
@@ -228,28 +242,28 @@ def app_label(self):
228
242
model_module = sys .modules [self .document .__module__ ]
229
243
self ._app_label = model_module .__name__ .split ('.' )[- 2 ]
230
244
return self ._app_label
231
-
245
+
232
246
@property
233
247
def verbose_name (self ):
234
248
"""
235
249
Returns the verbose name of the document.
236
-
250
+
237
251
Checks the original meta dict first. If it is not found
238
252
then generates a verbose name from the object name.
239
253
"""
240
254
if self ._verbose_name is None :
241
255
verbose_name = self ._meta .get ('verbose_name' , self .object_name )
242
256
self ._verbose_name = capfirst (create_verbose_name (verbose_name ))
243
257
return self ._verbose_name
244
-
258
+
245
259
@property
246
260
def verbose_name_raw (self ):
247
261
return self .verbose_name
248
-
262
+
249
263
@property
250
264
def verbose_name_plural (self ):
251
265
return "%ss" % self .verbose_name
252
-
266
+
253
267
def get_add_permission (self ):
254
268
return 'add_%s' % self .object_name .lower ()
255
269
@@ -258,10 +272,10 @@ def get_change_permission(self):
258
272
259
273
def get_delete_permission (self ):
260
274
return 'delete_%s' % self .object_name .lower ()
261
-
275
+
262
276
def get_ordered_objects (self ):
263
277
return []
264
-
278
+
265
279
def get_field_by_name (self , name ):
266
280
"""
267
281
Returns the (field_object, model, direct, m2m), where field_object is
@@ -281,13 +295,16 @@ def get_field_by_name(self, name):
281
295
else :
282
296
raise FieldDoesNotExist ('%s has no field named %r' %
283
297
(self .object_name , name ))
284
-
298
+
285
299
def get_field (self , name , many_to_many = True ):
286
300
"""
287
301
Returns the requested field by name. Raises FieldDoesNotExist on error.
288
302
"""
289
303
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
+
291
308
@property
292
309
def swapped (self ):
293
310
"""
@@ -296,7 +313,7 @@ def swapped(self):
296
313
297
314
For historical reasons, model name lookups using get_model() are
298
315
case insensitive, so we make sure we are case insensitive here.
299
-
316
+
300
317
NOTE: Not sure this is actually usefull for documents. So at the
301
318
moment it's really only here because the admin wants it. It might
302
319
prove usefull for someone though, so it's more then just a dummy.
@@ -318,28 +335,28 @@ def swapped(self):
318
335
not in (None , model_label ):
319
336
return swapped_for
320
337
return None
321
-
338
+
322
339
def __getattr__ (self , name ):
323
340
if name in self ._deprecated_attrs :
324
341
return getattr (self , self ._deprecated_attrs .get (name ))
325
-
342
+
326
343
try :
327
344
return self ._meta [name ]
328
345
except KeyError :
329
346
raise AttributeError
330
-
347
+
331
348
def __setattr__ (self , name , value ):
332
349
if not hasattr (self , name ):
333
350
self ._meta [name ] = value
334
351
else :
335
352
super (DocumentMetaWrapper , self ).__setattr__ (name , value )
336
-
353
+
337
354
def __contains__ (self , key ):
338
355
return key in self ._meta
339
-
356
+
340
357
def __getitem__ (self , key ):
341
358
return self ._meta [key ]
342
-
359
+
343
360
def __setitem__ (self , key , value ):
344
361
self ._meta [key ] = value
345
362
@@ -352,15 +369,21 @@ def __iter__(self):
352
369
def __len__ (self ):
353
370
return self ._meta .__len__ ()
354
371
372
+ def __cmp__ (self , other ):
373
+ return hash (self ) == hash (other )
374
+
375
+ def __hash__ (self ):
376
+ return id (self )
377
+
355
378
def get (self , key , default = None ):
356
379
try :
357
380
return self .__getitem__ (key )
358
381
except KeyError :
359
382
return default
360
-
383
+
361
384
def get_parent_list (self ):
362
385
return []
363
-
386
+
364
387
def get_all_related_objects (self , * args , ** kwargs ):
365
388
return []
366
389
0 commit comments