vsdudakov / fastadmin Goto Github PK
View Code? Open in Web Editor NEWFastAdmin 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
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
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]
https://docs.djangoproject.com/en/4.1/ref/contrib/admin/
@admin.display(empty_value='???')
def view_birth_date(self, obj):
return obj.birth_date
# Not supported setting
# actions
# Not supported setting
# actions_on_top
# Not supported setting
# actions_on_bottom
# Not supported setting
# actions_selection_counter
I've already opened the same issue, but the "correction" doesn't work
The account ID that is passed to token is always a string
My suggestion is to change the code https://github.com/vsdudakov/fastadmin/blob/f618ac98f8f50f5cddf835139ca626fe6c2e7/fastadmin/api/service.py#L121:
"user_id": str(user_id),
To:
"user_id": user_id,
And add this code before return:
if isinstance(user_id, UUID) :
user_id = str(user_id)
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)
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:
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,
}
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",)
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(
Could you show example to deploy fastadmin server through uvicorn, nginx, apache ?
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!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.