Skip to content
Open
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
9 changes: 3 additions & 6 deletions mongotools/forms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,12 @@ class MongoFormMetaClass(type):
def __new__(cls, name, bases, attrs):
# get all valid existing Fields and sort them
fields = [(field_name, attrs.pop(field_name)) for field_name, obj in
attrs.items() if isinstance(obj, forms.Field)]
fields.sort(
lambda x, y: cmp(x[1].creation_counter, y[1].creation_counter))
list(attrs.items()) if isinstance(obj, forms.Field)]

# get all Fields from base classes
for base in bases[::-1]:
if hasattr(base, 'base_fields'):
fields = base.base_fields.items() + fields
fields = list(base.base_fields.items()) + fields

# add the fields as "our" base fields
attrs['base_fields'] = OrderedDict(fields)
Expand Down Expand Up @@ -80,10 +78,9 @@ def __new__(cls, name, bases, attrs):
return new_class


class MongoForm(forms.BaseForm):
class MongoForm(forms.BaseForm, metaclass=MongoFormMetaClass):

"""Base MongoForm class. Used to create new MongoForms"""
__metaclass__ = MongoFormMetaClass

def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None,
error_class=forms.utils.ErrorList, label_suffix=':',
Expand Down
20 changes: 11 additions & 9 deletions mongotools/forms/fields.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from django import forms
from django.utils.encoding import smart_unicode
from django.utils.encoding import smart_str, force_str
from pymongo.errors import InvalidId
from bson import ObjectId
from django.core.validators import EMPTY_VALUES
from django.utils.encoding import smart_unicode, force_text
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _

from mongoengine import ReferenceField as MongoReferenceField

Expand Down Expand Up @@ -36,7 +35,7 @@ class MongoCharField(forms.CharField):
def to_python(self, value):
if value in EMPTY_VALUES:
return None
return smart_unicode(value)
return smart_str(value)

class ReferenceField(forms.TypedChoiceField):
"""
Expand Down Expand Up @@ -74,15 +73,18 @@ def _set_queryset(self, queryset):
def _get_choices(self):
return MongoChoiceIterator(self)

choices = property(_get_choices, forms.ChoiceField._set_choices)
def _set_choices(self, value):
forms.ChoiceField.choices.fset(self, value)

choices = property(_get_choices, _set_choices)

def label_from_instance(self, obj):
"""
This method is used to convert objects into strings; it's used to
generate the labels for the choices presented by this object. Subclasses
can override this method to customize the display of the choices.
"""
return smart_unicode(obj)
return smart_str(obj)

def clean(self, oid):
if oid in EMPTY_VALUES and not self.required:
Expand Down Expand Up @@ -132,9 +134,9 @@ def clean(self, value):
raise forms.ValidationError(self.error_messages['invalid_pk_value'] % pk)
qs = self.queryset.clone()
qs = qs.filter(**{'%s__in' % key: filter_ids})
pks = set([force_text(getattr(o, key)) for o in qs])
pks = set([force_str(getattr(o, key)) for o in qs])
for val in value:
if force_text(val) not in pks:
if force_str(val) not in pks:
raise forms.ValidationError(self.error_messages['invalid_choice'] % val)
# Since this overrides the inherited ModelChoiceField.clean
# we run custom validators here
Expand Down Expand Up @@ -182,7 +184,7 @@ def get_field_choices(self, field, include_blank=True,
def string_field(self, value):
if value in EMPTY_VALUES:
return None
return smart_unicode(value)
return smart_str(value)

def integer_field(self, value):
if value in EMPTY_VALUES:
Expand Down
12 changes: 6 additions & 6 deletions mongotools/forms/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import gridfs

from django import forms
from mongoengine.base import ValidationError
from mongoengine.errors import ValidationError
from mongoengine.fields import EmbeddedDocumentField, ListField, ReferenceField
from mongoengine.connection import _get_db
from mongoengine.connection import get_db

from fields import MongoFormFieldGenerator
from mongotools.forms.fields import MongoFormFieldGenerator
import logging
logger = logging.getLogger(__name__)

Expand All @@ -32,7 +32,7 @@ def inner_validate(value, *args, **kwargs):
try:
new_clean(value)
return value
except ValidationError, e:
except ValidationError as e:
raise forms.ValidationError(e)
return inner_validate

Expand Down Expand Up @@ -68,12 +68,12 @@ def iter_valid_fields(meta):
yield (field_name, field)

def _get_unique_filename(name):
fs = gridfs.GridFS(_get_db())
fs = gridfs.GridFS(get_db())
file_root, file_ext = os.path.splitext(name)
count = itertools.count(1)
while fs.exists(filename=name):
# file_ext includes the dot.
name = os.path.join("%s_%s%s" % (file_root, count.next(), file_ext))
name = os.path.join("%s_%s%s" % (file_root, next(count), file_ext))
return name

def save_file(instance, field_name, file):
Expand Down