Skip to content

Commit

Permalink
[api] New, validators_columns property to add custom validation
Browse files Browse the repository at this point in the history
  • Loading branch information
dpgaspar committed Mar 29, 2019
1 parent 2613972 commit 0777bb0
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 9 deletions.
10 changes: 10 additions & 0 deletions docs/rest_api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1067,3 +1067,13 @@ Let's try it out::
}
}

Overriding completely the marshmallow Schema gives you complete control
but can become very cumbersome for **Models** with many attributes, there is
a simpler way of doing this using ``validators_columns`` property::

class GroupModelRestApi(ModelRestApi):
resource_name = 'group'
datamodel = SQLAInterface(ContactGroup)
validators_columns = {'name': validate_name}


13 changes: 7 additions & 6 deletions flask_appbuilder/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -543,11 +543,9 @@ class MyView(ModelView):
description_columns = {'name':'your models name column',
'address':'the address column'}
"""
formatters_columns = None
""" Dictionary of formatter used to format the display of columns
validators_columns = None
""" Dictionary to add your own validators for forms """

formatters_columns = {'some_date_col': lambda x: x.isoformat() }
"""
add_query_rel_fields = None
"""
Add Customized query for related add fields.
Expand Down Expand Up @@ -604,7 +602,11 @@ class ContactModelView(ModelRestApi):

def __init__(self):
super(ModelRestApi, self).__init__()
self.model2schemaconverter = self.model2schemaconverter(self.datamodel)
self.validators_columns = self.validators_columns or {}
self.model2schemaconverter = self.model2schemaconverter(
self.datamodel,
self.validators_columns
)

def create_blueprint(self, appbuilder, *args, **kwargs):
self._init_model_schemas()
Expand Down Expand Up @@ -656,7 +658,6 @@ def _init_properties(self):
super(ModelRestApi, self)._init_properties()
# Reset init props
self.description_columns = self.description_columns or {}
self.formatters_columns = self.formatters_columns or {}
self.list_exclude_columns = self.list_exclude_columns or []
self.show_exclude_columns = self.show_exclude_columns or []
self.add_exclude_columns = self.add_exclude_columns or []
Expand Down
9 changes: 6 additions & 3 deletions flask_appbuilder/api/convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@

class BaseModel2SchemaConverter(object):

def __init__(self, datamodel):
def __init__(self, datamodel, validators_columns):
"""
:param datamodel: SQLAInterface
"""
self.datamodel = datamodel
self.validators_columns = validators_columns

def convert(self, columns, **kwargs):
pass
Expand All @@ -21,11 +22,11 @@ class Model2SchemaConverter(BaseModel2SchemaConverter):
Class that converts Models to marshmallow Schemas
"""

def __init__(self, datamodel):
def __init__(self, datamodel, validators_columns):
"""
:param datamodel: SQLAInterface
"""
super(Model2SchemaConverter, self).__init__(datamodel)
super(Model2SchemaConverter, self).__init__(datamodel, validators_columns)

@staticmethod
def _debug_schema(schema):
Expand Down Expand Up @@ -101,6 +102,8 @@ def _column2field(self, datamodel, column, nested=True, enum_dump_by_name=False)
if not hasattr(getattr(_model, column), '__call__'):
field = field_for(_model, column)
field.unique = datamodel.is_unique(column)
if column in self.validators_columns:
field.validate.append(self.validators_columns[column])
return field

def convert(self, columns, model=None, nested=True, enum_dump_by_name=False):
Expand Down

0 comments on commit 0777bb0

Please sign in to comment.