diff --git a/reflex/admin.py b/reflex/admin.py index 187cf6460..44193daab 100644 --- a/reflex/admin.py +++ b/reflex/admin.py @@ -10,4 +10,5 @@ class AdminDash: """Data used to build the admin dashboard.""" models: list = field(default_factory=list) + view_overrides: dict = field(default_factory=dict) admin: Optional[Admin] = None diff --git a/reflex/app.py b/reflex/app.py index 266387260..74ed31fe5 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -428,8 +428,11 @@ class App(Base): logo_url="https://pynecone.io/logo.png", ) ) + for model in config.admin_dash.models: - admin.add_view(ModelView(model)) + view = config.admin_dash.view_overrides.get(model, ModelView) + admin.add_view(view(model)) + admin.mount_to(self.api) def compile(self): diff --git a/tests/test_app.py b/tests/test_app.py index 6fa123da2..1586a2ed7 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -13,6 +13,7 @@ import sqlmodel from fastapi import UploadFile from starlette_admin.auth import AuthProvider from starlette_admin.contrib.sqla.admin import Admin +from starlette_admin.contrib.sqla.view import ModelView from reflex import AdminDash, constants from reflex.app import App, DefaultState, process, upload @@ -266,6 +267,26 @@ def test_initialize_with_custom_admin_dashboard( assert app.admin_dash.admin.auth_provider == test_custom_auth_admin +def test_initialize_admin_dashboard_with_view_overrides(test_model): + """Test setting the admin dashboard of an app with view class overriden. + + Args: + test_model: The default model. + """ + + class TestModelView(ModelView): + pass + + app = App( + admin_dash=AdminDash( + models=[test_model], view_overrides={test_model: TestModelView} + ) + ) + assert app.admin_dash is not None + assert app.admin_dash.models == [test_model] + assert app.admin_dash.view_overrides[test_model] == TestModelView + + def test_initialize_with_state(test_state): """Test setting the state of an app.