Skip to content

Commit 3759a48

Browse files
author
Jan Schrewe
committed
Merge branch ‘pr/78’ from (@Bahus) and close jschrewe#78
2 parents 62bab67 + cef1d49 commit 3759a48

File tree

3 files changed

+84
-46
lines changed

3 files changed

+84
-46
lines changed

mongodbforms/documentoptions.py

Lines changed: 33 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from django.db.models.fields import FieldDoesNotExist
66
from django.utils.text import capfirst
7-
from django.utils.functional import LazyObject
7+
from django.utils.functional import LazyObject, new_method_proxy
88
from django.conf import settings
99
try:
1010
from django.db.models.options import get_verbose_name
@@ -50,7 +50,7 @@ def to(self, value):
5050
class PkWrapper(object):
5151
editable = False
5252
fake = False
53-
53+
5454
def __init__(self, wrapped):
5555
self.obj = wrapped
5656

@@ -68,39 +68,27 @@ def __setattr__(self, attr, value):
6868
class LazyDocumentMetaWrapper(LazyObject):
6969
_document = None
7070
_meta = None
71-
71+
7272
def __init__(self, document):
7373
self._document = document
7474
self._meta = document._meta
7575
super(LazyDocumentMetaWrapper, self).__init__()
76-
76+
7777
def _setup(self):
7878
self._wrapped = DocumentMetaWrapper(self._document, self._meta)
79-
79+
8080
def __setattr__(self, name, value):
81-
if name in ["_document", "_meta",]:
81+
if name in ["_document", "_meta", ]:
8282
object.__setattr__(self, name, value)
8383
else:
8484
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
10189
def __contains__(self, key):
102-
return self._wrapped.__contains__(key)
103-
90+
return key in self
91+
10492

