def test_menu_links(): app = Flask(__name__) admin = base.Admin(app) admin.add_link(base.MenuLink('TestMenuLink1', endpoint='.index')) admin.add_link(base.MenuLink('TestMenuLink2', url='http://python.org/')) client = app.test_client() rv = client.get('/admin/') data = rv.data.decode('utf-8') ok_('TestMenuLink1' in data) ok_('TestMenuLink2' in data)
def create_app(config=None): app = Flask(__name__) app.secret_key = conf.get('webserver', 'SECRET_KEY') #app.config = config login.login_manager.init_app(app) cache = Cache(app=app, config={ 'CACHE_TYPE': 'filesystem', 'CACHE_DIR': '/tmp' }) app.register_blueprint(ck, url_prefix='/ck') app.register_blueprint(routes) app.jinja_env.add_extension("chartkick.ext.charts") with app.app_context(): from airflow.www.views import HomeView admin = Admin( app, name='Airflow', static_url_path='/admin', index_view=HomeView(endpoint='', url='/admin'), template_mode='bootstrap3', ) from airflow.www import views admin.add_view(views.Airflow(name='DAGs')) admin.add_view( views.SlaMissModelView(models.SlaMiss, Session, name="SLA Misses", category="Browse")) admin.add_view( views.TaskInstanceModelView(models.TaskInstance, Session, name="Task Instances", category="Browse")) admin.add_view( views.LogModelView(models.Log, Session, name="Logs", category="Browse")) admin.add_view( views.JobModelView(jobs.BaseJob, Session, name="Jobs", category="Browse")) admin.add_view( views.QueryView(name='Ad Hoc Query', category="Data Profiling")) admin.add_view( views.ChartModelView(models.Chart, Session, name="Charts", category="Data Profiling")) admin.add_view( views.KnowEventView(models.KnownEvent, Session, name="Known Events", category="Data Profiling")) admin.add_view( views.PoolModelView(models.Pool, Session, name="Pools", category="Admin")) admin.add_view( views.ConfigurationView(name='Configuration', category="Admin")) admin.add_view( views.UserModelView(models.User, Session, name="Users", category="Admin")) admin.add_view( views.ConnectionModelView(models.Connection, Session, name="Connections", category="Admin")) admin.add_view( views.VariableView(models.Variable, Session, name="Variables", category="Admin")) admin.add_link( base.MenuLink(category='Docs', name='Documentation', url='http://pythonhosted.org/airflow/')) admin.add_link( base.MenuLink(category='Docs', name='Github', url='https://github.com/airbnb/airflow')) admin.add_view(views.DagModelView(models.DagModel, Session, name=None)) # Hack to not add this view to the menu admin._menu = admin._menu[:-1] def integrate_plugins(): """Integrate plugins to the context""" from airflow.plugins_manager import (admin_views, flask_blueprints, menu_links) for v in admin_views: admin.add_view(v) for bp in flask_blueprints: print(bp) app.register_blueprint(bp) for ml in menu_links: admin.add_link(ml) integrate_plugins() @app.context_processor def jinja_globals(): return { 'hostname': socket.gethostname(), } @app.teardown_appcontext def shutdown_session(exception=None): settings.Session.remove() return app
Basic home view, just showing the README.md file """ @expose("/") def index(self): dags = sorted(dagbag.dags.values(), key=lambda dag: dag.dag_id) return self.render('airflow/dags.html', dags=dags) admin = Admin(app, name="Airflow", index_view=HomeView(name='DAGs'), template_mode='bootstrap3') admin.add_link( base.MenuLink(category='Tools', name='Ad Hoc Query', url='/admin/airflow/query')) class Airflow(BaseView): def is_visible(self): return False @expose('/') def index(self): return self.render('airflow/dags.html') @expose('/query') @login_required @wwwutils.gzipped def query(self):
super(UserAdminView, self).__init__(User, session, **kwargs) class RoleView(MyModelView): def is_accessible(self): return current_user.has_role('admin') def __init__(self, session, **kwargs): super(RoleView, self).__init__(Role, session, **kwargs) admin = Admin(app, 'Flask-Easy Admin', index_view=MyAdminIndexView()) admin.add_view(TasksAdminView(db.session)) admin.add_view(UserAdminView(db.session)) admin.add_view(RoleView(db.session)) admin.add_link(base.MenuLink('Web Home', endpoint="index")) admin.add_link(base.MenuLink('Logout', endpoint="log_out")) # -------------------------- END ADMIN PART --------------------------------- # --------------------------- QUICK SEO PART ---------------------------- @app.errorhandler(404) def page_not_found(e): return render_template('other/404.html'), 404 @app.errorhandler(403) def page_forbiden(e): return render_template('other/403.html'), 403