from flaskbase.extensions import admin, db from flaskbase.admin import ModelView from auth.models import User, Role, Connection from jinja2 import Markup from flask import flash, redirect from flask_admin.babel import gettext from flask_admin.base import expose from flask_admin.helpers import (get_redirect_target, flash_errors) from flask_security import login_user class UserModelView(ModelView): column_searchable_list = ( 'email', 'current_login_ip', 'last_login_ip', ) column_list = ( 'email', 'active', 'is_superuser', 'last_login_at', 'last_login_ip', 'display_name' ) column_filters = column_list column_sortable_list = column_list column_labels = { 'is_superuser': 'SU', } column_descriptions = { 'is_superuser': 'Superuser', } inline_models = (Connection,) list_template = 'admin/user_list.html' can_impersonate = True @expose('/impersonate/', methods=('POST',)) def impersonate_view(self): """ Impersonate user view. Only POST method is allowed. """ return_url = get_redirect_target() or self.get_url('.index_view') if not self.can_impersonate: return redirect(return_url) form = self.delete_form() if self.validate_form(form): # id is Required() id = form.id.data model = self.get_one(id) if model is None: return redirect(return_url) if login_user(model): flash(gettext('You are now %s' % (model,))) return redirect('/') else: flash_errors(form, message='Failed to impersonate. %(error)s') return redirect(return_url) class ConnectionModelView(ModelView): column_list = ( 'user', 'provider_id', 'full_name', 'email', ) column_formatters = { 'full_name': lambda v, c, m, n: Markup( ' %s') % ( m.profile_url, m.image_url, m.full_name) } column_filters = column_list column_sortable_list = column_list admin.add_view(UserModelView(User, db.session)) admin.add_view(ModelView(Role, db.session)) admin.add_view(ConnectionModelView(Connection, db.session))