Skip to content

Instantly share code, notes, and snippets.

@wilsaj
Created November 19, 2013 22:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wilsaj/7553854 to your computer and use it in GitHub Desktop.
Save wilsaj/7553854 to your computer and use it in GitHub Desktop.
dispatched version of Flask-Admin sqlalchemy example app
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