10593
class DocumentMetaWrapper(MutableMapping):
10694
"""
@@ -153,7 +141,7 @@ def __init__(self, document, meta=None):
153141
self._setup_document_fields()
154142
# Setup self.pk if the document has an id_field in it's meta
155143
# 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:
157145
# self.pk_name = self._meta['id_field']
158146
self._init_pk()
159147

@@ -202,7 +190,7 @@ def _init_pk(self):
202190

203191
def _get_pk_val(self):
204192
return self._pk_val
205-
193+
206194
if pk_field is not None:
207195
self.pk.name = self.pk_name
208196
self.pk.attname = self.pk_name
@@ -214,35 +202,35 @@ def _get_pk_val(self):
214202
# needs to add a hidden pk field. It does not for embedded fields.
215203
# So we pretend to have an editable pk field and just ignore it otherwise
216204
self.pk.editable = True
217-
205+
218206
@property
219207
def app_label(self):
220208
if self._app_label is None:
221209
model_module = sys.modules[self.document.__module__]
222210
self._app_label = model_module.__name__.split('.')[-2]
223211
return self._app_label
224-
212+
225213
@property
226214
def verbose_name(self):
227215
"""
228216
Returns the verbose name of the document.
229-
217+
230218
Checks the original meta dict first. If it is not found
231219
then generates a verbose name from the object name.
232220
"""
233221
if self._verbose_name is None:
234222
verbose_name = self._meta.get('verbose_name', self.object_name)
235223
self._verbose_name = capfirst(create_verbose_name(verbose_name))
236224
return self._verbose_name
237-
225+
238226
@property
239227
def verbose_name_raw(self):
240228
return self.verbose_name
241-
229+
242230
@property
243231
def verbose_name_plural(self):
244232
return "%ss" % self.verbose_name
245-
233+
246234
def get_add_permission(self):
247235
return 'add_%s' % self.object_name.lower()
248236

@@ -251,10 +239,10 @@ def get_change_permission(self):
251239

252240
def get_delete_permission(self):
253241
return 'delete_%s' % self.object_name.lower()
254-
242+
255243
def get_ordered_objects(self):
256244
return []
257-
245+
258246
def get_field_by_name(self, name):
259247
"""
260248
Returns the (field_object, model, direct, m2m), where field_object is
@@ -274,13 +262,13 @@ def get_field_by_name(self, name):
274262
else:
275263
raise FieldDoesNotExist('%s has no field named %r' %
276264
(self.object_name, name))
277-
265+
278266
def get_field(self, name, many_to_many=True):
279267
"""
280268
Returns the requested field by name. Raises FieldDoesNotExist on error.
281269
"""
282270
return self.get_field_by_name(name)[0]
283-
271+
284272
@property
285273
def swapped(self):
286274
"""
@@ -289,7 +277,7 @@ def swapped(self):
289277
290278
For historical reasons, model name lookups using get_model() are
291279
case insensitive, so we make sure we are case insensitive here.
292-
280+
293281
NOTE: Not sure this is actually usefull for documents. So at the
294282
moment it's really only here because the admin wants it. It might
295283
prove usefull for someone though, so it's more then just a dummy.
@@ -311,28 +299,28 @@ def swapped(self):
311299
not in (None, model_label):
312300
return swapped_for
313301
return None
314-
302+
315303
def __getattr__(self, name):
316304
if name in self._deprecated_attrs:
317305
return getattr(self, self._deprecated_attrs.get(name))
318-
306+
319307
try:
320308
return self._meta[name]
321309
except KeyError:
322310
raise AttributeError
323-
311+
324312
def __setattr__(self, name, value):
325313
if not hasattr(self, name):
326314
self._meta[name] = value
327315
else:
328316
super(DocumentMetaWrapper, self).__setattr__(name, value)
329-
317+
330318
def __contains__(self, key):
331319
return key in self._meta
332-
320+
333321
def __getitem__(self, key):
334322
return self._meta[key]
335-
323+
336324
def __setitem__(self, key, value):
337325
self._meta[key] = value
338326

@@ -350,10 +338,10 @@ def get(self, key, default=None):
350338
return self.__getitem__(key)
351339
except KeyError:
352340
return default
353-
341+
354342
def get_parent_list(self):
355343
return []
356-
344+
357345
def get_all_related_objects(self, *args, **kwargs):
358346
return []
359347

mongodbforms/tests.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# -*- coding: utf-8 -*-
2+
from django.conf import settings
3+
4+
settings.configure(
5+
DEBUG=True,
6+
DATABASES={
7+
'default': {
8+
'ENGINE': 'django.db.backends.sqlite3',
9+
}
10+
},
11+
ROOT_URLCONF='',
12+
INSTALLED_APPS=(
13+
'django.contrib.auth',
14+
'django.contrib.contenttypes',
15+
'django.contrib.sessions',
16+
'django.contrib.admin',
17+
'mongodbforms',
18+
)
19+
)
20+
21+
22+
import mongoengine
23+
from django.test import SimpleTestCase
24+
from mongodbforms.documentoptions import LazyDocumentMetaWrapper
25+
26+
27+
class TestDocument(mongoengine.Document):
28+
meta = {'abstract': True}
29+
30+
name = mongoengine.StringField()
31+
32+
33+
class LazyWrapperTest(SimpleTestCase):
34+
35+
def test_lazy_getitem(self):
36+
meta = LazyDocumentMetaWrapper(TestDocument)
37+
self.assertTrue(meta['abstract'])
38+
39+
meta = LazyDocumentMetaWrapper(TestDocument)
40+
self.assertTrue(meta.get('abstract'))
41+
42+
meta = LazyDocumentMetaWrapper(TestDocument)
43+
self.assertTrue('abstract' in meta)
44+
45+
meta = LazyDocumentMetaWrapper(TestDocument)
46+
self.assertEqual(len(meta), 1)
47+
48+
meta = LazyDocumentMetaWrapper(TestDocument)
49+
meta.custom = 'yes'
50+
self.assertEqual(meta.custom, 'yes')

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def convert_readme():
1111
return open('README.txt').read()
1212

1313
setup(name='mongodbforms',
14-
version='0.3',
14+
version='0.3.1',
1515
description="An implementation of django forms using mongoengine.",
1616
author='Jan Schrewe',
1717
author_email='jan@schafproductions.com',

0 commit comments

Comments
 (0)