Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 10 additions & 22 deletions mongodbforms/documentoptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.db.models.fields import FieldDoesNotExist
from django.utils.text import capfirst
from django.db.models.options import get_verbose_name
from django.utils.functional import LazyObject
from django.utils.functional import LazyObject, new_method_proxy
from django.conf import settings

from mongoengine.fields import ReferenceField, ListField
Expand Down Expand Up @@ -65,40 +65,28 @@ def __setattr__(self, attr, value):
class LazyDocumentMetaWrapper(LazyObject):
_document = None
_meta = None

def __init__(self, document):
self._document = document
self._meta = document._meta
super(LazyDocumentMetaWrapper, self).__init__()

def _setup(self):
self._wrapped = DocumentMetaWrapper(self._document, self._meta)

def __setattr__(self, name, value):
if name in ["_document", "_meta",]:
object.__setattr__(self, name, value)
else:
super(LazyDocumentMetaWrapper, self).__setattr__(name, value)

def __dir__(self):
return self._wrapped.__dir__()

def __getitem__(self, key):
return self._wrapped.__getitem__(key)

def __setitem__(self, key, value):
return self._wrapped.__getitem__(key, value)

def __delitem__(self, key):
return self._wrapped.__delitem__(key)

def __len__(self):
return self._wrapped.__len__()


__len__ = new_method_proxy(len)

@new_method_proxy
def __contains__(self, key):
return self._wrapped.__contains__(key)

return key in self


class DocumentMetaWrapper(MutableMapping):
"""
Used to store mongoengine's _meta dict to make the document admin
Expand Down
50 changes: 50 additions & 0 deletions mongodbforms/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# -*- coding: utf-8 -*-
from django.conf import settings

settings.configure(
DEBUG=True,
DATABASES={
'default': {
'ENGINE': 'django.db.backends.sqlite3',
}
},
ROOT_URLCONF='',
INSTALLED_APPS=(
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.admin',
'mongodbforms',
)
)


import mongoengine
from django.test import SimpleTestCase
from mongodbforms.documentoptions import LazyDocumentMetaWrapper


class TestDocument(mongoengine.Document):
meta = {'abstract': True}

name = mongoengine.StringField()


class LazyWrapperTest(SimpleTestCase):

def test_lazy_getitem(self):
meta = LazyDocumentMetaWrapper(TestDocument)
self.assertTrue(meta['abstract'])

meta = LazyDocumentMetaWrapper(TestDocument)
self.assertTrue(meta.get('abstract'))

meta = LazyDocumentMetaWrapper(TestDocument)
self.assertTrue('abstract' in meta)

meta = LazyDocumentMetaWrapper(TestDocument)
self.assertEqual(len(meta), 1)

meta = LazyDocumentMetaWrapper(TestDocument)
meta.custom = 'yes'
self.assertEqual(meta.custom, 'yes')
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def convert_readme():
return open('README.txt').read()

setup(name='mongodbforms',
version='0.3',
version='0.3.1',
description="An implementation of django forms using mongoengine.",
author='Jan Schrewe',
author_email='jan@schafproductions.com',
Expand Down