Skip to content

Commit 4309266

Browse files
committed
Bump sqlalchemy crud plus version to 1.10.0
1 parent 6883ec3 commit 4309266

File tree

14 files changed

+70
-116
lines changed

14 files changed

+70
-116
lines changed

backend/app/admin/crud/crud_data_rule.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5-
from sqlalchemy import Select, and_, desc, select
5+
from sqlalchemy import Select
66
from sqlalchemy.ext.asyncio import AsyncSession
7-
from sqlalchemy.orm import noload
87
from sqlalchemy_crud_plus import CRUDPlus
98

109
from backend.app.admin.model import DataRule
@@ -31,16 +30,12 @@ async def get_list(self, name: str | None) -> Select:
3130
:param name: 规则名称
3231
:return:
3332
"""
34-
stmt = select(self.model).options(noload(self.model.scopes)).order_by(desc(self.model.created_time))
33+
filters = {}
3534

36-
filters = []
3735
if name is not None:
38-
filters.append(self.model.name.like(f'%{name}%'))
36+
filters.update(name__like=f'%{name}%')
3937

40-
if filters:
41-
stmt = stmt.where(and_(*filters))
42-
43-
return stmt
38+
return await self.select_order('id', load_strategies={'scopes': 'noload'}, **filters)
4439

4540
async def get_by_name(self, db: AsyncSession, name: str) -> DataRule | None:
4641
"""

backend/app/admin/crud/crud_data_scope.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5-
from sqlalchemy import Select, and_, desc, select
5+
from sqlalchemy import Select, select
66
from sqlalchemy.ext.asyncio import AsyncSession
7-
from sqlalchemy.orm import noload, selectinload
87
from sqlalchemy_crud_plus import CRUDPlus
98

109
from backend.app.admin.model import DataRule, DataScope
@@ -42,9 +41,7 @@ async def get_with_relation(self, db: AsyncSession, pk: int) -> DataScope:
4241
:param pk: 范围 ID
4342
:return:
4443
"""
45-
stmt = select(self.model).options(selectinload(self.model.rules)).where(self.model.id == pk)
46-
data_scope = await db.execute(stmt)
47-
return data_scope.scalars().first()
44+
return await self.select_model(db, pk, load_strategies=['rules'])
4845

4946
async def get_all(self, db: AsyncSession) -> Sequence[DataScope]:
5047
"""
@@ -63,22 +60,14 @@ async def get_list(self, name: str | None, status: int | None) -> Select:
6360
:param status: 范围状态
6461
:return:
6562
"""
66-
stmt = (
67-
select(self.model)
68-
.options(noload(self.model.rules), noload(self.model.roles))
69-
.order_by(desc(self.model.created_time))
70-
)
63+
filters = {}
7164

72-
filters = []
7365
if name is not None:
74-
filters.append(self.model.name.like(f'%{name}%'))
66+
filters.update(name__like=f'%{name}%')
7567
if status is not None:
76-
filters.append(self.model.status == status)
68+
filters.update(status=status)
7769

78-
if filters:
79-
stmt = stmt.where(and_(*filters))
80-
81-
return stmt
70+
return await self.select_order('id', load_strategies={'rules': 'noload', 'roles': 'noload'})
8271

8372
async def create(self, db: AsyncSession, obj: CreateDataScopeParam) -> None:
8473
"""

backend/app/admin/crud/crud_dept.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
from typing import Sequence
44

55
from fastapi import Request
6-
from sqlalchemy import select
76
from sqlalchemy.ext.asyncio import AsyncSession
8-
from sqlalchemy.orm import selectinload
97
from sqlalchemy_crud_plus import CRUDPlus
108

