5
5
6
6
from mongoengine .fields import ReferenceField
7
7
8
+ #class PkWrapper(object):
9
+ # """
10
+ # Wraps an immutable class (like mongoengine's pk field) so that attributes can be added.
11
+ # """
12
+ # def __init__(self, baseObject):
13
+ # self.__class__ = type(baseObject.__class__.__name__, (self.__class__, baseObject.__class__), {})
14
+ # self.__dict__ = baseObject.__dict__
15
+
8
16
class PkWrapper (object ):
9
- """
10
- Wraps an immutable class (like mongoengine's pk field) so that attributes can be added.
11
- """
12
- def __init__ (self , baseObject ):
13
- self .__class__ = type (baseObject .__class__ .__name__ , (self .__class__ , baseObject .__class__ ), {})
14
- self .__dict__ = baseObject .__dict__
15
-
17
+ def __init__ (self , wrapped ):
18
+ self .obj = wrapped
19
+
20
+ def __getattr__ (self , attr ):
21
+ if attr in dir (self .baseObject ):
22
+ return getattr (self .baseObject , attr )
23
+ raise AttributeError
24
+
25
+ def __setattr__ (self , attr , value ):
26
+ if attr != 'obj' and hasattr (self .obj , attr ):
27
+ setattr (self .obj , attr , value )
28
+ super (PkWrapper , self ).__setattr__ (attr , value )
16
29
17
30
class AdminOptions (object ):
18
31
"""
@@ -45,6 +58,9 @@ def __init__(self, document):
45
58
self .meta = document ._meta
46
59
47
60
self .init_from_meta ()
61
+
62
+ self .pk_name = self .id_field
63
+
48
64
self .init_pk ()
49
65
50
66
def init_from_meta (self ):
@@ -69,8 +85,13 @@ def init_from_meta(self):
69
85
70
86
if self .verbose_name_plural is None :
71
87
self .verbose_name_plural = "%ss" % self .verbose_name
72
-
73
-
88
+
89
+ @property
90
+ def pk (self ):
91
+ if not hasattr (self ._pk , 'attname' ):
92
+ self .init_pk ()
93
+ return self ._pk
94
+
74
95
75
96
def init_pk (self ):
76
97
"""
@@ -82,15 +103,10 @@ def init_pk(self):
82
103
if self .id_field is not None :
83
104
try :
84
105
pk_field = getattr (self .document , self .id_field )
85
- try :
86
- self .pk = PkWrapper (pk_field )
87
- except TypeError :
88
- self .pk = pk_field
89
-
90
- self .pk .name = self .id_field
91
- self .pk .attname = self .id_field
92
-
93
- self .pk_name = self .id_field
106
+ self ._pk = PkWrapper (pk_field )
107
+ self ._pk .name = self .id_field
108
+ self ._pk .attname = self .id_field
109
+ self ._pk_name = self .id_field
94
110
95
111
from mongoadmin .util import patch_document
96
112
0 commit comments