This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new b470c6bdcc Improve importing the modules in Airflow www package 
(#33810)
b470c6bdcc is described below

commit b470c6bdcc801bcd57c4008a823bd768405d1736
Author: Hussein Awala <[email protected]>
AuthorDate: Mon Aug 28 07:22:32 2023 +0200

    Improve importing the modules in Airflow www package (#33810)
---
 airflow/www/api/experimental/endpoints.py       |  7 +++++--
 airflow/www/extensions/init_appbuilder.py       | 10 +++++++---
 airflow/www/extensions/init_views.py            |  6 +++++-
 airflow/www/extensions/init_wsgi_middlewares.py |  2 +-
 airflow/www/fab_security/manager.py             | 12 ++++++++----
 airflow/www/security.py                         |  4 +++-
 airflow/www/utils.py                            |  9 +++++----
 airflow/www/views.py                            | 19 +++++++++++--------
 8 files changed, 45 insertions(+), 24 deletions(-)

diff --git a/airflow/www/api/experimental/endpoints.py 
b/airflow/www/api/experimental/endpoints.py
index ccf024543f..0b7d9a9134 100644
--- a/airflow/www/api/experimental/endpoints.py
+++ b/airflow/www/api/experimental/endpoints.py
@@ -19,9 +19,9 @@ from __future__ import annotations
 
 import logging
 from functools import wraps
-from typing import Callable, TypeVar, cast
+from typing import TYPE_CHECKING, Callable, TypeVar, cast
 
-from flask import Blueprint, Response, current_app, g, jsonify, request, 
url_for
+from flask import Blueprint, current_app, g, jsonify, request, url_for
 
 from airflow import models
 from airflow.api.common.experimental import delete_dag as delete, pool as 
pool_api, trigger_dag as trigger
@@ -37,6 +37,9 @@ from airflow.utils.docs import get_docs_url
 from airflow.utils.strings import to_boolean
 from airflow.version import version
 
+if TYPE_CHECKING:
+    from flask import Response
+
 log = logging.getLogger(__name__)
 
 T = TypeVar("T", bound=Callable)
diff --git a/airflow/www/extensions/init_appbuilder.py 
b/airflow/www/extensions/init_appbuilder.py
index bbc6343fcf..5ad9f0eabc 100644
--- a/airflow/www/extensions/init_appbuilder.py
+++ b/airflow/www/extensions/init_appbuilder.py
@@ -20,9 +20,10 @@ from __future__ import annotations
 
 import logging
 from functools import reduce
+from typing import TYPE_CHECKING
 
 from flask import Blueprint, current_app, url_for
-from flask_appbuilder import BaseView, __version__
+from flask_appbuilder import __version__
 from flask_appbuilder.babel.manager import BabelManager
 from flask_appbuilder.const import (
     LOGMSG_ERR_FAB_ADD_PERMISSION_MENU,
@@ -35,14 +36,17 @@ from flask_appbuilder.const import (
 )
 from flask_appbuilder.filters import TemplateFilters
 from flask_appbuilder.menu import Menu
-from flask_appbuilder.security.manager import BaseSecurityManager
 from flask_appbuilder.views import IndexView, UtilView
-from sqlalchemy.orm import Session
 
 from airflow import settings
 from airflow.configuration import conf
 from airflow.www.extensions.init_auth_manager import get_auth_manager
 
+if TYPE_CHECKING:
+    from flask_appbuilder import BaseView
+    from flask_appbuilder.security.manager import BaseSecurityManager
+    from sqlalchemy.orm import Session
+
 # This product contains a modified portion of 'Flask App Builder' developed by 
Daniel Vaz Gaspar.
 # (https://github.com/dpgaspar/Flask-AppBuilder).
 # Copyright 2013, Daniel Vaz Gaspar
diff --git a/airflow/www/extensions/init_views.py 
b/airflow/www/extensions/init_views.py
index 492f325bb9..16813031e3 100644
--- a/airflow/www/extensions/init_views.py
+++ b/airflow/www/extensions/init_views.py
@@ -20,11 +20,12 @@ import logging
 import warnings
 from functools import cached_property
 from os import path
+from typing import TYPE_CHECKING
 
 from connexion import FlaskApi, ProblemException, Resolver
 from connexion.decorators.validation import RequestBodyValidator
 from connexion.exceptions import BadRequestProblem
-from flask import Flask, request
+from flask import request
 
 from airflow.api_connexion.exceptions import common_error_handler
 from airflow.configuration import conf
@@ -32,6 +33,9 @@ from airflow.exceptions import RemovedInAirflow3Warning
 from airflow.security import permissions
 from airflow.utils.yaml import safe_load
 
+if TYPE_CHECKING:
+    from flask import Flask
+
 log = logging.getLogger(__name__)
 
 # airflow/www/extensions/init_views.py => airflow/
diff --git a/airflow/www/extensions/init_wsgi_middlewares.py 
b/airflow/www/extensions/init_wsgi_middlewares.py
index 37d4a074b4..27368e71ee 100644
--- a/airflow/www/extensions/init_wsgi_middlewares.py
+++ b/airflow/www/extensions/init_wsgi_middlewares.py
@@ -20,7 +20,6 @@ from __future__ import annotations
 from typing import TYPE_CHECKING, Iterable
 from urllib.parse import urlsplit
 
-from flask import Flask
 from werkzeug.middleware.dispatcher import DispatcherMiddleware
 from werkzeug.middleware.proxy_fix import ProxyFix
 
@@ -29,6 +28,7 @@ from airflow.exceptions import AirflowConfigException
 
 if TYPE_CHECKING:
     from _typeshed.wsgi import StartResponse, WSGIEnvironment
+    from flask import Flask
 
 
 def _root_app(env: WSGIEnvironment, resp: StartResponse) -> Iterable[bytes]:
diff --git a/airflow/www/fab_security/manager.py 
b/airflow/www/fab_security/manager.py
index 06ec74bbc5..0e6be93b7b 100644
--- a/airflow/www/fab_security/manager.py
+++ b/airflow/www/fab_security/manager.py
@@ -20,12 +20,11 @@ from __future__ import annotations
 
 import datetime
 import logging
-from typing import Any
+from typing import TYPE_CHECKING, Any
 from uuid import uuid4
 
 import re2
-from flask import Flask, g, session, url_for
-from flask_appbuilder import AppBuilder
+from flask import g, session, url_for
 from flask_appbuilder.const import (
     AUTH_DB,
     AUTH_LDAP,
@@ -63,10 +62,15 @@ from flask_limiter import Limiter
 from flask_limiter.util import get_remote_address
 from werkzeug.security import check_password_hash
 
-from airflow.auth.managers.fab.models import Action, Permission, RegisterUser, 
Resource, Role, User
 from airflow.configuration import conf
 from airflow.www.extensions.init_auth_manager import get_auth_manager
 
+if TYPE_CHECKING:
+    from flask import Flask
+    from flask_appbuilder import AppBuilder
+
+    from airflow.auth.managers.fab.models import Action, Permission, 
RegisterUser, Resource, Role, User
+
 # This product contains a modified portion of 'Flask App Builder' developed by 
Daniel Vaz Gaspar.
 # (https://github.com/dpgaspar/Flask-AppBuilder).
 # Copyright 2013, Daniel Vaz Gaspar
diff --git a/airflow/www/security.py b/airflow/www/security.py
index 3e61008501..a558d92b15 100644
--- a/airflow/www/security.py
+++ b/airflow/www/security.py
@@ -21,7 +21,7 @@ from typing import TYPE_CHECKING, Any, Collection, Container, 
Iterable, Sequence
 
 from flask import g
 from sqlalchemy import or_, select
-from sqlalchemy.orm import Session, joinedload
+from sqlalchemy.orm import joinedload
 
 from airflow.auth.managers.fab.models import Permission, Resource, Role, User
 from airflow.auth.managers.fab.views.permissions import (
@@ -61,6 +61,8 @@ EXISTING_ROLES = {
 }
 
 if TYPE_CHECKING:
+    from sqlalchemy.orm import Session
+
     SecurityManagerOverride: type = object
 else:
     # Fetch the security manager override from the auth manager
diff --git a/airflow/www/utils.py b/airflow/www/utils.py
index a8638d328c..5c1de3d05b 100644
--- a/airflow/www/utils.py
+++ b/airflow/www/utils.py
@@ -27,19 +27,16 @@ from flask import request, url_for
 from flask.helpers import flash
 from flask_appbuilder.forms import FieldConverter
 from flask_appbuilder.models.filters import BaseFilter
-from flask_appbuilder.models.sqla import Model, filters as fab_sqlafilters
+from flask_appbuilder.models.sqla import filters as fab_sqlafilters
 from flask_appbuilder.models.sqla.filters import get_field_setup_query, 
set_value_to_type
 from flask_appbuilder.models.sqla.interface import SQLAInterface
 from flask_babel import lazy_gettext
 from markdown_it import MarkdownIt
 from markupsafe import Markup
-from pendulum.datetime import DateTime
 from pygments import highlight, lexers
 from pygments.formatters import HtmlFormatter
-from pygments.lexer import Lexer
 from sqlalchemy import delete, func, select, types
 from sqlalchemy.ext.associationproxy import AssociationProxy
-from sqlalchemy.sql import Select
 
 from airflow.exceptions import RemovedInAirflow3Warning
 from airflow.models import errors
@@ -56,7 +53,11 @@ from airflow.www.forms import DateTimeWithTimezoneField
 from airflow.www.widgets import AirflowDateTimePickerWidget
 
 if TYPE_CHECKING:
+    from flask_appbuilder.models.sqla import Model
+    from pendulum.datetime import DateTime
+    from pygments.lexer import Lexer
     from sqlalchemy.orm.session import Session
+    from sqlalchemy.sql import Select
     from sqlalchemy.sql.operators import ColumnOperators
 
     from airflow.www.fab_security.sqla.manager import SecurityManager
diff --git a/airflow/www/views.py b/airflow/www/views.py
index 8d39a4bcfa..2e70f514f0 100644
--- a/airflow/www/views.py
+++ b/airflow/www/views.py
@@ -31,7 +31,7 @@ from bisect import insort_left
 from collections import defaultdict
 from functools import cached_property, wraps
 from json import JSONDecodeError
-from typing import Any, Callable, Collection, Iterator, Mapping, 
MutableMapping, Sequence
+from typing import TYPE_CHECKING, Any, Callable, Collection, Iterator, 
Mapping, MutableMapping, Sequence
 from urllib.parse import unquote, urljoin, urlsplit
 
 import configupdater
@@ -69,7 +69,7 @@ from pendulum.datetime import DateTime
 from pendulum.parsing.exceptions import ParserError
 from sqlalchemy import Date, and_, case, desc, func, inspect, select, union_all
 from sqlalchemy.exc import IntegrityError
-from sqlalchemy.orm import Session, joinedload
+from sqlalchemy.orm import joinedload
 from wtforms import BooleanField, validators
 
 import airflow
@@ -96,12 +96,10 @@ from airflow.jobs.job import Job
 from airflow.jobs.scheduler_job_runner import SchedulerJobRunner
 from airflow.jobs.triggerer_job_runner import TriggererJobRunner
 from airflow.models import Connection, DagModel, DagTag, Log, SlaMiss, 
TaskFail, Trigger, XCom, errors
-from airflow.models.abstractoperator import AbstractOperator
-from airflow.models.dag import DAG, get_dataset_triggered_next_run_info
+from airflow.models.dag import get_dataset_triggered_next_run_info
 from airflow.models.dagrun import RUN_ID_REGEX, DagRun, DagRunType
 from airflow.models.dataset import DagScheduleDatasetReference, 
DatasetDagRunQueue, DatasetEvent, DatasetModel
 from airflow.models.mappedoperator import MappedOperator
-from airflow.models.operator import Operator
 from airflow.models.serialized_dag import SerializedDagModel
 from airflow.models.taskinstance import TaskInstance, TaskInstanceNote
 from airflow.providers_manager import ProvidersManager
@@ -138,6 +136,13 @@ from airflow.www.forms import (
 )
 from airflow.www.widgets import AirflowModelListWidget, 
AirflowVariableShowWidget
 
+if TYPE_CHECKING:
+    from sqlalchemy.orm import Session
+
+    from airflow.models.abstractoperator import AbstractOperator
+    from airflow.models.dag import DAG
+    from airflow.models.operator import Operator
+
 PAGE_SIZE = conf.getint("webserver", "page_size")
 FILTER_TAGS_COOKIE = "tags_filter"
 FILTER_STATUS_COOKIE = "dag_status_filter"
@@ -835,9 +840,7 @@ class Airflow(AirflowBaseView):
 
             is_paused_count = dict(
                 session.execute(
-                    all_dags.with_only_columns([DagModel.is_paused, 
func.count()]).group_by(
-                        DagModel.is_paused
-                    )
+                    select(DagModel.is_paused, 
func.count(DagModel.dag_id)).group_by(DagModel.is_paused)
                 ).all()
             )
 

Reply via email to