Skip to content

Cannot input UUID from form #988

@mmzeynalli

Description

@mmzeynalli

Checklist

  • The bug is reproducible against the latest release or master.
  • There are no similar issues or pull requests to fix it yet.

Describe the bug

So, I tried to manually add user from dashboard manually inputting UUID, and it throws sqlalchemy exception.

Steps to reproduce the bug

from sqlalchemy import Column, Boolean, Integer, String, create_engine
from sqlalchemy.orm import (
    declarative_base,
    relationship,
    sessionmaker,
    Mapped,
    mapped_column,
)
from uuid import UUID as PyUUID
from sqlalchemy.dialects.postgresql import UUID


Base = declarative_base()
engine = create_engine(
    "sqlite:///example.db",
    connect_args={"check_same_thread": False},
)
SessionLocal = sessionmaker(bind=engine)


class User(Base):
    __tablename__ = "users"

    uuid: Mapped[PyUUID] = mapped_column(UUID, primary_key=True)
    name: Mapped[str]

    def __str__(self) -> str:
        return f"User {self.uuid}"


Base.metadata.create_all(engine)  # Create tables

from fastapi import Request
from sqladmin import ModelView

class UserAdmin(ModelView, model=User):
    column_list = User.__table__.columns.keys()
    form_include_pk = True

from fastapi import FastAPI
from sqladmin import Admin

app = FastAPI()
admin = Admin(app=app, session_maker=SessionLocal)

admin.add_view(UserAdmin)

Add User from admin panel and it fails.

Expected behavior

Successful creation

Actual behavior

Exception:

Debugging material

(builtins.AttributeError) 'str' object has no attribute 'hex'
[SQL: INSERT INTO users (uuid, name) VALUES (?, ?)]
[parameters: [{'uuid': '00000000-0000-0000-0000-000000000001', 'name': 'John'}]]
Traceback (most recent call last):
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1815, in _execute_context
    context = constructor(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 1494, in _init_compiled
    l_param: List[Any] = [
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 1496, in <listcomp>
    flattened_processors[key](compiled_params[key])
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/sql/sqltypes.py", line 3734, in process
    value = value.hex
AttributeError: 'str' object has no attribute 'hex'

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

Traceback (most recent call last):
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqladmin/application.py", line 554, in create
    obj = await model_view.insert_model(request, form_data_dict)
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqladmin/models.py", line 1088, in insert_model
    return await Query(self).insert(data, request)
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqladmin/_queries.py", line 234, in insert
    return await coro
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/anyio/to_thread.py", line 63, in run_sync
    return await get_async_backend().run_sync_in_worker_thread(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 2502, in run_sync_in_worker_thread
    return await future
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 986, in run
    result = context.run(func, *args)
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqladmin/_queries.py", line 203, in _insert_sync
    session.commit()
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 2030, in commit
    trans.commit(_to_root=True)
  File "<string>", line 2, in commit
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
    ret_value = fn(self, *arg, **kw)
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1311, in commit
    self._prepare_impl()
  File "<string>", line 2, in _prepare_impl
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
    ret_value = fn(self, *arg, **kw)
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1286, in _prepare_impl
    self.session.flush()
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4331, in flush
    self._flush(objects)
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4466, in _flush
    with util.safe_reraise():
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 224, in __exit__
    raise exc_value.with_traceback(exc_tb)
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4427, in _flush
    flush_context.execute()
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 466, in execute
    rec.execute(self)
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 642, in execute
    util.preloaded.orm_persistence.save_obj(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 93, in save_obj
    _emit_insert_statements(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 1048, in _emit_insert_statements
    result = connection.execute(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1419, in execute
    return meth(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/sql/elements.py", line 527, in _execute_on_connection
    return connection._execute_clauseelement(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1641, in _execute_clauseelement
    ret = self._execute_context(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1821, in _execute_context
    self._handle_dbapi_exception(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2363, in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1815, in _execute_context
    context = constructor(
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 1494, in _init_compiled
    l_param: List[Any] = [
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 1496, in <listcomp>
    flattened_processors[key](compiled_params[key])
  File "/home/mzeynall/Projects/sqladmin-test/.venv/lib/python3.10/site-packages/sqlalchemy/sql/sqltypes.py", line 3734, in process
    value = value.hex
sqlalchemy.exc.StatementError: (builtins.AttributeError) 'str' object has no attribute 'hex'
[SQL: INSERT INTO users (uuid, name) VALUES (?, ?)]
[parameters: [{'uuid': '00000000-0000-0000-0000-000000000001', 'name': 'John'}]]

Environment

OS: Linux
Python: 3.10
SQLAdmin: 0.22.0

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions