Skip to content

Commit afc624c

Browse files
authored
fix permissions (#76)
* I tried to make generating model schema async to have possibility use async functions in defining user permissions * didn't notice that functions was async
1 parent f1310dc commit afc624c

5 files changed

Lines changed: 32 additions & 32 deletions

File tree

fastadmin/api/service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ async def get_configuration(
465465
)
466466

467467
admin_models = cast(dict[Any, ModelAdmin | InlineModelAdmin], get_admin_models())
468-
models = cast(Sequence[ModelSchema], generate_models_schema(admin_models, user_id=current_user_id))
468+
models = cast(Sequence[ModelSchema], await generate_models_schema(admin_models, user_id=current_user_id))
469469
dashboard_widgets = generate_dashboard_widgets_schema()
470470
return ConfigurationSchema(
471471
site_name=settings.ADMIN_SITE_NAME,

fastadmin/models/base.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -524,31 +524,31 @@ def default(self, obj):
524524
case _:
525525
return None
526526

527-
def has_add_permission(self, user_id: UUID | int | None = None) -> bool:
527+
async def has_add_permission(self, user_id: UUID | int | None = None) -> bool:
528528
"""This method is used to check if user has permission to add new model instance.
529529
530530
:param user_id: The user id.
531531
:return: A boolean value.
532532
"""
533533
return True
534534

535-
def has_change_permission(self, user_id: UUID | int | None = None) -> bool:
535+
async def has_change_permission(self, user_id: UUID | int | None = None) -> bool:
536536
"""This method is used to check if user has permission to change model instance.
537537
538538
:param user_id: The user id.
539539
:return: A boolean value.
540540
"""
541541
return True
542542

543-
def has_delete_permission(self, user_id: UUID | int | None = None) -> bool:
543+
async def has_delete_permission(self, user_id: UUID | int | None = None) -> bool:
544544
"""This method is used to check if user has permission to delete model instance.
545545
546546
:param user_id: The user id.
547547
:return: A boolean value.
548548
"""
549549
return True
550550

551-
def has_export_permission(self, user_id: UUID | int | None = None) -> bool:
551+
async def has_export_permission(self, user_id: UUID | int | None = None) -> bool:
552552
"""This method is used to check if user has permission to export model instance.
553553
554554
:param user_id: The user id.

fastadmin/models/helpers.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def get_admin_or_admin_inline_model(orm_model_cls: str) -> ModelAdmin | InlineMo
9898
return None
9999

100100

101-
def generate_models_schema(
101+
async def generate_models_schema(
102102
admin_models: dict[Any, ModelAdmin | InlineModelAdmin],
103103
user_id: UUID | int | None = None,
104104
inline_parent_admin_modal: ModelAdmin | None = None,
@@ -207,13 +207,13 @@ def generate_models_schema(
207207
)
208208

209209
permissions = []
210-
if admin_model_obj.has_add_permission(user_id=user_id):
210+
if await admin_model_obj.has_add_permission(user_id=user_id):
211211
permissions.append(ModelPermission.Add)
212-
if admin_model_obj.has_change_permission(user_id=user_id):
212+
if await admin_model_obj.has_change_permission(user_id=user_id):
213213
permissions.append(ModelPermission.Change)
214-
if admin_model_obj.has_delete_permission(user_id=user_id):
214+
if await admin_model_obj.has_delete_permission(user_id=user_id):
215215
permissions.append(ModelPermission.Delete)
216-
if admin_model_obj.has_export_permission(user_id=user_id):
216+
if await admin_model_obj.has_export_permission(user_id=user_id):
217217
permissions.append(ModelPermission.Export)
218218

219219
actions = []
@@ -257,7 +257,7 @@ def generate_models_schema(
257257
save_as=admin_model_obj.save_as,
258258
save_as_continue=admin_model_obj.save_as_continue,
259259
view_on_site=admin_model_obj.view_on_site,
260-
inlines=generate_models_schema(
260+
inlines=await generate_models_schema(
261261
{inline.model: inline(inline.model) for inline in admin_model_obj.inlines},
262262
inline_parent_admin_modal=admin_model_obj,
263263
user_id=user_id,

tests/api/test_configuration.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
]
1717

1818

19-
def validate_configuration_response_data(response_data, is_auth=True):
19+
async def validate_configuration_response_data(response_data, is_auth=True):
2020
assert response_data
2121
assert response_data["site_name"] == settings.ADMIN_SITE_NAME
2222
assert response_data["site_sign_in_logo"] == settings.ADMIN_SITE_SIGN_IN_LOGO
@@ -38,13 +38,13 @@ def validate_configuration_response_data(response_data, is_auth=True):
3838
assert admin_model
3939
assert model["name"] == admin_model.model_cls.get_model_name()
4040
permissions = []
41-
if admin_model.has_add_permission():
41+
if await admin_model.has_add_permission():
4242
permissions.append("Add")
43-
if admin_model.has_change_permission():
43+
if await admin_model.has_change_permission():
4444
permissions.append("Change")
45-
if admin_model.has_delete_permission():
45+
if await admin_model.has_delete_permission():
4646
permissions.append("Delete")
47-
if admin_model.has_export_permission():
47+
if await admin_model.has_export_permission():
4848
permissions.append("Export")
4949
assert set(model["permissions"]) == set(permissions)
5050
assert model["list_per_page"] == admin_model.list_per_page
@@ -103,7 +103,7 @@ async def test_configuration(session_id, event, client):
103103
)
104104
assert r.status_code == 200, r.text
105105
response_data = r.json()
106-
validate_configuration_response_data(response_data)
106+
await validate_configuration_response_data(response_data)
107107

108108

109109
async def test_configuration_405(session_id, client):
@@ -120,7 +120,7 @@ async def test_configuration_not_auth(client):
120120
)
121121
assert r.status_code == 200, r.text
122122
response_data = r.json()
123-
validate_configuration_response_data(response_data, is_auth=False)
123+
await validate_configuration_response_data(response_data, is_auth=False)
124124

125125

126126
async def test_configuration_list_display(session_id, admin_models, event, client):
@@ -134,7 +134,7 @@ async def test_configuration_list_display(session_id, admin_models, event, clien
134134
assert r.status_code == 200, r.text
135135
response_data = r.json()
136136
assert response_data
137-
validate_configuration_response_data(response_data)
137+
await validate_configuration_response_data(response_data)
138138

139139

140140
async def test_configuration_list_display_display_fields(session_id, admin_models, event, client):
@@ -148,7 +148,7 @@ async def test_configuration_list_display_display_fields(session_id, admin_model
148148
assert r.status_code == 200, r.text
149149
response_data = r.json()
150150
assert response_data
151-
validate_configuration_response_data(response_data)
151+
await validate_configuration_response_data(response_data)
152152

153153

154154
async def test_configuration_list_filter(session_id, admin_models, event, client):
@@ -163,7 +163,7 @@ async def test_configuration_list_filter(session_id, admin_models, event, client
163163
assert r.status_code == 200, r.text
164164
response_data = r.json()
165165
assert response_data
166-
validate_configuration_response_data(response_data)
166+
await validate_configuration_response_data(response_data)
167167

168168

169169
async def test_configuration_sortable_by(session_id, admin_models, event, client):
@@ -179,7 +179,7 @@ async def test_configuration_sortable_by(session_id, admin_models, event, client
179179
assert r.status_code == 200, r.text
180180
response_data = r.json()
181181
assert response_data
182-
validate_configuration_response_data(response_data)
182+
await validate_configuration_response_data(response_data)
183183

184184

185185
async def test_configuration_radio_fields(session_id, admin_models, event, client):
@@ -195,7 +195,7 @@ async def test_configuration_radio_fields(session_id, admin_models, event, clien
195195
assert r.status_code == 200, r.text
196196
response_data = r.json()
197197
assert response_data
198-
validate_configuration_response_data(response_data)
198+
await validate_configuration_response_data(response_data)
199199

200200

201201
async def test_configuration_filter_horizontal_vertical(session_id, admin_models, event, client):
@@ -211,7 +211,7 @@ async def test_configuration_filter_horizontal_vertical(session_id, admin_models
211211
assert r.status_code == 200, r.text
212212
response_data = r.json()
213213
assert response_data
214-
validate_configuration_response_data(response_data)
214+
await validate_configuration_response_data(response_data)
215215

216216
event_admin_model.filter_vertical = ["participants"]
217217
r = await client.get(
@@ -220,7 +220,7 @@ async def test_configuration_filter_horizontal_vertical(session_id, admin_models
220220
assert r.status_code == 200, r.text
221221
response_data = r.json()
222222
assert response_data
223-
validate_configuration_response_data(response_data)
223+
await validate_configuration_response_data(response_data)
224224

225225

226226
async def test_configuration_raw_id_fields(session_id, admin_models, event, client):
@@ -236,7 +236,7 @@ async def test_configuration_raw_id_fields(session_id, admin_models, event, clie
236236
assert r.status_code == 200, r.text
237237
response_data = r.json()
238238
assert response_data
239-
validate_configuration_response_data(response_data)
239+
await validate_configuration_response_data(response_data)
240240

241241

242242
async def test_configuration_fields(session_id, admin_models, event, client):
@@ -250,7 +250,7 @@ async def test_configuration_fields(session_id, admin_models, event, client):
250250
assert r.status_code == 200, r.text
251251
response_data = r.json()
252252
assert response_data
253-
validate_configuration_response_data(response_data)
253+
await validate_configuration_response_data(response_data)
254254

255255

256256
async def test_configuration_actions(session_id, admin_models, event, client):
@@ -264,7 +264,7 @@ async def test_configuration_actions(session_id, admin_models, event, client):
264264
assert r.status_code == 200, r.text
265265
response_data = r.json()
266266
assert response_data
267-
validate_configuration_response_data(response_data)
267+
await validate_configuration_response_data(response_data)
268268

269269
event_admin_model.actions = ("test_action",)
270270
r = await client.get(
@@ -273,7 +273,7 @@ async def test_configuration_actions(session_id, admin_models, event, client):
273273
assert r.status_code == 200, r.text
274274
response_data = r.json()
275275
assert response_data
276-
validate_configuration_response_data(response_data)
276+
await validate_configuration_response_data(response_data)
277277

278278

279279
async def test_configuration_fieldsets(session_id, admin_models, event, client):
@@ -303,7 +303,7 @@ async def test_configuration_fieldsets(session_id, admin_models, event, client):
303303
assert r.status_code == 200, r.text
304304
response_data = r.json()
305305
assert response_data
306-
validate_configuration_response_data(response_data)
306+
await validate_configuration_response_data(response_data)
307307

308308

309309
async def test_configuration_inlines(session_id, client):
@@ -315,4 +315,4 @@ async def test_configuration_inlines(session_id, client):
315315
assert r.status_code == 200, r.text
316316
response_data = r.json()
317317
assert response_data
318-
validate_configuration_response_data(response_data)
318+
await validate_configuration_response_data(response_data)

tests/models/test_helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def pseudo_name(self, obj: Tournament) -> str:
3636
def another_calculated_field(self, obj: Tournament) -> int:
3737
return 0
3838

39-
model_schema = generate_models_schema({Tournament: TournamentModelAdmin(Tournament)})
39+
model_schema = await generate_models_schema({Tournament: TournamentModelAdmin(Tournament)})
4040

4141
assert model_schema
4242
assert len(model_schema) == 1

0 commit comments

Comments
 (0)