Commit c73875b3 authored by Serge S. Koval's avatar Serge S. Koval Committed by GitHub

Merge pull request #1312 from datran/coremabu

Support form_args for appengine
parents 971ce904 5b3a64ab
from wtforms.fields import TextField
from google.appengine.ext import ndb
import decimal
class GeoPtPropertyField(TextField):
def process_formdata(self, valuelist):
if valuelist:
try:
lat, lon = valuelist[0].split(',')
self.data = ndb.GeoPt(
decimal.Decimal(lat.strip()),
decimal.Decimal(lon.strip())
)
except (decimal.InvalidOperation, ValueError):
raise ValueError('Not a valid coordinate location')
from wtforms_appengine.ndb import ModelConverter
from .fields import GeoPtPropertyField
from flask_admin.model.form import converts
class AdminModelConverter(ModelConverter):
@converts('GeoPt')
def convert_GeoPtProperty(self, model, prop, kwargs):
"""Returns a form field for a ``ndb.GeoPtProperty``."""
return GeoPtPropertyField(**kwargs)
...@@ -9,7 +9,7 @@ from google.appengine.ext import ndb ...@@ -9,7 +9,7 @@ from google.appengine.ext import ndb
from flask_wtf import Form from flask_wtf import Form
from flask_admin.model.form import create_editable_list_form from flask_admin.model.form import create_editable_list_form
from .form import AdminModelConverter
class NdbModelView(BaseModelView): class NdbModelView(BaseModelView):
""" """
...@@ -35,16 +35,46 @@ class NdbModelView(BaseModelView): ...@@ -35,16 +35,46 @@ class NdbModelView(BaseModelView):
#TODO: implement #TODO: implement
pass pass
form_args = None
model_form_converter = AdminModelConverter
"""
Model form conversion class. Use this to implement custom field conversion logic.
For example::
class MyModelConverter(AdminModelConverter):
pass
class MyAdminView(ModelView):
model_form_converter = MyModelConverter
"""
def scaffold_form(self): def scaffold_form(self):
form_class = wt_ndb.model_form(self.model()) form_class = wt_ndb.model_form(
self.model(),
base_class=Form,
only=self.form_columns,
exclude=self.form_excluded_columns,
field_args=self.form_args,
converter=self.model_form_converter(),
)
return form_class return form_class
def scaffold_list_form(self, widget=None, validators=None): def scaffold_list_form(self, widget=None, validators=None):
form_class = wt_ndb.model_form(self.model()) form_class = wt_ndb.model_form(
self.model(),
base_class=Form,
only=self.column_editable_list,
field_args=self.form_args,
converter=self.model_form_converter(),
)
result = create_editable_list_form(Form, form_class, widget) result = create_editable_list_form(Form, form_class, widget)
return result return result
def get_list(self, page, sort_field, sort_desc, search, filters): def get_list(self, page, sort_field, sort_desc, search, filters,
page_size=None):
#TODO: implement filters (don't think search can work here) #TODO: implement filters (don't think search can work here)
q = self.model.query() q = self.model.query()
...@@ -55,7 +85,11 @@ class NdbModelView(BaseModelView): ...@@ -55,7 +85,11 @@ class NdbModelView(BaseModelView):
order_field = -order_field order_field = -order_field
q = q.order(order_field) q = q.order(order_field)
results = q.fetch(self.page_size, offset=page*self.page_size) if not page_size:
page_size = self.page_size
results = q.fetch(page_size, offset=page*page_size)
return q.count(), results return q.count(), results
def get_one(self, urlsafe_key): def get_one(self, urlsafe_key):
......
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