4
4
5
5
from django .db .models .fields import FieldDoesNotExist
6
6
from django .utils .text import capfirst
7
- from django .utils .functional import LazyObject
7
+ from django .utils .functional import LazyObject , new_method_proxy
8
8
from django .conf import settings
9
9
try :
10
10
from django .db .models .options import get_verbose_name
@@ -50,7 +50,7 @@ def to(self, value):
50
50
class PkWrapper (object ):
51
51
editable = False
52
52
fake = False
53
-
53
+
54
54
def __init__ (self , wrapped ):
55
55
self .obj = wrapped
56
56
@@ -68,39 +68,27 @@ def __setattr__(self, attr, value):
68
68
class LazyDocumentMetaWrapper (LazyObject ):
69
69
_document = None
70
70
_meta = None
71
-
71
+
72
72
def __init__ (self , document ):
73
73
self ._document = document
74
74
self ._meta = document ._meta
75
75
super (LazyDocumentMetaWrapper , self ).__init__ ()
76
-
76
+
77
77
def _setup (self ):
78
78
self ._wrapped = DocumentMetaWrapper (self ._document , self ._meta )
79
-
79
+
80
80
def __setattr__ (self , name , value ):
81
- if name in ["_document" , "_meta" ,]:
81
+ if name in ["_document" , "_meta" , ]:
82
82
object .__setattr__ (self , name , value )
83
83
else :
84
84
super (LazyDocumentMetaWrapper , self ).__setattr__ (name , value )
85
-
86
- def __dir__ (self ):
87
- return self ._wrapped .__dir__ ()
88
-
89
- def __getitem__ (self , key ):
90
- return self ._wrapped .__getitem__ (key )
91
-
92
- def __setitem__ (self , key , value ):
93
- return self ._wrapped .__getitem__ (key , value )
94
-
95
- def __delitem__ (self , key ):
96
- return self ._wrapped .__delitem__ (key )
97
-
98
- def __len__ (self ):
99
- return self ._wrapped .__len__ ()
100
-
85
+
86
+ __len__ = new_method_proxy (len )
87
+
88
+ @new_method_proxy
101
89
def __contains__ (self , key ):
102
- return self . _wrapped . __contains__ ( key )
103
-
90
+ return key in self
91
+
104
92
105
93
class DocumentMetaWrapper (MutableMapping ):
106
94
"""
@@ -153,7 +141,7 @@ def __init__(self, document, meta=None):
153
141
self ._setup_document_fields ()
154
142
# Setup self.pk if the document has an id_field in it's meta
155
143
# if it doesn't have one it's an embedded document
156
- #if 'id_field' in self._meta:
144
+ # if 'id_field' in self._meta:
157
145
# self.pk_name = self._meta['id_field']
158
146
self ._init_pk ()
159
147
@@ -202,7 +190,7 @@ def _init_pk(self):
202
190
203
191
def _get_pk_val (self ):
204
192
return self ._pk_val
205
-
193
+
206
194
if pk_field is not None :
207
195
self .pk .name = self .pk_name
208
196
self .pk .attname = self .pk_name
@@ -214,35 +202,35 @@ def _get_pk_val(self):
214
202
# needs to add a hidden pk field. It does not for embedded fields.
215
203
# So we pretend to have an editable pk field and just ignore it otherwise
216
204
self .pk .editable = True
217
-
205
+
218
206
@property
219
207
def app_label (self ):
220
208
if self ._app_label is None :
221
209
model_module = sys .modules [self .document .__module__ ]
222
210
self ._app_label = model_module .__name__ .split ('.' )[- 2 ]
223
211
return self ._app_label
224
-
212
+
225
213
@property
226
214
def verbose_name (self ):
227
215
"""
228
216
Returns the verbose name of the document.
229
-
217
+
230
218
Checks the original meta dict first. If it is not found
231
219
then generates a verbose name from the object name.
232
220
"""
233
221
if self ._verbose_name is None :
234
222
verbose_name = self ._meta .get ('verbose_name' , self .object_name )
235
223
self ._verbose_name = capfirst (create_verbose_name (verbose_name ))
236
224
return self ._verbose_name
237
-
225
+
238
226
@property
239
227
def verbose_name_raw (self ):
240
228
return self .verbose_name
241
-
229
+
242
230
@property
243
231
def verbose_name_plural (self ):
244
232
return "%ss" % self .verbose_name
245
-
233
+
246
234
def get_add_permission (self ):
247
235
return 'add_%s' % self .object_name .lower ()
248
236
@@ -251,10 +239,10 @@ def get_change_permission(self):
251
239
252
240
def get_delete_permission (self ):
253
241
return 'delete_%s' % self .object_name .lower ()
254
-
242
+
255
243
def get_ordered_objects (self ):
256
244
return []
257
-
245
+
258
246
def get_field_by_name (self , name ):
259
247
"""
260
248
Returns the (field_object, model, direct, m2m), where field_object is
@@ -274,13 +262,13 @@ def get_field_by_name(self, name):
274
262
else :
275
263
raise FieldDoesNotExist ('%s has no field named %r' %
276
264
(self .object_name , name ))
277
-
265
+
278
266
def get_field (self , name , many_to_many = True ):
279
267
"""
280
268
Returns the requested field by name. Raises FieldDoesNotExist on error.
281
269
"""
282
270
return self .get_field_by_name (name )[0 ]
283
-
271
+
284
272
@property
285
273
def swapped (self ):
286
274
"""
@@ -289,7 +277,7 @@ def swapped(self):
289
277
290
278
For historical reasons, model name lookups using get_model() are
291
279
case insensitive, so we make sure we are case insensitive here.
292
-
280
+
293
281
NOTE: Not sure this is actually usefull for documents. So at the
294
282
moment it's really only here because the admin wants it. It might
295
283
prove usefull for someone though, so it's more then just a dummy.
@@ -311,28 +299,28 @@ def swapped(self):
311
299
not in (None , model_label ):
312
300
return swapped_for
313
301
return None
314
-
302
+
315
303
def __getattr__ (self , name ):
316
304
if name in self ._deprecated_attrs :
317
305
return getattr (self , self ._deprecated_attrs .get (name ))
318
-
306
+
319
307
try :
320
308
return self ._meta [name ]
321
309
except KeyError :
322
310
raise AttributeError
323
-
311
+
324
312
def __setattr__ (self , name , value ):
325
313
if not hasattr (self , name ):
326
314
self ._meta [name ] = value
327
315
else :
328
316
super (DocumentMetaWrapper , self ).__setattr__ (name , value )
329
-
317
+
330
318
def __contains__ (self , key ):
331
319
return key in self ._meta
332
-
320
+
333
321
def __getitem__ (self , key ):
334
322
return self ._meta [key ]
335
-
323
+
336
324
def __setitem__ (self , key , value ):
337
325
self ._meta [key ] = value
338
326
@@ -350,10 +338,10 @@ def get(self, key, default=None):
350
338
return self .__getitem__ (key )
351
339
except KeyError :
352
340
return default
353
-
341
+
354
342
def get_parent_list (self ):
355
343
return []
356
-
344
+
357
345
def get_all_related_objects (self , * args , ** kwargs ):
358
346
return []
359
347
0 commit comments