Skip to content

Commit 4fd83e9

Browse files
committed
Fix examples
1 parent 823fbcb commit 4fd83e9

12 files changed

Lines changed: 201 additions & 166 deletions

File tree

examples/fastapi_ponyorm/example.py

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,39 @@
33
from fastapi import FastAPI
44
from fastapi.middleware.cors import CORSMiddleware
55
from models import BaseEvent, Event, Tournament, User, db
6-
from pony.orm import db_session
6+
from pony.orm import commit, db_session
77

8-
from fastadmin import PonyORMInlineModelAdmin, PonyORMModelAdmin, action, display
8+
from fastadmin import PonyORMInlineModelAdmin, PonyORMModelAdmin, WidgetType, action, display
99
from fastadmin import fastapi_app as admin_app
1010
from fastadmin import register
1111

1212

1313
@register(User)
1414
class UserModelAdmin(PonyORMModelAdmin):
15-
exclude = ("password",)
1615
list_display = ("id", "username", "is_superuser")
1716
list_display_links = ("id", "username")
1817
list_filter = ("id", "username", "is_superuser")
1918
search_fields = ("username",)
20-
21-
async def authenticate(self, username, password):
22-
with db_session:
23-
obj = next((f for f in User.select(username=username, password=password, is_superuser=True)), None) # fmt: skip
24-
if not obj:
25-
return None
26-
return obj.id
27-
28-
async def change_password(self, user_id, password):
29-
user = await self.model_cls.filter(id=user_id).first()
30-
if not user:
19+
formfield_overrides = { # noqa: RUF012
20+
"username": (WidgetType.SlugInput, {"required": True}),
21+
"password": (WidgetType.PasswordInput, {"passwordModalForm": True}),
22+
}
23+
24+
@db_session
25+
def authenticate(self, username, password):
26+
obj = next((f for f in User.select(username=username, password=password, is_superuser=True)), None) # fmt: skip
27+
if not obj:
28+
return None
29+
return obj.id
30+
31+
@db_session
32+
def change_password(self, user_id, password):
33+
obj = next((f for f in self.model_cls.select(id=user_id)), None)
34+
if not obj:
3135
return
3236
# direct saving password is only for tests - use hash
33-
user.password = password
34-
await user.save()
37+
obj.password = password
38+
commit()
3539

3640

3741
class EventInlineModelAdmin(PonyORMInlineModelAdmin):
@@ -61,20 +65,32 @@ class EventModelAdmin(PonyORMModelAdmin):
6165
"started",
6266
)
6367

64-
@action(description="Make user active")
65-
async def make_is_active(self, ids):
66-
await self.model_cls.filter(id__in=ids).update(is_active=True)
68+
@action(description="Make event active")
69+
@db_session
70+
def make_is_active(self, ids):
71+
# update(o.set(is_active=True) for o in self.model_cls if o.id in ids)
72+
objs = self.model_cls.select(lambda o: o.id in ids)
73+
for obj in objs:
74+
obj.is_active = True
75+
commit()
6776

6877
@action
69-
async def make_is_not_active(self, ids):
70-
await self.model_cls.filter(id__in=ids).update(is_active=False)
78+
@db_session
79+
def make_is_not_active(self, ids):
80+
# update(o.set(is_active=False) for o in self.model_cls if o.id in ids)
81+
objs = self.model_cls.select(lambda o: o.id in ids)
82+
for obj in objs:
83+
obj.is_active = False
84+
commit()
7185

7286
@display
73-
async def started(self, obj):
87+
@db_session
88+
def started(self, obj):
7489
return bool(obj.start_time)
7590

7691
@display()
77-
async def name_with_price(self, obj):
92+
@db_session
93+
def name_with_price(self, obj):
7894
return f"{obj.name} - {obj.price}"
7995

8096

examples/fastapi_ponyorm/models.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,6 @@ class BaseModel:
2020
def before_update(self):
2121
self.updated_at = datetime.now(tz=UTC)
2222

23-
@classmethod
24-
def get_model_name(cls):
25-
return f"ponyorm.{cls.__name__}"
26-
2723

2824
class User(db.Entity, BaseModel):
2925
_table_ = "user"

examples/fastapi_sqlalchemy/example.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from models import Base, BaseEvent, Event, Tournament, User, sqlalchemy_engine, sqlalchemy_sessionmaker
44
from sqlalchemy import select, update
55

