Git Product home page Git Product logo

vsdudakov / fastadmin Goto Github PK

View Code? Open in Web Editor NEW
79.0 2.0 9.0 18.8 MB

FastAdmin is an easy-to-use Admin Dashboard App for FastAPI/Flask/Django inspired by Django Admin.

Home Page: https://vsdudakov.github.io/fastadmin/

License: MIT License

Makefile 0.77% Python 67.73% HTML 0.31% TypeScript 30.33% CSS 0.71% JavaScript 0.16%
fastapi fastadmin admin dashboard ponyorm sqlalchemy-orm tortoise-orm fastapi-admin django flask

fastadmin's People

Contributors

bswck avatar vsdudakov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

fastadmin's Issues

Failed to run FastAPI Framework without flask installed

Blessed to see this excellent and fast updated framework.

code:

from fastapi import FastAPI
from fastadmin import fastapi_app as admin_app

app = FastAPI()

app.mount("/admin", admin_app)

console:

└─$ uvicorn main:app --reload                      
INFO:     Will watch for changes in these directories: ['/home/s1nh/project/fastadmin']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [902379] using WatchFiles
Process SpawnProcess-1:
Traceback (most recent call last):
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/multiprocessing/process.py", line 314, in _bootstrap
    self.run()
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started
    target(sockets=sockets)
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/site-packages/uvicorn/server.py", line 59, in run
    return asyncio.run(self.serve(sockets=sockets))
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "uvloop/loop.pyx", line 1517, in uvloop.loop.Loop.run_until_complete
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/site-packages/uvicorn/server.py", line 66, in serve
    config.load()
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/site-packages/uvicorn/config.py", line 471, in load
    self.loaded_app = import_from_string(self.app)
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/site-packages/uvicorn/importer.py", line 24, in import_from_string
    raise exc from None
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/site-packages/uvicorn/importer.py", line 21, in import_from_string
    module = importlib.import_module(module_str)
  File "/home/s1nh/conda/miniconda3/envs/envp310/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/s1nh/project/znss-admin/fastadmin/main.py", line 2, in <module>
    from fastadmin import fastapi_app as admin_app
  File "/home/s1nh/project/znss-admin/fastadmin/fastadmin/__init__.py", line 3, in <module>
    from fastadmin.api.frameworks.flask.app import app as flask_app
  File "/home/s1nh/project/znss-admin/fastadmin/fastadmin/api/frameworks/flask/app.py", line 4, in <module>
    from flask import Blueprint
ModuleNotFoundError: No module named 'flask'
^CINFO:     Stopping reloader process [902379]

Implement actions interface

# Not supported setting
# actions

# Not supported setting
# actions_on_top

# Not supported setting
# actions_on_bottom

# Not supported setting
# actions_selection_counter

bash: export: `=': not a valid identifier

$ export ADMIN_USER_MODEL = User
bash: export: `=': not a valid identifier

fastadmin/README.md

Lines 42 to 46 in 2f6ab30

```bash
export ADMIN_USER_MODEL = User
export ADMIN_USER_MODEL_USERNAME_FIELD = username
export ADMIN_SECRET_KEY = secret_key
```

and

fastadmin/docs/index.html

Lines 263 to 267 in 2f6ab30

<code class="language-bash">
export ADMIN_USER_MODEL = User
export ADMIN_USER_MODEL_USERNAME_FIELD = username
export ADMIN_SECRET_KEY = secret_key
</code>

should be

export ADMIN_USER_MODEL=User
export ADMIN_USER_MODEL_USERNAME_FIELD=username
export ADMIN_SECRET_KEY=secret_key

Admin panel crashes when signing in.

Admin user identifier is always string.

