Skip to content

Commit 150a6b0

Browse files
author
Jan Schrewe
committed
Pass kwargs to default field. Add PkWrapper that works with bson.ObjectIDs.
1 parent 7e7e722 commit 150a6b0

File tree

2 files changed

+41
-24
lines changed

2 files changed

+41
-24
lines changed

mongodbforms/documentoptions.py

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,27 @@
55

66
from mongoengine.fields import ReferenceField
77

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+
816
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)
1629

1730
class AdminOptions(object):
1831
"""
@@ -45,6 +58,9 @@ def __init__(self, document):
4558
self.meta = document._meta
4659

4760
self.init_from_meta()
61+
62+
self.pk_name = self.id_field
63+
4864
self.init_pk()
4965

5066
def init_from_meta(self):
@@ -69,8 +85,13 @@ def init_from_meta(self):
6985

7086
if self.verbose_name_plural is None:
7187
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+
7495

7596
def init_pk(self):
7697
"""
@@ -82,15 +103,10 @@ def init_pk(self):
82103
if self.id_field is not None:
83104
try:
84105
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
94110

95111
from mongoadmin.util import patch_document
96112

mongodbforms/util.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,17 @@ def generate(self, field_name, field, **kwargs):
2828
# a normal charfield is always a good guess
2929
# for a widget.
3030
# TODO: Somehow add a warning
31-
kwargs = {'required': field.required}
31+
defaults = {'required': field.required}
3232

3333
if hasattr(field, 'min_length'):
34-
kwargs['min_length'] = field.min_length
34+
defaults['min_length'] = field.min_length
3535

3636
if hasattr(field, 'max_length'):
37-
kwargs['max_length'] = field.max_length
37+
defaults['max_length'] = field.max_length
3838

3939
if hasattr(field, 'default'):
40-
kwargs['initial'] = field.default
41-
42-
return forms.CharField(kwargs)
40+
defaults['initial'] = field.default
41+
42+
defaults.update(kwargs)
43+
return forms.CharField(**kwargs)
4344

0 commit comments

Comments
 (0)