Created
November 19, 2013 22:39
-
-
Save wilsaj/7553854 to your computer and use it in GitHub Desktop.
dispatched version of Flask-Admin sqlalchemy example app
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Flask, redirect | |
from flask.ext.sqlalchemy import SQLAlchemy | |
from werkzeug.wsgi import DispatcherMiddleware | |
from werkzeug.serving import run_simple | |
from wtforms import validators | |
from flask.ext import admin | |
from flask.ext.admin.contrib import sqla | |
from flask.ext.admin.contrib.sqla import filters | |
from flask.ext import wtf | |
# Create application | |
app = Flask(__name__) | |
# Create dummy secrey key so we can use sessions | |
app.config['SECRET_KEY'] = '123456790' | |
# Create in-memory database | |
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sample_db.sqlite' | |
app.config['SQLALCHEMY_ECHO'] = True | |
db = SQLAlchemy(app) | |
# Create models | |
class User(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
username = db.Column(db.String(80), unique=True) | |
email = db.Column(db.String(120), unique=True) | |
# Required for administrative interface | |
def __str__(self): | |
return self.username | |
# Create M2M table | |
post_tags_table = db.Table('post_tags', db.Model.metadata, | |
db.Column('post_id', db.Integer, db.ForeignKey('post.id')), | |
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')) | |
) | |
class Post(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
title = db.Column(db.String(120)) | |
text = db.Column(db.Text, nullable=False) | |
date = db.Column(db.DateTime) | |
user_id = db.Column(db.Integer(), db.ForeignKey(User.id)) | |
user = db.relationship(User, backref='posts') | |
tags = db.relationship('Tag', secondary=post_tags_table) | |
def __str__(self): | |
return self.title | |
class Tag(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
name = db.Column(db.Unicode(64)) | |
def __str__(self): | |
return self.name | |
class UserInfo(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
key = db.Column(db.String(64), nullable=False) | |
value = db.Column(db.String(64)) | |
user_id = db.Column(db.Integer(), db.ForeignKey(User.id)) | |
user = db.relationship(User, backref='info') | |
def __str__(self): | |
return '%s - %s' % (self.key, self.value) | |
class Tree(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
name = db.Column(db.String(64)) | |
parent_id = db.Column(db.Integer, db.ForeignKey('tree.id')) | |
parent = db.relationship('Tree', remote_side=[id], backref='children') | |
def __str__(self): | |
return self.name | |
# Flask views | |
@app.route('/') | |
def index(): | |
return '<a href="/dispatched/admin/">Click me to get to Admin!</a>' | |
# Customized User model admin | |
class UserAdmin(sqla.ModelView): | |
inline_models = (UserInfo,) | |
# Customized Post model admin | |
class PostAdmin(sqla.ModelView): | |
# Visible columns in the list view | |
column_exclude_list = ['text'] | |
# List of columns that can be sorted. For 'user' column, use User.username as | |
# a column. | |
column_sortable_list = ('title', ('user', User.username), 'date') | |
# Rename 'title' columns to 'Post Title' in list view | |
column_labels = dict(title='Post Title') | |
column_searchable_list = ('title', User.username) | |
column_filters = ('user', | |
'title', | |
'date', | |
filters.FilterLike(Post.title, 'Fixed Title', options=(('test1', 'Test 1'), ('test2', 'Test 2')))) | |
# Pass arguments to WTForms. In this case, change label for text field to | |
# be 'Big Text' and add required() validator. | |
form_args = dict( | |
text=dict(label='Big Text', validators=[validators.required()]) | |
) | |
form_ajax_refs = { | |
'user': { | |
'fields': (User.username, User.email) | |
}, | |
'tags': { | |
'fields': (Tag.name,) | |
} | |
} | |
def __init__(self, session): | |
# Just call parent class with predefined model. | |
super(PostAdmin, self).__init__(Post, session) | |
class TreeView(sqla.ModelView): | |
inline_models = (Tree,) | |
# Create admin | |
admin = admin.Admin(app, 'Simple Models') | |
# Add views | |
admin.add_view(UserAdmin(User, db.session)) | |
admin.add_view(sqla.ModelView(Tag, db.session)) | |
admin.add_view(PostAdmin(db.session)) | |
admin.add_view(TreeView(Tree, db.session)) | |
if __name__ == '__main__': | |
dummy_app = Flask('dummy_app') | |
dummy_app.debug = True | |
@dummy_app.route('/') | |
def redir(): | |
return redirect('/dispatched') | |
dispatched_app = DispatcherMiddleware(dummy_app, { | |
'/dispatched': app | |
}) | |
# Create DB | |
db.create_all() | |
# Start app | |
run_simple('localhost', 5000, dispatched_app) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment