Commit 65937041 authored by rma4ok's avatar rma4ok

[fix] ListField validation

parent 36d16974
from mongoengine import ReferenceField from mongoengine import ReferenceField, ListField
from mongoengine.base import BaseDocument, DocumentMetaclass, get_document from mongoengine.base import BaseDocument, DocumentMetaclass, get_document
from wtforms import fields, validators from wtforms import fields, validators
...@@ -72,7 +72,7 @@ class CustomModelConverter(orm.ModelConverter): ...@@ -72,7 +72,7 @@ class CustomModelConverter(orm.ModelConverter):
if field.required: if field.required:
kwargs['validators'].append(validators.Required()) kwargs['validators'].append(validators.Required())
else: elif not isinstance(field, ListField):
kwargs['validators'].append(validators.Optional()) kwargs['validators'].append(validators.Optional())
ftype = type(field).__name__ ftype = type(field).__name__
......
...@@ -87,9 +87,10 @@ def is_field_error(errors): ...@@ -87,9 +87,10 @@ def is_field_error(errors):
:param errors: :param errors:
Errors list. Errors list.
""" """
for e in errors: if isinstance(errors, (list, tuple)):
if isinstance(e, string_types): for e in errors:
return True if isinstance(e, string_types):
return True
return False return False
......
...@@ -97,7 +97,7 @@ ...@@ -97,7 +97,7 @@
<p class="help-block">{{ field.description }}</p> <p class="help-block">{{ field.description }}</p>
{% endif %} {% endif %}
{% if direct_error %} {% if direct_error %}
<ul{% if direct_error %} class="input-errors"{% endif %}> <ul class="input-errors">
{% for e in field.errors if e is string %} {% for e in field.errors if e is string %}
<li>{{ e }}</li> <li>{{ e }}</li>
{% endfor %} {% endfor %}
......
...@@ -2,6 +2,14 @@ ...@@ -2,6 +2,14 @@
{% macro render_field(field) %} {% macro render_field(field) %}
{{ field }} {{ field }}
{% if h.is_field_error(field.errors) %}
<ul class="input-errors">
{% for e in field.errors if e is string %}
<li>{{ e }}</li>
{% endfor %}
</ul>
{% endif %}
{% endmacro %} {% endmacro %}
{{ base.render_inline_fields(field, template, render_field, check) }} {{ base.render_inline_fields(field, template, render_field, check) }}
...@@ -2,6 +2,14 @@ ...@@ -2,6 +2,14 @@
{% macro render_field(field) %} {% macro render_field(field) %}
{{ field }} {{ field }}
{% if h.is_field_error(field.errors) %}
<ul class="help-block input-errors">
{% for e in field.errors if e is string %}
<li>{{ e }}</li>
{% endfor %}
</ul>
{% endif %}
{% endmacro %} {% endmacro %}
{{ base.render_inline_fields(field, template, render_field, check) }} {{ base.render_inline_fields(field, template, render_field, check) }}
...@@ -791,6 +791,30 @@ def test_nested_list_subdocument(): ...@@ -791,6 +791,30 @@ def test_nested_list_subdocument():
ok_('value' not in dir(inline_form)) ok_('value' not in dir(inline_form))
def test_list_subdocument_validation():
app, db, admin = setup()
class Comment(db.EmbeddedDocument):
name = db.StringField(max_length=20, required=True)
value = db.StringField(max_length=20)
class Model1(db.Document):
test1 = db.StringField(max_length=20)
subdoc = db.ListField(db.EmbeddedDocumentField(Comment))
view = CustomModelView(Model1)
admin.add_view(view)
client = app.test_client()
rv = client.post('/admin/model1/new/',
data={'test1': 'test1large', 'subdoc-0-name': 'comment', 'subdoc-0-value': 'test'})
eq_(rv.status_code, 302)
rv = client.post('/admin/model1/new/',
data={'test1': 'test1large', 'subdoc-0-name': '', 'subdoc-0-value': 'test'})
eq_(rv.status_code, 200)
ok_('This field is required' in rv.data)
def test_ajax_fk(): def test_ajax_fk():
app, db, admin = setup() app, db, admin = setup()
......
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