fix(ci): fix ruff lint errors and postgres legacy migration table exclusion

This commit is contained in:
BiFangKNT
2026-09-12 15:35:47 +08:00
parent 9db6650274
commit dfde9578c1
5 changed files with 12 additions and 21 deletions
+6 -12
View File
@@ -963,18 +963,14 @@ class UserService:
return list(result.all()) return list(result.all())
async def get_passkey_by_credential_id(self, credential_id: str) -> passkey.PasskeyCredential | None: async def get_passkey_by_credential_id(self, credential_id: str) -> passkey.PasskeyCredential | None:
statement = ( statement = sqlalchemy.select(passkey.PasskeyCredential).where(
sqlalchemy.select(passkey.PasskeyCredential) passkey.PasskeyCredential.credential_id == credential_id
.where(passkey.PasskeyCredential.credential_id == credential_id)
) )
async with self._session_factory()() as session: async with self._session_factory()() as session:
return await session.scalar(statement) return await session.scalar(statement)
async def get_passkey_by_uuid(self, passkey_uuid: str) -> passkey.PasskeyCredential | None: async def get_passkey_by_uuid(self, passkey_uuid: str) -> passkey.PasskeyCredential | None:
statement = ( statement = sqlalchemy.select(passkey.PasskeyCredential).where(passkey.PasskeyCredential.uuid == passkey_uuid)
sqlalchemy.select(passkey.PasskeyCredential)
.where(passkey.PasskeyCredential.uuid == passkey_uuid)
)
async with self._session_factory()() as session: async with self._session_factory()() as session:
return await session.scalar(statement) return await session.scalar(statement)
@@ -1000,8 +996,7 @@ class UserService:
existing_passkeys = await self.get_user_passkeys(account_uuid) existing_passkeys = await self.get_user_passkeys(account_uuid)
exclude_credentials = [ exclude_credentials = [
PublicKeyCredentialDescriptor(id=base64url_to_bytes(pk.credential_id)) PublicKeyCredentialDescriptor(id=base64url_to_bytes(pk.credential_id)) for pk in existing_passkeys
for pk in existing_passkeys
] ]
options = webauthn.generate_registration_options( options = webauthn.generate_registration_options(
@@ -1051,7 +1046,7 @@ class UserService:
credential_name = (name or '').strip() credential_name = (name or '').strip()
if not credential_name: if not credential_name:
credential_name = f"Passkey ({datetime.datetime.now().strftime('%Y-%m-%d %H:%M')})" credential_name = f'Passkey ({datetime.datetime.now().strftime("%Y-%m-%d %H:%M")})'
record = passkey.PasskeyCredential( record = passkey.PasskeyCredential(
uuid=str(uuid.uuid4()), uuid=str(uuid.uuid4()),
@@ -1092,8 +1087,7 @@ class UserService:
user_passkeys = await self.get_user_passkeys(user_obj.uuid) user_passkeys = await self.get_user_passkeys(user_obj.uuid)
if user_passkeys: if user_passkeys:
allow_credentials = [ allow_credentials = [
PublicKeyCredentialDescriptor(id=base64url_to_bytes(pk.credential_id)) PublicKeyCredentialDescriptor(id=base64url_to_bytes(pk.credential_id)) for pk in user_passkeys
for pk in user_passkeys
] ]
options = webauthn.generate_authentication_options( options = webauthn.generate_authentication_options(
@@ -28,9 +28,7 @@ class PasskeyCredential(Base):
aaguid = sqlalchemy.Column(sqlalchemy.String(64), nullable=True) aaguid = sqlalchemy.Column(sqlalchemy.String(64), nullable=True)
transports = sqlalchemy.Column(sqlalchemy.String(255), nullable=True) transports = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
backed_up = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False, default=False) backed_up = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False, default=False)
created_at = sqlalchemy.Column( created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now())
sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()
)
last_used_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=True) last_used_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=True)
__table_args__ = ( __table_args__ = (
+1
View File
@@ -63,6 +63,7 @@ _ALEMBIC_TENANT_TABLES = {
'mcp_servers', 'mcp_servers',
'model_providers', 'model_providers',
'codex_credentials', 'codex_credentials',
'passkey_credentials',
'llm_models', 'llm_models',
'embedding_models', 'embedding_models',
'rerank_models', 'rerank_models',
@@ -8,14 +8,10 @@ from unittest.mock import AsyncMock, Mock
import pytest import pytest
from tests.integration.api.test_smoke import ( pytest_plugins = ['tests.integration.api.test_smoke']
fake_api_app,
mock_circular_import_chain,
quart_test_client,
)
pytestmark = [pytest.mark.integration, pytest.mark.usefixtures('mock_circular_import_chain')] pytestmark = pytest.mark.integration
class TestPasskeyPublicEndpoints: class TestPasskeyPublicEndpoints:
@@ -550,11 +550,13 @@ class TestPostgreSQLWorkspaceMigration:
) )
assert 'workspaces' not in tables_before_migration assert 'workspaces' not in tables_before_migration
assert 'codex_credentials' not in tables_before_migration assert 'codex_credentials' not in tables_before_migration
assert 'passkey_credentials' not in tables_before_migration
await manager._initialize_managed_schema() await manager._initialize_managed_schema()
async with postgres_engine.connect() as conn: async with postgres_engine.connect() as conn:
assert 'codex_credentials' in await conn.run_sync(lambda sync: sa.inspect(sync).get_table_names()) assert 'codex_credentials' in await conn.run_sync(lambda sync: sa.inspect(sync).get_table_names())
assert 'passkey_credentials' in await conn.run_sync(lambda sync: sa.inspect(sync).get_table_names())
account = (await conn.execute(text('SELECT uuid, status, source FROM users'))).mappings().one() account = (await conn.execute(text('SELECT uuid, status, source FROM users'))).mappings().one()
workspace = ( workspace = (
(await conn.execute(text('SELECT * FROM workspaces WHERE source = :source'), {'source': 'local'})) (await conn.execute(text('SELECT * FROM workspaces WHERE source = :source'), {'source': 'local'}))