From d82dcd8fdba0169f482748a4ff52befb49f6b3fe Mon Sep 17 00:00:00 2001 From: XD-DENG Date: Tue, 18 Sep 2018 10:33:14 +0800 Subject: [PATCH] [AIRFLOW-3067] Display www_rbac Flask flash msg properly The Flask flash messages are not displayed properly. When we don't give a category for a flash message, defautl value will be 'message'. In some cases, we specify 'error' category. Using Flask-AppBuilder, the flash message will be given a CSS class 'alert-[category]'. But We don't have 'alert-message' or 'alert-error' in the current 'bootstrap-theme.css' file. This makes the the flash messages in www_rbac UI come with no background color. This commit addresses this issue by adding 'alert-message' (using specs of existing CSS class 'alert-info') and 'alert-error' (using specs of existing CSS class 'alert-danger') into 'bootstrap-theme.css'. --- .../www_rbac/static/css/bootstrap-theme.css | 22 +++++++++++++++++++ airflow/www_rbac/views.py | 14 ++++++------ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/airflow/www_rbac/static/css/bootstrap-theme.css b/airflow/www_rbac/static/css/bootstrap-theme.css index 734f940feed61..3adaec1d3b80d 100644 --- a/airflow/www_rbac/static/css/bootstrap-theme.css +++ b/airflow/www_rbac/static/css/bootstrap-theme.css @@ -4949,6 +4949,28 @@ a.thumbnail.active { .alert-danger .alert-link { color: #843534; } +.alert-message { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; +} +.alert-message hr { + border-top-color: #a6e1ec; +} +.alert-message .alert-link { + color: #245269; +} +.alert-error { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; +} +.alert-error hr { + border-top-color: #e4b9c0; +} +.alert-error .alert-link { + color: #843534; +} @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; diff --git a/airflow/www_rbac/views.py b/airflow/www_rbac/views.py index 3dc3400968812..0fc3d67a80ca6 100644 --- a/airflow/www_rbac/views.py +++ b/airflow/www_rbac/views.py @@ -782,11 +782,12 @@ def delete(self): try: delete_dag.delete_dag(dag_id) except DagNotFound: - flash("DAG with id {} not found. Cannot delete".format(dag_id)) + flash("DAG with id {} not found. Cannot delete".format(dag_id), 'error') return redirect(request.referrer) except DagFileExists: flash("Dag id {} is still in DagBag. " - "Remove the DAG file first.".format(dag_id)) + "Remove the DAG file first.".format(dag_id), + 'error') return redirect(request.referrer) flash("Deleting DAG with id {}. May take a couple minutes to fully" @@ -2065,7 +2066,7 @@ def varimport(self): else: d = json.loads(out) except Exception: - flash("Missing file or syntax error.") + flash("Missing file or syntax error.", 'error') else: suc_count = fail_count = 0 for k, v in d.items(): @@ -2076,7 +2077,7 @@ def varimport(self): fail_count += 1 else: suc_count += 1 - flash("{} variable(s) successfully updated.".format(suc_count), 'info') + flash("{} variable(s) successfully updated.".format(suc_count)) if fail_count: flash("{} variables(s) failed to be updated.".format(fail_count), 'error') self.update_redirect() @@ -2166,10 +2167,9 @@ def action_set_running(self, drs, session=None): dr.state = State.RUNNING models.DagStat.update(dirty_ids, session=session) session.commit() - flash( - "{count} dag runs were set to running".format(**locals())) + flash("{count} dag runs were set to running".format(**locals())) except Exception as ex: - flash(str(ex)) + flash(str(ex), 'error') flash('Failed to set state', 'error') return redirect(self.route_base + '/list')