Skip to content

Commit 578af70

Browse files
committed
完成多对多,多对一的修改。
1 parent c9e7848 commit 578af70

File tree

6 files changed

+135
-182
lines changed

6 files changed

+135
-182
lines changed

fast_tmp/admin/endpoint.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
SmallInteger,
1616
delete,
1717
func,
18-
inspect,
1918
select,
2019
)
2120
from sqlalchemy.orm import MANYTOMANY, RelationshipProperty, Session
@@ -86,7 +85,7 @@ def update_data(
8685
if not user:
8786
return RedirectResponse(request.url_for("admin:login"))
8887
data = clean_data_to_model(page_model.get_clean_fields(page_model.update_fields), data)
89-
w = get_pks(page_model.model, request)
88+
w = search_pk_list(page_model.model, request)
9089
if isinstance(w, BaseRes):
9190
return w
9291
old_data = session.execute(select(page_model.model).where(*w)).scalar_one_or_none()
@@ -107,7 +106,7 @@ def update_view(
107106
if not user:
108107
return RedirectResponse(request.url_for("admin:login"))
109108

110-
pks = get_pks(page_model.model, request)
109+
pks = search_pk_list(page_model.model, request)
111110
if isinstance(pks, BaseRes):
112111
return pks
113112
data = session.execute(select(page_model.model).where(*pks)).scalar_one_or_none()
@@ -119,12 +118,6 @@ def update_view(
119118
prop = i.property
120119
if prop.direction in (MANYTOMANY,): # TODO need onetomany
121120
pk = list(get_pk(prop.entity.class_).keys())[0] # 只支持单主键
122-
# subs: str = getattr(data, i.key, "") # type: ignore
123-
# if not subs:
124-
# raise not_found_model
125-
# else:
126-
# # for sub in subs:
127-
# # pk_v=getattr(sub,pk)
128121
res[i.key] = [getattr(sub, pk) for sub in getattr(data, i.key)] # type: ignore
129122
else:
130123
res[i.key] = getattr(data, i.key) # type: ignore
@@ -160,7 +153,7 @@ def delete_one(
160153
if not user:
161154
return RedirectResponse(request.url_for("admin:login"))
162155

163-
w = get_pks(page_model.model, request)
156+
w = search_pk_list(page_model.model, request)
164157
if isinstance(w, BaseRes):
165158
return w
166159
session.execute(delete(page_model.model).where(*w))
@@ -179,7 +172,7 @@ def clean_param(field_type, param: str):
179172
return param
180173

181174

182-
def get_pks(model, request: Request):
175+
def search_pk_list(model, request: Request):
183176
"""
184177
获取要查询的单个instance的主键
185178
"""
@@ -238,15 +231,14 @@ def get_selects(
238231
perPage: int = 10,
239232
page: int = 1,
240233
):
241-
mapper = inspect(page_model.model)
242234
items = []
243235
total = 0
244-
for attr in mapper.attrs:
236+
for attr in page_model.mapper().attrs:
245237
if attr.key == field:
246238
relation_model = attr.entity.class_
247239
secondary = attr.secondary
248240
for col in secondary.foreign_key_constraints:
249-
if col.referred_table in mapper.tables:
241+
if col.referred_table in page_model.mapper().tables:
250242
params = dict(request.query_params)
251243
if len(params) > 1:
252244
raise single_pk

fast_tmp/models/__init__.py

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Any, List
22

3-
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Table, select
4-
from sqlalchemy.orm import Session, joinedload, relationship
3+
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Table
4+
from sqlalchemy.orm import relationship
55
from sqlalchemy.orm.decl_api import declarative_base
66

77
from fast_tmp.utils.password import make_password, verify_password
@@ -54,24 +54,24 @@ def verify_password(self, raw_password: str) -> bool:
5454
"""
5555
return verify_password(raw_password, self.password)
5656

57-
def has_perm(
58-
self,
59-
perm: str,
60-
session: Session,
61-
) -> bool:
62-
"""
63-
判定用户是否有权限
64-
"""
65-
if self.is_superuser:
66-
return True
67-
results = session.execute(
68-
select(Group.id)
69-
.join(Group.users.and_(User.id == self.id))
70-
.join(Group.permissions.and_(Permission.code == perm))
71-
).all()
72-
if len(results) > 0:
73-
return True
74-
return False
57+
# def has_perm(
58+
# self,
59+
# perm: str,
60+
# session: Session,
61+
# ) -> bool:
62+
# """
63+
# 判定用户是否有权限
64+
# """
65+
# if self.is_superuser:
66+
# return True
67+
# results = session.execute(
68+
# select(Group.id)
69+
# .join(Group.users.and_(User.id == self.id))
70+
# .join(Group.permissions.and_(Permission.code == perm))
71+
# ).all()
72+
# if len(results) > 0:
73+
# return True
74+
# return False
7575

7676
# todo:need test
7777
# def has_perms(self, session: Session, perms: Set[str]) -> bool:
@@ -94,37 +94,37 @@ def has_perm(
9494
# return True
9595
# return False
9696

97-
def perms(self, session: Session) -> List[str]:
98-
"""
99-
获取用户的所有权限
100-
"""
101-
groups = (
102-
session.execute(
103-
select(Group)
104-
.options(joinedload(Group.permissions))
105-
.join(Group.users)
106-
.filter(User.id == self.id)
107-
)
108-
.scalars()
109-
.all()
110-
)
111-
permissions = []
112-
for group in groups:
113-
for p in group.permissions:
114-
permissions.append(p.code)
115-
return permissions
116-
117-
def __str__(self):
118-
return self.username
97+
# def perms(self, session: Session) -> List[str]:
98+
# """
99+
# 获取用户的所有权限
100+
# """
101+
# groups = (
102+
# session.execute(
103+
# select(Group)
104+
# .options(joinedload(Group.permissions))
105+
# .join(Group.users)
106+
# .filter(User.id == self.id)
107+
# )
108+
# .scalars()
109+
# .all()
110+
# )
111+
# permissions = []
112+
# for group in groups:
113+
# for p in group.permissions:
114+
# permissions.append(p.code)
115+
# return permissions
116+
117+
# def __str__(self):
118+
# return self.username
119119

120120

121121
class Permission(Base):
122122
__tablename__ = "auth_permission"
123123
code = Column(String(128), primary_key=True)
124124
name = Column(String(128))
125125

126-
def __str__(self):
127-
return self.name + "-" + self.code
126+
# def __str__(self):
127+
# return self.name + "-" + self.code
128128

129129

130130
class Group(AbstractModel):
@@ -137,11 +137,11 @@ class Group(AbstractModel):
137137
"User", secondary="auth_group_user", back_populates="groups", cascade="all,delete"
138138
)
139139

140-
def get_perms(self, db_session: Session) -> List[str]:
141-
permissions = db_session.execute(
142-
select(group_permission).where(group_permission.c.group_id == self.id)
143-
).fetchall()
144-
return [permission[1] for permission in permissions]
140+
# def get_perms(self, db_session: Session) -> List[str]:
141+
# permissions = db_session.execute(
142+
# select(group_permission).where(group_permission.c.group_id == self.id)
143+
# ).fetchall()
144+
# return [permission[1] for permission in permissions]
145145

146146
# def get_users(self, session: Session) -> List[User]:
147147
# results = session.execute(

fast_tmp/site/__init__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,16 @@ class ModelAdmin:
4444
# 页面相关的东西
4545
__create_dialog: Any = None
4646
__get_pks: Any = None
47-
mapper = None
47+
__mapper = None
4848

49-
# page_model: Type[BaseModel]
5049
@classmethod
51-
def init(cls):
52-
cls.mapper = inspect(cls.model)
50+
def mapper(cls):
51+
if cls.__mapper is None:
52+
cls.__mapper = inspect(cls.model)
53+
return cls.__mapper
5354

5455
@classmethod
55-
def name(cls):
56+
def name(cls) -> str:
5657
if cls.__name is None:
5758
cls.__name = cls.model.__name__
5859
return cls.__name

tests/models.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from typing import List
2+
3+
from sqlalchemy import (
4+
DECIMAL,
5+
JSON,
6+
Boolean,
7+
Column,
8+
DateTime,
9+
Float,
10+
ForeignKey,
11+
Integer,
12+
String,
13+
Text,
14+
)
15+
16+
# todo Image,File
17+
from sqlalchemy.orm import relationship
18+
19+
from fast_tmp.models import Base
20+
21+
22+
class UserInfo(Base):
23+
__tablename__ = "userinfo"
24+
id = Column(Integer, primary_key=True)
25+
name = Column(String(128), unique=True)
26+
age = Column(
27+
Integer,
28+
default=10,
29+
)
30+
birthday = Column(DateTime)
31+
money = Column(DECIMAL(scale=3))
32+
height = Column(Float)
33+
info = Column(JSON)
34+
tag = Column(Text)
35+
# create_time=Column(Time,default=time.time)
36+
is_superuser = Column(Boolean(), default=True)
37+
38+
39+
class Author(Base):
40+
__tablename__ = "author"
41+
id = Column(Integer, primary_key=True)
42+
name = Column(String(32), nullable=False)
43+
books: List["Book"] = relationship("Book", back_populates="author")
44+
45+
46+
class Book(Base):
47+
__tablename__ = "book"
48+
49+
id = Column(Integer, primary_key=True)
50+
name = Column(String(128), nullable=False)
51+
author_id = Column(
52+
Integer, ForeignKey("author.id"), info={"admin_name": "name"}, nullable=False
53+
) # todo 增加提示
54+
author: Author = relationship("Author", back_populates="books")

tests/test_a.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ def test_sing_in():
3939
login_post_res = client.post("/admin/login", data={"username": "root", "password": "root"})
4040
assert login_post_res.status_code == 307
4141
assert login_post_res.headers.get("location") == "http://testserver/admin/"
42+
# sign out
43+
assert (
44+
client.get("/admin/logout").text.count(
45+
'<h2 class="card-title text-center mb-4">Login to your account</h2>'
46+
)
47+
== 1
48+
)
4249

4350

4451
def test_site():
@@ -77,6 +84,8 @@ def test_schema():
7784
def test_crud():
7885
client = TestClient(app)
7986
get_cookie(client)
87+
assert client.get("/admin/").text.count("<title>amis admin</title>")
88+
assert client.post("/admin/").text.count("<title>amis admin</title>")
8089
# create
8190
create_user = client.post(
8291
"/admin/endpoint/User/create", json={"username": "crud_user", "password": "crud_user"}
@@ -147,3 +156,14 @@ def test_not_singin():
147156
assert client.get("/admin/site").text.count("Login to your account") == 1
148157
assert client.get("/admin/").text.count("Login to your account") == 1
149158
assert client.post("/admin/").status_code == 307
159+
160+
161+
def test_local_static():
162+
client = TestClient(app)
163+
get_cookie(client)
164+
assert (
165+
client.get("/admin/").text.count(
166+
'<script src="https://unpkg.com/amis@beta/sdk/sdk.js"></script>'
167+
)
168+
== 1
169+
)

0 commit comments

Comments
 (0)