Source code for flask_diamond.ext.administration
# -*- coding: utf-8 -*-
# Flask-Diamond (c) Ian Dennis Miller
from flask.ext.admin import Admin
import flask.ext.security as security
from flask.ext.admin import BaseView, expose, AdminIndexView
from flask.ext.admin.contrib.sqla import ModelView
from flask.ext.admin.base import MenuLink
from flask.ext.security.utils import encrypt_password
import flask
admin = Admin()
[docs]def init_administration(self, index_view=None, app_models=None):
"""
Initialize the Administrative GUI.
:param index_view: the View that will act as the index page of the admin GUI.
:type index_view: AdminIndexView
:returns: None
The administration GUI is substantially derived from `Flask-Admin
<http://flask-admin.readthedocs.org/en/latest/>`_. When this function
is called, it will instantiate blueprints so the application serves
the admin GUI via the URL http://localhost/admin.
Typically, you will want to call this function even if you override
it. The following example illustrates using super() to invoke this
administration() function from within your own application.
>>> admin = super(MyApp, self).administration(
>>> index_view=MyApp.modelviews.RedirectView(name="Home")
>>> )
"""
admin = Admin(
name=self.app.config["PROJECT_NAME"],
base_template='admin/login_base.html',
index_view=index_view or ForceLoginView(name="Home")
)
from .. import db
if not app_models:
from ..models.user import User
from ..models.role import Role
else:
models = app_models
admin.init_app(self.app)
admin.add_view(UserView(User, db.session, category="Admin"))
admin.add_view(AdminModelView(Role, db.session, category="Admin"))
return admin
class AuthMixin(object):
"""
Require user authentication to be accessible
"""
def is_accessible(self):
"""
the View is accessible if the User is authenticated
"""
return security.current_user.is_authenticated()
class AdminMixin(object):
"""
Require admin Role to be accessible
"""
def is_accessible(self):
"""
the View is accessible if the User has the Admin Role
"""
return security.current_user.has_role("Admin")
class AuthView(AuthMixin, BaseView):
"""
A View that requires authentication
"""
pass
class AdminView(AdminMixin, BaseView):
"""
A View that requires the Admin Role
"""
pass
class AuthModelView(AuthMixin, ModelView):
"""
A ModelView that requires authentication
"""
pass
class AdminModelView(AdminMixin, ModelView):
"""
A ModelView that requires the Admin Role
"""
pass
class AuthenticatedMenuLink(AuthMixin, MenuLink):
"""
A MenuLink that requires authentication
"""
pass
class UserView(AdminModelView):
"""
Manage the User Model
"""
column_filters = ['email']
column_exclude_list = ('password', 'active', 'confirmed_at')
column_searchable_list = ('email', )
can_delete = False
create_template = 'admin/create_user.html'
def create_model(self, form):
self.model.register(
email=form.data["email"],
password=form.data["password"],
confirmed=True,
roles=["User"],
)
return flask.redirect(flask.url_for("user.index_view"))
def update_model(self, form, model):
original_password = model.password
model.update(**form.data)
if form.data["password"] != original_password:
model.password = encrypt_password(form.data["password"])
model.save()
return flask.redirect(flask.url_for("user.index_view"))
class ForceLoginView(AdminIndexView):
"""
Allocate the root URL and require authentication
"""
def is_accessible(self):
"""
the View is accessible if the User is authenticated
"""
return security.current_user.is_authenticated()
@expose('/')
def index(self):
return self.render("/admin/index.html")