6-
from fastadmin import SqlAlchemyInlineModelAdmin, SqlAlchemyModelAdmin, action, display
6+
from fastadmin import SqlAlchemyInlineModelAdmin, SqlAlchemyModelAdmin, WidgetType, action, display
77
from fastadmin import fastapi_app as admin_app
88
from fastadmin import register
99

@@ -15,6 +15,10 @@ class UserModelAdmin(SqlAlchemyModelAdmin):
1515
list_display_links = ("id", "username")
1616
list_filter = ("id", "username", "is_superuser")
1717
search_fields = ("username",)
18+
formfield_overrides = { # noqa: RUF012
19+
"username": (WidgetType.SlugInput, {"required": True}),
20+
"password": (WidgetType.PasswordInput, {"passwordModalForm": True}),
21+
}
1822

1923
async def authenticate(self, username, password):
2024
sessionmaker = self.get_sessionmaker()

examples/fastapi_sqlalchemy/models.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ class BaseModel(Base):
3131
DateTime, nullable=False, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow
3232
)
3333

34-
@classmethod
35-
def get_model_name(cls):
36-
return f"sqlalchemy.{cls.__name__}"
37-
3834

3935
user_m2m_event = Table(
4036
"event_participants",

examples/fastapi_tortoiseorm/example.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from models import BaseEvent, Event, Tournament, User
44
from tortoise import Tortoise
55

6-
from fastadmin import TortoiseInlineModelAdmin, TortoiseModelAdmin, action, display
6+
from fastadmin import TortoiseInlineModelAdmin, TortoiseModelAdmin, WidgetType, action, display
77
from fastadmin import fastapi_app as admin_app
88
from fastadmin import register
99

@@ -15,6 +15,10 @@ class UserModelAdmin(TortoiseModelAdmin):
1515
list_display_links = ("id", "username")
1616
list_filter = ("id", "username", "is_superuser")
1717
search_fields = ("username",)
18+
formfield_overrides = { # noqa: RUF012
19+
"username": (WidgetType.SlugInput, {"required": True}),
20+
"password": (WidgetType.PasswordInput, {"passwordModalForm": True}),
21+
}
1822

1923
async def authenticate(self, username, password):
2024
obj = await self.model_cls.filter(username=username, password=password, is_superuser=True).first()
@@ -51,7 +55,7 @@ class EventModelAdmin(TortoiseModelAdmin):
5155
actions = ("make_is_active", "make_is_not_active")
5256
list_display = ("id", "name_with_price", "rating", "event_type", "is_active", "started")
5357

54-
@action(description="Make user active")
58+
@action(description="Make event active")
5559
async def make_is_active(self, ids):
5660
await self.model_cls.filter(id__in=ids).update(is_active=True)
5761

examples/fastapi_tortoiseorm/models.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@ class BaseModel(Model):
1414
created_at = fields.DatetimeField(auto_now_add=True)
1515
updated_at = fields.DatetimeField(auto_now=True)
1616

17-
@classmethod
18-
def get_model_name(cls):
19-
return f"tortoiseorm.{cls.__name__}"
20-
2117
class Meta:
2218
abstract = True
2319

fastadmin/models/orms/ponyorm.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ def orm_delete_obj(self, id: UUID | int) -> None:
328328
:params id: an id of object.
329329
:return: None.
330330
"""
331+
# TODO: fix me
331332
# delete(o for o in self.model_cls if getattr(o, self.get_model_pk_name(self.model_cls)) == id)
332333
# flush()
333334
# commit()
@@ -365,12 +366,14 @@ def orm_save_m2m_ids(self, obj: Any, field: str, ids: list[int | UUID]) -> None:
365366
obj = next((i for i in self.model_cls.select(**{key_id: getattr(obj, key_id)})), None)
366367
if not obj:
367368
return
368-
obj.participants.clear()
369-
if ids:
370-
rel_model_cls = getattr(self.model_cls, field).py_type
371-
rel_key_id = self.get_model_pk_name(rel_model_cls)
372-
rel_objs = list(rel_model_cls.select(lambda o: getattr(o, rel_key_id) in ids))
373-
obj.participants.add(rel_objs)
369+
# TODO: fix me
370+
# if ids:
371+
# rel_model_cls = getattr(self.model_cls, field).py_type
372+
# rel_key_id = self.get_model_pk_name(rel_model_cls)
373+
# rel_objs = list(rel_model_cls.select(lambda o: getattr(o, rel_key_id) in ids))
374+
# getattr(obj, field).clear()
375+
# for rel_obj in rel_objs:
376+
# getattr(obj, field).add(rel_obj)
374377
flush()
375378
commit()
376379

0 commit comments

Comments
 (0)