119
from backend.app.admin.model import Dept
@@ -57,6 +55,7 @@ async def get_all(
5755
:return:
5856
"""
5957
filters = {'del_flag__eq': 0}
58+
6059
if name is not None:
6160
filters.update(name__like=f'%{name}%')
6261
if leader is not None:
@@ -65,7 +64,9 @@ async def get_all(
6564
filters.update(phone__startswith=phone)
6665
if status is not None:
6766
filters.update(status=status)
68-
return await self.select_models_order(db, 'sort', None, await filter_data_permission(db, request), **filters)
67+
68+
data_filtered = await filter_data_permission(db, request)
69+
return await self.select_models_order(db, 'sort', None, data_filtered, **filters)
6970

7071
async def create(self, db: AsyncSession, obj: CreateDeptParam) -> None:
7172
"""
@@ -106,9 +107,7 @@ async def get_with_relation(self, db: AsyncSession, dept_id: int) -> Dept | None
106107
:param dept_id: 部门 ID
107108
:return:
108109
"""
109-
stmt = select(self.model).options(selectinload(self.model.users)).where(self.model.id == dept_id)
110-
result = await db.execute(stmt)
111-
return result.scalars().first()
110+
return await self.select_model(db, dept_id, load_strategies=['users'])
112111

113112
async def get_children(self, db: AsyncSession, dept_id: int) -> Sequence[Dept | None]:
114113
"""
@@ -118,9 +117,7 @@ async def get_children(self, db: AsyncSession, dept_id: int) -> Sequence[Dept |
118117
:param dept_id: 部门 ID
119118
:return:
120119
"""
121-
stmt = select(self.model).where(self.model.parent_id == dept_id, self.model.del_flag == 0)
122-
result = await db.execute(stmt)
123-
return result.scalars().all()
120+
return await self.select_models(db, parent_id=dept_id, del_flag=0)
124121

125122

126123
dept_dao: CRUDDept = CRUDDept(Dept)

backend/app/admin/crud/crud_login_log.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ async def get_list(self, username: str | None, status: int | None, ip: str | Non
2121
:return:
2222
"""
2323
filters = {}
24+
2425
if username is not None:
2526
filters.update(username__like=f'%{username}%')
2627
if status is not None:
2728
filters.update(status=status)
2829
if ip is not None:
2930
filters.update(ip__like=f'%{ip}%')
31+
3032
return await self.select_order('created_time', 'desc', **filters)
3133

3234
async def create(self, db: AsyncSession, obj: CreateLoginLogParam) -> None:

backend/app/admin/crud/crud_menu.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5-
from sqlalchemy import and_, asc, select
65
from sqlalchemy.ext.asyncio import AsyncSession
7-
from sqlalchemy.orm import selectinload
86
from sqlalchemy_crud_plus import CRUDPlus
97

108
from backend.app.admin.model import Menu
@@ -44,10 +42,12 @@ async def get_all(self, db: AsyncSession, title: str | None, status: int | None)
4442
:return:
4543
"""
4644
filters = {}
45+
4746
if title is not None:
4847
filters.update(title__like=f'%{title}%')
4948
if status is not None:
5049
filters.update(status=status)
50+
5151
return await self.select_models_order(db, 'sort', **filters)
5252

5353
async def get_sidebar(self, db: AsyncSession, superuser: bool, menu_ids: list[int | None]) -> Sequence[Menu]:
@@ -59,13 +59,12 @@ async def get_sidebar(self, db: AsyncSession, superuser: bool, menu_ids: list[in
5959
:param menu_ids: 菜单 ID 列表
6060
:return:
6161
"""
62-
stmt = select(self.model).order_by(asc(self.model.sort))
6362
filters = [self.model.type.in_([0, 1, 3, 4])]
63+
6464
if not superuser:
6565
filters.append(self.model.id.in_(menu_ids))
66-
stmt = stmt.where(and_(*filters))
67-
menu = await db.execute(stmt)
68-
return menu.scalars().all()
66+
67+
return await self.select_models_order(db, 'sort', 'asc', *filters)
6968

7069
async def create(self, db: AsyncSession, obj: CreateMenuParam) -> None:
7170
"""
@@ -106,9 +105,7 @@ async def get_children(self, db: AsyncSession, menu_id: int) -> list[Menu | None
106105
:param menu_id: 菜单 ID
107106
:return:
108107
"""
109-
stmt = select(self.model).options(selectinload(self.model.children)).where(self.model.id == menu_id)
110-
result = await db.execute(stmt)
111-
menu = result.scalars().first()
108+
menu = await self.select_model(db, menu_id, load_strategies=['children'])
112109
return menu.children
113110

114111

backend/app/admin/crud/crud_opera_log.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ async def get_list(self, username: str | None, status: int | None, ip: str | Non
2121
:return:
2222
"""
2323
filters = {}
24+
2425
if username is not None:
2526
filters.update(username__like=f'%{username}%')
2627
if status is not None:
27-
filters.update(status=status)
28+
filters.update(status__eq=status)
2829
if ip is not None:
2930
filters.update(ip__like=f'%{ip}%')
31+
3032
return await self.select_order('created_time', 'desc', **filters)
3133

3234
async def create(self, db: AsyncSession, obj: CreateOperaLogParam) -> None:

backend/app/admin/crud/crud_role.py

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5-
from sqlalchemy import Select, and_, desc, select
5+
from sqlalchemy import Select, select
66
from sqlalchemy.ext.asyncio import AsyncSession
7-
from sqlalchemy.orm import noload, selectinload
87
from sqlalchemy_crud_plus import CRUDPlus
98

109
from backend.app.admin.model import DataScope, Menu, Role
@@ -37,13 +36,7 @@ async def get_with_relation(self, db: AsyncSession, role_id: int) -> Role | None
3736
:param role_id: 角色 ID
3837
:return:
3938
"""
40-
stmt = (
41-
select(self.model)
42-
.options(selectinload(self.model.menus), selectinload(self.model.scopes))
43-
.where(self.model.id == role_id)
44-
)
45-
role = await db.execute(stmt)
46-
return role.scalars().first()
39+
return await self.select_model(db, role_id, load_strategies=['menus', 'scopes'])
4740

4841
async def get_all(self, db: AsyncSession) -> Sequence[Role]:
4942
"""
@@ -62,22 +55,17 @@ async def get_list(self, name: str | None, status: int | None) -> Select:
6255
:param status: 角色状态
6356
:return:
6457
"""
65-
stmt = (
66-
select(self.model)
67-
.options(noload(self.model.users), noload(self.model.menus), noload(self.model.scopes))
68-
.order_by(desc(self.model.created_time))
69-
)
7058

71-
filters = []
59+
filters = {}
60+
7261
if name is not None:
73-
filters.append(self.model.name.like(f'%{name}%'))
62+
filters.update(name__like=f'%{name}%')
7463
if status is not None:
75-
filters.append(self.model.status == status)
64+
filters.update(status__eq=status)
7665

77-
if filters:
78-
stmt = stmt.where(and_(*filters))
79-
80-
return stmt
66+
return await self.select_order(
67+
'id', load_strategies={'users': 'noload', 'menus': 'noload', 'scopes': 'noload'}, **filters
68+
)
8169

8270
async def get_by_name(self, db: AsyncSession, name: str) -> Role | None:
8371
"""

backend/app/admin/crud/crud_user.py

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -*- coding: utf-8 -*-
33
import bcrypt
44

5-
from sqlalchemy import and_, desc, select
5+
from sqlalchemy import select
66
from sqlalchemy.ext.asyncio import AsyncSession
77
from sqlalchemy.orm import noload, selectinload
88
from sqlalchemy.sql import Select
@@ -171,16 +171,8 @@ async def get_list(self, dept: int | None, username: str | None, phone: str | No
171171
:param status: 用户状态
172172
:return:
173173
"""
174-
stmt = (
175-
select(self.model)
176-
.options(
177-
selectinload(self.model.dept).options(noload(Dept.parent), noload(Dept.children), noload(Dept.users)),
178-
selectinload(self.model.roles).options(noload(Role.users), noload(Role.menus), noload(Role.scopes)),
179-
)
180-
.order_by(desc(self.model.join_time))
181-
)
182-
183174
filters = []
175+
184176
if dept:
185177
filters.append(self.model.dept_id == dept)
186178
if username:
@@ -190,10 +182,15 @@ async def get_list(self, dept: int | None, username: str | None, phone: str | No
190182
if status is not None:
191183
filters.append(self.model.status == status)
192184

193-
if filters:
194-
stmt = stmt.where(and_(*filters))
195-
196-
return stmt
185+
return await self.select_order(
186+
'id',
187+
'desc',
188+
*filters,
189+
load_options=[
190+
selectinload(self.model.dept).options(noload(Dept.parent), noload(Dept.children), noload(Dept.users)),
191+
selectinload(self.model.roles).options(noload(Role.users), noload(Role.menus), noload(Role.scopes)),
192+
],
193+
)
197194

198195
async def get_super(self, db: AsyncSession, user_id: int) -> bool:
199196
"""
@@ -294,22 +291,19 @@ async def get_with_relation(
294291
:param username: 用户名
295292
:return:
296293
"""
297-
stmt = select(self.model).options(
298-
selectinload(self.model.dept),
299-
selectinload(self.model.roles).options(selectinload(Role.menus), selectinload(Role.scopes)),
300-
)
301-
302294
filters = []
295+
303296
if user_id:
304297
filters.append(self.model.id == user_id)
305298
if username:
306299
filters.append(self.model.username == username)
307300

308-
if filters:
309-
stmt = stmt.where(and_(*filters))
310-
311-
user = await db.execute(stmt)
312-
return user.scalars().first()
301+
return await self.select_model_by_column(
302+
db,
303+
*filters,
304+
load_options=[selectinload(self.model.roles).options(selectinload(Role.menus), selectinload(Role.scopes))],
305+
load_strategies=['dept'],
306+
)
313307

314308

315309
user_dao: CRUDUser = CRUDUser(User)

backend/plugin/config/crud/crud_config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,12 @@ async def get_list(self, name: str | None, type: str | None) -> Select:
6464
:return:
6565
"""
6666
filters = {'type__not_in': settings.CONFIG_BUILT_IN_TYPES}
67+
6768
if name is not None:
6869
filters.update(name__like=f'%{name}%')
6970
if type is not None:
7071
filters.update(type__like=f'%{type}%')
72+
7173
return await self.select_order('created_time', 'desc', **filters)
7274

7375
async def create(self, db: AsyncSession, obj: CreateConfigParam) -> None:

0 commit comments

Comments
 (0)