Skip to content

Commit ca18a28

Browse files
authored
fix type hints: allow ModelView(Model, flask_sqlalchemy.SQLAlchemy.session) (#2908)
1 parent c8ac222 commit ca18a28

4 files changed

Lines changed: 22 additions & 23 deletions

File tree

flask_admin/_types.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,22 @@
2424
from flask_sqlalchemy import Model as T_SQLALCHEMY_LEGACY_MODEL
2525
from sqlalchemy.orm import DeclarativeBase as T_DECLARATIVE_BASE
2626

27-
from flask_admin.base import BaseView as T_VIEW
27+
from flask_admin.base import BaseView as T_VIEW # noqa: F401
2828
from flask_admin.contrib.sqla.validators import InputRequired as T_INPUT_REQUIRED
2929
from flask_admin.contrib.sqla.validators import (
3030
TimeZoneValidator as T_TIMEZONE_VALIDATOR,
3131
)
3232
from flask_admin.contrib.sqla.validators import Unique as T_UNIQUE
33-
from flask_admin.form import FormOpts as T_FORM_OPTS
33+
from flask_admin.form import FormOpts as T_FORM_OPTS # noqa: F401
3434
from flask_admin.form.rules import BaseRule as T_BASE_RULE
3535
from flask_admin.form.rules import Field as T_FLASK_ADMIN_FIELD
3636
from flask_admin.form.rules import FieldSet as T_FIELD_SET
3737
from flask_admin.form.rules import Header as T_HEADER
3838
from flask_admin.form.rules import Macro as T_MACRO
3939
from flask_admin.model import BaseModelView as T_MODEL_VIEW
40-
from flask_admin.model.ajax import AjaxModelLoader as T_AJAX_MODEL_LOADER
41-
from flask_admin.model.fields import AjaxSelectField as T_AJAX_SELECT_FIELD
42-
from flask_admin.model.form import InlineBaseFormAdmin as T_INLINE_BASE_FORM_ADMIN
40+
from flask_admin.model.ajax import AjaxModelLoader as T_AJAX_MODEL_LOADER # noqa: F401
41+
from flask_admin.model.fields import AjaxSelectField as T_AJAX_SELECT_FIELD # noqa: F401
42+
from flask_admin.model.form import InlineBaseFormAdmin as T_INLINE_BASE_FORM_ADMIN # noqa: F401
4343
from flask_admin.model.form import InlineFormAdmin as T_INLINE_FORM_ADMIN
4444
from flask_admin.model.widgets import (
4545
AjaxSelect2Widget as T_INLINE_AJAX_SELECT2_WIDGET,
@@ -77,8 +77,8 @@
7777
T_SQLALCHEMY_COLUMN = Column # type: ignore[misc]
7878

7979
T_MONGO_CLIENT = MongoClient[t.Any]
80-
from PIL.Image import Image as T_PIL_IMAGE
81-
from redis import Redis as T_REDIS
80+
from PIL.Image import Image as T_PIL_IMAGE # noqa: F401
81+
from redis import Redis as T_REDIS # noqa: F401
8282

8383
from flask_admin.contrib.peewee.ajax import (
8484
QueryAjaxModelLoader as T_PEEWEE_QUERY_AJAX_MODEL_LOADER,

flask_admin/contrib/sqla/_types.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
import typing as t
22

33
from sqlalchemy.orm import scoped_session
4-
from sqlalchemy.orm import Session
54
from sqlalchemy.orm.query import Query
65

7-
if t.TYPE_CHECKING: # sqlalchemy 2.x types are subscriptable
8-
T_SQLALCHEMY_QUERY = Query[t.Any]
9-
T_SCOPED_SESSION = scoped_session[Session]
10-
11-
else: # sqlalchemy 1.x types are not subscriptable
12-
T_SQLALCHEMY_QUERY = Query
13-
T_SCOPED_SESSION = scoped_session
14-
156
try:
167
from flask_sqlalchemy_lite import SQLAlchemy as T_SQLALCHEMY_LITE
178
except ImportError:
189
T_SQLALCHEMY_LITE: t.Any | None = None # type: ignore[no-redef]
1910

2011
try:
2112
from flask_sqlalchemy import SQLAlchemy as T_SQLALCHEMY
13+
from flask_sqlalchemy.session import Session as T_SESSION
2214
except ImportError:
2315
T_SQLALCHEMY: t.Any | None = None # type: ignore[no-redef]
2416

2517

26-
T_SESSION = Session
27-
T_SESSION_OR_DB = T_SCOPED_SESSION | T_SESSION | T_SQLALCHEMY | T_SQLALCHEMY_LITE
18+
if t.TYPE_CHECKING: # sqlalchemy 2.x types are subscriptable
19+
T_SQLALCHEMY_QUERY = Query[t.Any]
20+
T_SCOPED_SESSION = scoped_session[T_SESSION]
21+
22+
else: # sqlalchemy 1.x types are not subscriptable
23+
T_SQLALCHEMY_QUERY = Query
24+
T_SCOPED_SESSION = scoped_session
25+
26+
27+
T_SESSION_OR_DB = T_SCOPED_SESSION | T_SQLALCHEMY | T_SQLALCHEMY_LITE

flask_admin/tests/conftest.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import flask_sqlalchemy
55
import pytest
66
from flask import Flask
7-
from flask_sqlalchemy import SQLAlchemy
87
from jinja2 import StrictUndefined
98
from sqlalchemy import event
109
from sqlalchemy.engine import Engine
@@ -14,6 +13,7 @@
1413
from flask_admin import Admin
1514
from flask_admin.contrib.sqla._types import T_SCOPED_SESSION
1615
from flask_admin.contrib.sqla._types import T_SESSION_OR_DB
16+
from flask_admin.contrib.sqla._types import T_SQLALCHEMY
1717
from flask_admin.contrib.sqla._types import T_SQLALCHEMY_LITE
1818

1919
# flask-sqlalchemy-lite is compatible only with SQLAlchemy 2.x
@@ -172,7 +172,7 @@ def skip_or_return_session_or_db(
172172
def skip_or_return_session_or_db(
173173
extension: "SQLAProvider",
174174
string: t.Literal["db"],
175-
) -> SQLAlchemy: ...
175+
) -> T_SQLALCHEMY: ...
176176

177177

178178
@t.overload
@@ -194,7 +194,7 @@ def skip_or_return_session_or_db(
194194
) -> (
195195
T_SCOPED_SESSION
196196
| Session
197-
| SQLAlchemy
197+
| T_SQLALCHEMY
198198
| T_SQLALCHEMY_LITE
199199
| T_SCOPED_SESSION_FLASK_SQLA
200200
):

flask_admin/tests/mongoengine/conftest.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from mongoengine import disconnect
88

99
from flask_admin import Admin
10-
from flask_admin.contrib.sqla._types import T_SESSION_OR_DB
1110

1211

1312
@pytest.fixture
@@ -23,7 +22,7 @@ def db() -> t.Generator[None, t.Any, None]:
2322

2423
@pytest.fixture
2524
def admin(
26-
app: Flask, babel: object | None, db: T_SESSION_OR_DB
25+
app: Flask, babel: object | None, db: t.Any
2726
) -> t.Generator[Admin, t.Any, None]:
2827
admin = Admin(app)
2928
yield admin

0 commit comments

Comments
 (0)