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

Fixed peewee inline model views

parent c4a63e75
from wtforms import fields
from peewee import DateTimeField, DateField, TimeField, BaseModel, ForeignKeyField
from peewee import (DateTimeField, DateField, TimeField,
PrimaryKeyField, ForeignKeyField, BaseModel)
from wtfpeewee.orm import ModelConverter, model_form
......@@ -71,10 +72,15 @@ class InlineModelFormList(fields.FieldList):
class CustomModelConverter(ModelConverter):
def __init__(self, additional=None):
super(CustomModelConverter, self).__init__(additional)
self.converters[PrimaryKeyField] = self.handle_pk
self.converters[DateTimeField] = self.handle_datetime
self.converters[DateField] = self.handle_date
self.converters[TimeField] = self.handle_time
def handle_pk(self, model, field, **kwargs):
kwargs['validators'] = []
return field.name, fields.HiddenField(**kwargs)
def handle_date(self, model, field, **kwargs):
kwargs['widget'] = form.DatePickerWidget()
return field.name, fields.DateField(**kwargs)
......@@ -88,6 +94,27 @@ class CustomModelConverter(ModelConverter):
class InlineModelConverter(InlineModelConverterBase):
def get_info(self, p):
info = super(InlineModelConverter, self).get_info(p)
if info is None:
if isinstance(p, BaseModel):
info = InlineFormAdmin(p)
else:
model = getattr(p, 'model', None)
if model is None:
raise Exception('Unknown inline model admin: %s' % repr(p))
attrs = dict()
for attr in dir(p):
if not attr.startswith('_') and attr != model:
attrs[attr] = getattr(p, attr)
info = InlineFormAdmin(model, **attrs)
return info
def contribute(self, converter, model, form_class, inline_model):
# Find property from target model to current model
reverse_field = None
......
......@@ -2,7 +2,8 @@ from wtforms import fields, validators
from sqlalchemy import Boolean, Column
from flask.ext.admin import form
from flask.ext.admin.model.form import converts, ModelConverterBase, InlineModelConverterBase
from flask.ext.admin.model.form import (converts, ModelConverterBase,
InlineFormAdmin, InlineModelConverterBase)
from .validators import Unique
from .fields import QuerySelectField, QuerySelectMultipleField, InlineModelFormList
......@@ -327,6 +328,30 @@ class InlineModelConverter(InlineModelConverterBase):
def __init__(self, session):
self.session = session
def get_info(self, p):
info = super(InlineModelConverter, self).get_info(p)
# Special case for model instances
if info is None:
if hasattr(p, '_sa_class_manager'):
return InlineFormAdmin(p)
else:
model = getattr(p, 'model', None)
if model is None:
raise Exception('Unknown inline model admin: %s' % repr(p))
attrs = dict()
for attr in dir(p):
if not attr.startswith('_') and attr != 'model':
attrs[attr] = getattr(p, attr)
return InlineFormAdmin(model, **attrs)
info = InlineFormAdmin(model, **attrs)
return info
def contribute(self, converter, model, form_class, inline_model):
"""
Generate form fields for inline forms and contribute them to
......@@ -396,7 +421,6 @@ class InlineModelConverter(InlineModelConverterBase):
hidden_pk=True)
# Post-process form
print info, info.postprocess_form
child_form = info.postprocess_form(child_form)
# Contribute field
......
......@@ -115,17 +115,5 @@ class InlineModelConverterBase(object):
return InlineFormAdmin(p[0], **p[1])
elif isinstance(p, InlineFormAdmin):
return p
elif hasattr(p, '_sa_class_manager'):
return InlineFormAdmin(p)
else:
model = getattr(p, 'model', None)
if model is None:
raise Exception('Unknown inline model admin: %s' % repr(p))
attrs = dict()
for attr in dir(p):
if not attr.startswith('_') and attr != 'model':
attrs[attr] = getattr(p, attr)
return InlineFormAdmin(model, **attrs)
return None
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