From 28c1b6a9357e697df2545107c872b5ff5183b30f Mon Sep 17 00:00:00 2001 From: Luis Araujo Date: Thu, 30 Aug 2012 15:32:49 -0300 Subject: [PATCH 1/4] Add suport to dynamic fields --- mongoforms/forms.py | 17 +++++++++++++---- mongoforms/utils.py | 5 +++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/mongoforms/forms.py b/mongoforms/forms.py index 6302a55..efd2466 100644 --- a/mongoforms/forms.py +++ b/mongoforms/forms.py @@ -78,12 +78,21 @@ def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, # walk through the document fields for field_name, field in iter_valid_fields(self._meta): # add field data if needed + if not hasattr(instance, field_name): + continue field_data = getattr(instance, field_name) - if isinstance(self._meta.document._fields[field_name], ReferenceField): - # field data could be None for not populated refs - field_data = field_data and str(field_data.id) + if not self._meta.document._dynamic: + fields = self._meta.document._fields + # add dfields if document is dynamic + elif hasattr(self._meta.document, '_dfields'): + fields = self._meta.document._dfields + else: + continue + if field_name in fields: + _field = fields[field_name] + if isinstance(_field, ReferenceField): + field_data = field_data and str(field_data.id) object_data[field_name] = field_data - # additional initial data available? if initial is not None: object_data.update(initial) diff --git a/mongoforms/utils.py b/mongoforms/utils.py index 533f1d0..8c8f58b 100644 --- a/mongoforms/utils.py +++ b/mongoforms/utils.py @@ -39,3 +39,8 @@ def iter_valid_fields(meta): # skip excluded fields if field_name not in meta_exclude: yield (field_name, field) + + # walk through meta dfields + if meta.document._dynamic and hasattr(meta.document, '_dfields'): + for field_name, field in meta.document._dfields.iteritems(): + yield (field_name, field) \ No newline at end of file From 502d983be6d40e98a930a3cf82b6527a05b1ba7f Mon Sep 17 00:00:00 2001 From: Luis Araujo Date: Tue, 4 Sep 2012 18:39:18 -0300 Subject: [PATCH 2/4] Adding support to ListField --- mongoforms/fields.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/mongoforms/fields.py b/mongoforms/fields.py index 5079591..0454599 100644 --- a/mongoforms/fields.py +++ b/mongoforms/fields.py @@ -2,6 +2,7 @@ from django.utils.encoding import smart_unicode from bson.errors import InvalidId from bson.objectid import ObjectId +from mongoengine import StringField class ReferenceField(forms.ChoiceField): @@ -154,3 +155,33 @@ def generate_referencefield(self, field_name, field, label): return ReferenceField( field.document_type.objects, label=label) + + def generate_listfield(self, field_name, field, label): + # import pdb; pdb.set_trace() + if field.field.choices: + defaults = { + 'choices': tuple(field.field.choices), + 'required': field.required, + 'label': label, + 'widget': forms.CheckboxSelectMultiple + } + return forms.MultipleChoiceField(**defaults) + + if isinstance(field.field, ReferenceField): + defaults = { + 'label': label, + 'required': field.required + } + + f = DocumentMultipleChoiceField(field.field.document_type.objects, **defaults) + return f + + if isinstance(field.field, StringField): + defaults = { + 'required': field.required, + 'label': label, + 'widget': forms.Textarea + } + return forms.CharField(**defaults) + raise NotImplementedError('A ListField of %s is not supported by MongoForm' % \ + field.field.__class__.__name__) From fc4da87c05cd633aaf79f2a6b7e23a239412f309 Mon Sep 17 00:00:00 2001 From: Luis Araujo Date: Tue, 4 Sep 2012 18:43:30 -0300 Subject: [PATCH 3/4] Remove unnecessary pdb block. --- mongoforms/fields.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mongoforms/fields.py b/mongoforms/fields.py index 0454599..cc6887b 100644 --- a/mongoforms/fields.py +++ b/mongoforms/fields.py @@ -157,7 +157,6 @@ def generate_referencefield(self, field_name, field, label): label=label) def generate_listfield(self, field_name, field, label): - # import pdb; pdb.set_trace() if field.field.choices: defaults = { 'choices': tuple(field.field.choices), From 7aa7d14c2b5e980bbf1709f38f6d4d495e807293 Mon Sep 17 00:00:00 2001 From: Luis Araujo Date: Fri, 7 Sep 2012 17:14:05 -0300 Subject: [PATCH 4/4] A better way to use ListFields --- mongoforms/fields.py | 55 ++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/mongoforms/fields.py b/mongoforms/fields.py index cc6887b..5f1366c 100644 --- a/mongoforms/fields.py +++ b/mongoforms/fields.py @@ -5,6 +5,26 @@ from mongoengine import StringField + + +class ListField(forms.Field): + """ + List field for mongo forms. + Uses MultiValueField from django.forms module. + """ + field_name_separator = '__' + + def __init__(self, field, field_name_base, list_size=2, *args, **kwargs): + forms.Field.__init__(self, *args, **kwargs) + self.fields = [] + + field_generator = MongoFormFieldGenerator() + + for field_num in range(list_size): + field_name = '%s%s%s' % (field_name_base, + self.field_name_separator, field_num) + self.fields.append(field_generator.generate(field_name, field)) + class ReferenceField(forms.ChoiceField): """ Reference field for mongo forms. Inspired by `django.forms.models.ModelChoiceField`. @@ -156,31 +176,12 @@ def generate_referencefield(self, field_name, field, label): field.document_type.objects, label=label) + # Custom def generate_listfield(self, field_name, field, label): - if field.field.choices: - defaults = { - 'choices': tuple(field.field.choices), - 'required': field.required, - 'label': label, - 'widget': forms.CheckboxSelectMultiple - } - return forms.MultipleChoiceField(**defaults) - - if isinstance(field.field, ReferenceField): - defaults = { - 'label': label, - 'required': field.required - } - - f = DocumentMultipleChoiceField(field.field.document_type.objects, **defaults) - return f - - if isinstance(field.field, StringField): - defaults = { - 'required': field.required, - 'label': label, - 'widget': forms.Textarea - } - return forms.CharField(**defaults) - raise NotImplementedError('A ListField of %s is not supported by MongoForm' % \ - field.field.__class__.__name__) + return ListField( + label=label, + field=field.field, + field_name_base=field_name, + required=field.required, + initial=field.default) + \ No newline at end of file