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

Fixed peewee inline model views

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