Traceback (most recent call last):
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\engine\base.py", line 1964, in _exec_single_context
    self.dialect.do_execute(
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\engine\default.py", line 748, in do_execute
    cursor.execute(statement, parameters)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\dialects\postgresql\asyncpg.py", line 515, in execute
    self._adapt_connection.await_(
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 102, in await_only
    return current.driver.switch(awaitable)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 160, in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\dialects\postgresql\asyncpg.py", line 494, in _prepare_and_execute
    self._handle_exception(error)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\dialects\postgresql\asyncpg.py", line 444, in _handle_exception
    self._adapt_connection._handle_exception(error)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\dialects\postgresql\asyncpg.py", line 717, in _handle_exception
    raise translated_error from error
sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_dbapi.Error: <class 'asyncpg.exceptions.DataError'>: invalid input for query argument $1: '3' ('str' object cannot be interpreted as an integer)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 429, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 78, in __call__
    return await self.app(scope, receive, send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastapi\applications.py", line 276, in __call__
    await super().__call__(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\applications.py", line 122, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\errors.py", line 184, in __call__
    raise exc
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\ratelimit\core.py", line 88, in __call__
    return await self.app(scope, receive, send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\base.py", line 109, in __call__
    await response(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\responses.py", line 270, in __call__
    async with anyio.create_task_group() as task_group:
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\anyio\_backends\_asyncio.py", line 662, in __aexit__
    raise exceptions[0]
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\responses.py", line 273, in wrap
    await func()
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\base.py", line 134, in stream_response
    return await super().stream_response(send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\responses.py", line 262, in stream_response
    async for chunk in self.body_iterator:
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\base.py", line 98, in body_stream
    raise app_exc
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\base.py", line 70, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\base.py", line 109, in __call__
    await response(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\responses.py", line 270, in __call__
    async with anyio.create_task_group() as task_group:
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\anyio\_backends\_asyncio.py", line 662, in __aexit__
    raise exceptions[0]
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\responses.py", line 273, in wrap
    await func()
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\base.py", line 134, in stream_response
    return await super().stream_response(send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\responses.py", line 262, in stream_response
    async for chunk in self.body_iterator:
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\base.py", line 98, in body_stream
    raise app_exc
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\base.py", line 70, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\exceptions.py", line 79, in __call__
    raise exc
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\exceptions.py", line 68, in __call__
    await self.app(scope, receive, sender)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 21, in __call__
    raise e
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\routing.py", line 718, in __call__
    await route.handle(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\routing.py", line 443, in handle
    await self.app(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastapi\applications.py", line 276, in __call__
    await super().__call__(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\applications.py", line 122, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\errors.py", line 184, in __call__
    raise exc
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\exceptions.py", line 79, in __call__
    raise exc
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\middleware\exceptions.py", line 68, in __call__
    await self.app(scope, receive, sender)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 21, in __call__
    raise e
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\routing.py", line 718, in __call__
    await route.handle(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\starlette\routing.py", line 66, in app
    response = await func(request)
               ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastapi\routing.py", line 237, in app
    raw_response = await run_endpoint_function(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastapi\routing.py", line 163, in run_endpoint_function
    return await dependant.call(**values)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastadmin\api\frameworks\fastapi\api.py", line 329, in configuration
    return await api_service.get_configuration(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastadmin\api\service.py", line 414, in get_configuration
    current_user_id = await get_user_id_from_session_id(session_id)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastadmin\api\service.py", line 62, in get_user_id_from_session_id
    if not user_id or not await admin_model.get_obj(user_id):
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastadmin\models\base.py", line 415, in get_obj
    obj = await self.orm_get_obj(id)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\fastadmin\models\orms\sqlalchemy.py", line 314, in orm_get_obj
    return await session.get(self.model_cls, id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 462, in get
    result_obj = await greenlet_spawn(
                 ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 165, in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\orm\session.py", line 3540, in get
    return self._get_impl(
           ^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\orm\session.py", line 3672, in _get_impl
    return db_load_fn(
           ^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\orm\loading.py", line 668, in load_on_pk_identity
    session.execute(
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\orm\session.py", line 2229, in execute
    return self._execute_internal(
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\orm\session.py", line 2124, in _execute_internal
    result: Result[Any] = compile_state_cls.orm_execute_statement(
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\orm\context.py", line 253, in orm_execute_statement
    result = conn.execute(
             ^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\engine\base.py", line 1414, in execute
    return meth(
           ^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\sql\elements.py", line 486, in _execute_on_connection
    return connection._execute_clauseelement(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\engine\base.py", line 1638, in _execute_clauseelement
    ret = self._execute_context(
          ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\engine\base.py", line 1842, in _execute_context
    return self._exec_single_context(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\engine\base.py", line 1983, in _exec_single_context
    self._handle_dbapi_exception(
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\engine\base.py", line 2326, in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\engine\base.py", line 1964, in _exec_single_context
    self.dialect.do_execute(
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\engine\default.py", line 748, in do_execute
    cursor.execute(statement, parameters)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\dialects\postgresql\asyncpg.py", line 515, in execute
    self._adapt_connection.await_(
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 102, in await_only
    return current.driver.switch(awaitable)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 160, in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\dialects\postgresql\asyncpg.py", line 494, in _prepare_and_execute
    self._handle_exception(error)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\dialects\postgresql\asyncpg.py", line 444, in _handle_exception
    self._adapt_connection._handle_exception(error)
  File "C:\Users\Владислав\PycharmProjects\mitsu_api\virtualenv\Lib\site-packages\sqlalchemy\dialects\postgresql\asyncpg.py", line 717, in _handle_exception
    raise translated_error from error
sqlalchemy.exc.DBAPIError: (sqlalchemy.dialects.postgresql.asyncpg.Error) <class 'asyncpg.exceptions.DataError'>: invalid input for query argument $1: '3' ('str' object cannot be interpreted as an integer)
[SQL: SELECT accounts.id AS accounts_id, accounts.nickname AS accounts_nickname, accounts.authentication_name AS accounts_authentication_name, accounts.password_hash AS accounts_password_hash, accounts.tag AS accounts_tag, accounts.role AS accounts_role, accounts.avatar_url AS accounts_avatar_url 
FROM accounts 
WHERE accounts.id = $1::BIGINT]
[parameters: ('3',)]
(Background on this error at: https://sqlalche.me/e/20/dbapi)

DashboardWidget no HTML rendering

Why when I add UsersDashboardWidgetAdmin, I get no errors, but when I try to access the admin panel, I get no HTML rendering and two errors in the console:

image

from datetime import datetime, timedelta, timezone

from sqlalchemy import func, select
from fastadmin import DashboardWidgetAdmin, DashboardWidgetType, WidgetType, register_widget

from src.database import async_session_maker
from src.auth.models import User


@register_widget
class UsersDashboardWidgetAdmin(DashboardWidgetAdmin):
    title = 'Users'

    dashboard_widget_type = DashboardWidgetType.ChartLine
    x_field = 'date'
    y_field = 'count'
    x_field_filter_widget_type = WidgetType.DatePicker
    x_field_filter_widget_props = {'picker': 'month'}
    x_field_periods = ['day', 'week', 'month', 'year']

    async def get_data(
            self,
            min_x_field: str | None = None,
            max_x_field: str | None = None,
            period_x_field: str | None = None,
    ) -> dict:
        if not min_x_field:
            min_x_field_date = datetime.now(timezone.utc) - timedelta(days=360)
        else:
            min_x_field_date = datetime.fromisoformat(min_x_field.replace('Z', '+00:00'))
        if not max_x_field:
            max_x_field_date = datetime.now(timezone.utc) + timedelta(days=1)
        else:
            max_x_field_date = datetime.fromisoformat(max_x_field.replace('Z', '+00:00'))

        if not period_x_field or period_x_field not in self.x_field_periods:
            period_x_field = 'month'

        stmt = (
            select(
                func.to_char(func.date_trunc(period_x_field, User.created_at), 'DD/MM/YYYY').label('date'),
                func.count(User.id).label('count')
            )
            .where(
                User.created_at >= min_x_field_date,
                User.created_at <= max_x_field_date)
            .group_by('date')
            .order_by('date')
        )
        async with async_session_maker() as session:
            results = await session.execute(stmt)

        return {
            'results': [result._mapping for result in results.all()],
            'min_x_field': min_x_field_date.isoformat().replace('+00:00', 'Z'),
            'max_x_field': max_x_field_date.isoformat().replace('+00:00', 'Z'),
            'period_x_field': period_x_field,
        }

CRUD is not working

I gotta problem with crud of a model. Help please. I cant even create user (

class Book(BaseTable):
    __tablename__ = "books"

    title: Mapped[str]
    description: Mapped[str] = mapped_column(Text) 
    
  

@register(Book, sqlalchemy_sessionmaker=session_maker)
class BookAdmin(SqlAlchemyModelAdmin):
    list_display = ("id", "title")
    list_display_links = ("id", "title")
    list_filter = ("id", "title")
    search_fields = ("title",)
Details

2023-11-16 19:50:58,448 INFO sqlalchemy.engine.Engine BEGIN (implicit)
INFO:sqlalchemy.engine.Engine:BEGIN (implicit)
2023-11-16 19:50:58,449 INFO sqlalchemy.engine.Engine SELECT "user".username AS user_username, "user".hash_password AS user_hash_password, "user".is_superuser AS user_is_superuser, "user".is_active AS user_is_active, "user".id AS user_id, "user".created_at AS user_created_at, "user".updated_at AS user_updated_at
FROM "user"
WHERE "user".id = $1::INTEGER
INFO:sqlalchemy.engine.Engine:SELECT "user".username AS user_username, "user".hash_password AS user_hash_password, "user".is_superuser AS user_is_superuser, "user".is_active AS user_is_active, "user".id AS user_id, "user".created_at AS user_created_at, "user".updated_at AS user_updated_at
FROM "user"
WHERE "user".id = $1::INTEGER
2023-11-16 19:50:58,450 INFO sqlalchemy.engine.Engine [cached since 0.02185s ago] (1,)
INFO:sqlalchemy.engine.Engine:[cached since 0.02185s ago] (1,)
2023-11-16 19:50:58,451 INFO sqlalchemy.engine.Engine ROLLBACK
INFO:sqlalchemy.engine.Engine:ROLLBACK
c:\Users\naimo\OneDrive\Рабочий стол\fast-admin.venv\Lib\site-packages\pydantic\type_adapter.py:314: UserWarning: Pydantic serializer warnings:
Expected list[str] but got tuple - serialized value may not be as expected
Expected list[tuple[nullable, dict[str, json-or-python[json=list[str], python=list[str]]]]] but got tuple - serialized value may not be as expected
Expected list[str] but got tuple - serialized value may not be as expected
Expected list[tuple[nullable, dict[str, json-or-python[json=list[str], python=list[str]]]]] but got tuple - serialized value may not be as expected
return self.serializer.to_python(

Deploy project

Could you show example to deploy fastadmin server through uvicorn, nginx, apache ?

How to get obj asynchronously in "has_xxx_permission" synchronous method

I can only get objects through asynchronous methods, but this method is a synchronous method. I have no idea how to use this function.

I tried writing the code like this but it doesn't get the result correctly.

async def get_add_permission(self, user_id: UUID | int | None = None) -> bool:
    sessionmaker = self.get_sessionmaker()
    async with sessionmaker() as session:
        user: models.BaseUser = (
            await session.scalars(async_select(models.BaseUser).where(models.BaseUser.id == user_id))).first()
    return user.is_superuser

def has_add_permission(self, user_id: UUID | int | None = None) -> bool:
    loop = asyncio.get_running_loop()
    future = asyncio.run_coroutine_threadsafe(self.get_add_permission(user_id), loop)
    result = future.result()
    return result

Can someone tell me how to solve this problem, thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.