Skip to content

Commit 5aae9b6

Browse files
authored
fix: performance issues on user and roles list (#2209)
* fix: performance issues on user and roles list * remove dynamic from roles * fix tests
1 parent 2830451 commit 5aae9b6

File tree

3 files changed

+24
-8
lines changed

3 files changed

+24
-8
lines changed

flask_appbuilder/security/sqla/models.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ class Role(Model):
6161
id = Column(Integer, Sequence("ab_role_id_seq"), primary_key=True)
6262
name = Column(String(64), unique=True, nullable=False)
6363
permissions = relationship(
64-
"PermissionView", secondary=assoc_permissionview_role, backref="role"
64+
"PermissionView",
65+
secondary=assoc_permissionview_role,
66+
backref="role",
6567
)
6668

6769
def __repr__(self):
@@ -73,9 +75,9 @@ class PermissionView(Model):
7375
__table_args__ = (UniqueConstraint("permission_id", "view_menu_id"),)
7476
id = Column(Integer, Sequence("ab_permission_view_id_seq"), primary_key=True)
7577
permission_id = Column(Integer, ForeignKey("ab_permission.id"))
76-
permission = relationship("Permission")
78+
permission = relationship("Permission", lazy="joined")
7779
view_menu_id = Column(Integer, ForeignKey("ab_view_menu.id"))
78-
view_menu = relationship("ViewMenu")
80+
view_menu = relationship("ViewMenu", lazy="joined")
7981

8082
def __repr__(self):
8183
return str(self.permission).replace("_", " ") + " on " + str(self.view_menu)

flask_appbuilder/security/views.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,19 @@ class UserModelView(ModelView):
224224
{"fields": ["first_name", "last_name", "email"], "expanded": True},
225225
),
226226
]
227-
228-
search_exclude_columns = ["password"]
227+
search_columns = [
228+
"first_name",
229+
"last_name",
230+
"username",
231+
"email",
232+
"active",
233+
"roles",
234+
"created_on",
235+
"changed_on",
236+
"last_login",
237+
"login_count",
238+
"fail_login_count",
239+
]
229240

230241
add_columns = ["first_name", "last_name", "username", "active", "email", "roles"]
231242
edit_columns = ["first_name", "last_name", "username", "active", "email", "roles"]

tests/test_mvc.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,11 @@ def setUp(self):
109109
class Model1View(ModelView):
110110
datamodel = SQLAInterface(Model1)
111111

112+
class Model2View(ModelView):
113+
datamodel = SQLAInterface(Model2)
114+
112115
self.appbuilder.add_view(Model1View, "Model1", category="Model1")
116+
self.appbuilder.add_view(Model2View, "Model2", category="Model2")
113117

114118
def test_list_filter_starts_with(self):
115119
"""
@@ -181,8 +185,7 @@ def test_list_filter_o_m_invalid_object_type(self):
181185
with self.app.test_client() as c:
182186
self.browser_login(c, USERNAME_ADMIN, PASSWORD_ADMIN)
183187

184-
# Roles doesn't exists
185-
rv = c.get("/users/list/?_flt_0_created_by=aaaa", follow_redirects=True)
188+
rv = c.get("/model2view/list/?_flt_0_group=aaaa", follow_redirects=True)
186189
self.assertEqual(rv.status_code, 200)
187190
if self.db.session.bind.dialect.name != "mysql":
188191
data = rv.data.decode("utf-8")
@@ -196,7 +199,7 @@ def test_list_filter_not_o_m_invalid_object_type(self):
196199
self.browser_login(c, USERNAME_ADMIN, PASSWORD_ADMIN)
197200

198201
# Roles doesn't exists
199-
rv = c.get("/users/list/?_flt_1_created_by=aaaa", follow_redirects=True)
202+
rv = c.get("/model2view/list/?_flt_1_group=aaaa", follow_redirects=True)
200203
self.assertEqual(rv.status_code, 200)
201204
if self.db.session.bind.dialect.name != "mysql":
202205
data = rv.data.decode("utf-8")

0 commit comments

Comments
 (0)