Commit f6d0a10b authored by Serge S. Koval's avatar Serge S. Koval

MongoEngine inline forms now converted properly

parent ad5bc907
from wtforms.fields import FormField
class ModelFormField(FormField):
def __init__(self, model, *args, **kwargs):
super(ModelFormField, self).__init__(*args, **kwargs)
self.model = model
def populate_obj(self, obj, name):
candidate = getattr(obj, name, None)
if candidate is None:
candidate = self.model()
setattr(obj, name, candidate)
self.form.populate_obj(candidate)
......@@ -5,7 +5,10 @@ from wtforms import fields as f
from flask.ext.mongoengine.wtf import orm, fields
from flask.ext.admin import form
from flask.ext.admin.model.fields import InlineFieldList, InlineModelFormField
from flask.ext.admin.model.fields import InlineFieldList
from flask.ext.admin.model.widgets import InlineFormWidget
from .fields import ModelFormField
class CustomModelConverter(orm.ModelConverter):
......@@ -38,11 +41,11 @@ class CustomModelConverter(orm.ModelConverter):
kwargs = {
'validators': [],
'filters': [],
'widget': InlineModelFormField()
'widget': InlineFormWidget()
}
form_class = model_form(field.document_type_obj, field_args={})
return f.FormField(form_class, **kwargs)
return ModelFormField(field.document_type_obj, form_class, **kwargs)
@orm.converts('ReferenceField')
def conv_Reference(self, model, field, kwargs):
......
......@@ -220,7 +220,8 @@ class ModelView(BaseModelView):
def create_model(self, form):
try:
model = self.model(**form.data)
model = self.model()
form.populate_obj(model)
self.on_model_change(form, model)
model.save()
return True
......@@ -232,12 +233,7 @@ class ModelView(BaseModelView):
def update_model(self, form, model):
try:
for f in form:
name, field = f.name, f
if hasattr(model, name) and getattr(model, name) != field.data:
setattr(model, name, field.data)
form.populate_obj(model)
self.on_model_change(form, model)
model.save()
return True
......
......@@ -746,8 +746,6 @@ class BaseModelView(BaseView, ActionsMixin):
value = rec_getattr(model, name)
print name, type(value)
type_fmt = self.list_type_formatters.get(type(value))
if type_fmt is not None:
value = type_fmt(value)
......
import itertools
from wtforms.fields import FieldList, FormField
from .widgets import InlineFieldListWidget, InlineFormWidget
......@@ -37,15 +39,24 @@ class InlineFieldList(FieldList):
return getattr(field, '_should_delete', False)
def populate_obj(self, obj, name):
result = []
for f in self.entries:
if not self.should_delete(f):
field = self.field_type()
f.populate_obj(field, None)
result.append(field)
setattr(obj, self.prop, result)
values = getattr(obj, name, None)
try:
ivalues = iter(values)
except TypeError:
ivalues = iter([])
candidates = itertools.chain(ivalues, itertools.repeat(None))
_fake = type(str('_fake'), (object, ), {})
output = []
for field, data in itertools.izip(self.entries, candidates):
if not self.should_delete(field):
fake_obj = _fake()
fake_obj.data = data
field.populate_obj(fake_obj, 'data')
output.append(fake_obj.data)
setattr(obj, name, output)
class InlineModelFormField(FormField):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment