flask-base/auth/admin.py
2018-03-31 18:26:40 +02:00

91 lines
2.3 KiB
Python

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(
'<a href="%s" target="_blank"><img src="%s" /> %s</a>') % (
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))