style: format backend with ruff

This commit is contained in:
CREDO23 2026-01-07 15:27:54 +02:00
parent b664547178
commit 9841bdda72
14 changed files with 46 additions and 32 deletions

View file

@ -7,6 +7,7 @@ Create Date: 2026-01-06 12:00:00.000000
""" """
from collections.abc import Sequence from collections.abc import Sequence
from alembic import op from alembic import op
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
@ -17,6 +18,7 @@ depends_on: str | Sequence[str] | None = None
from sqlalchemy import text from sqlalchemy import text
def upgrade() -> None: def upgrade() -> None:
connection = op.get_bind() connection = op.get_bind()
constraint_exists = connection.execute( constraint_exists = connection.execute(
@ -31,9 +33,10 @@ def upgrade() -> None:
op.drop_constraint( op.drop_constraint(
"uq_searchspace_user_connector_type", "uq_searchspace_user_connector_type",
"search_source_connectors", "search_source_connectors",
type_="unique" type_="unique",
) )
def downgrade() -> None: def downgrade() -> None:
connection = op.get_bind() connection = op.get_bind()
constraint_exists = connection.execute( constraint_exists = connection.execute(
@ -48,6 +51,5 @@ def downgrade() -> None:
op.create_unique_constraint( op.create_unique_constraint(
"uq_searchspace_user_connector_type", "uq_searchspace_user_connector_type",
"search_source_connectors", "search_source_connectors",
["search_space_id", "user_id", "connector_type"] ["search_space_id", "user_id", "connector_type"],
) )

View file

@ -8,6 +8,7 @@ Create Date: 2026-01-06 14:00:00.000000
""" """
from collections.abc import Sequence from collections.abc import Sequence
from alembic import op from alembic import op
revision: str = "58" revision: str = "58"
@ -17,6 +18,7 @@ depends_on: str | Sequence[str] | None = None
from sqlalchemy import text from sqlalchemy import text
def upgrade() -> None: def upgrade() -> None:
connection = op.get_bind() connection = op.get_bind()
constraint_exists = connection.execute( constraint_exists = connection.execute(
@ -31,9 +33,10 @@ def upgrade() -> None:
op.create_unique_constraint( op.create_unique_constraint(
"uq_searchspace_user_connector_name", "uq_searchspace_user_connector_name",
"search_source_connectors", "search_source_connectors",
["search_space_id", "user_id", "name"] ["search_space_id", "user_id", "name"],
) )
def downgrade() -> None: def downgrade() -> None:
connection = op.get_bind() connection = op.get_bind()
constraint_exists = connection.execute( constraint_exists = connection.execute(
@ -48,6 +51,5 @@ def downgrade() -> None:
op.drop_constraint( op.drop_constraint(
"uq_searchspace_user_connector_name", "uq_searchspace_user_connector_name",
"search_source_connectors", "search_source_connectors",
type_="unique" type_="unique",
) )

View file

@ -414,7 +414,9 @@ async def fetch_airtable_user_email(access_token: str) -> str | None:
logger.debug(f"Fetched Airtable user email: {email}") logger.debug(f"Fetched Airtable user email: {email}")
return email return email
logger.warning(f"Failed to fetch Airtable user info: {response.status_code}") logger.warning(
f"Failed to fetch Airtable user info: {response.status_code}"
)
return None return None
except Exception as e: except Exception as e:

View file

@ -11,19 +11,21 @@ from fastapi.responses import RedirectResponse
from pydantic import ValidationError from pydantic import ValidationError
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.config import config from app.config import config
from app.connectors.airtable_connector import fetch_airtable_user_email
from app.db import ( from app.db import (
SearchSourceConnector, SearchSourceConnector,
SearchSourceConnectorType, SearchSourceConnectorType,
User, User,
get_async_session, get_async_session,
) )
from app.connectors.airtable_connector import fetch_airtable_user_email
from app.schemas.airtable_auth_credentials import AirtableAuthCredentialsBase from app.schemas.airtable_auth_credentials import AirtableAuthCredentialsBase
from app.users import current_active_user from app.users import current_active_user
from app.utils.connector_naming import check_duplicate_connector, generate_unique_connector_name from app.utils.connector_naming import (
check_duplicate_connector,
generate_unique_connector_name,
)
from app.utils.oauth_security import OAuthStateManager, TokenEncryption from app.utils.oauth_security import OAuthStateManager, TokenEncryption
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -279,7 +281,6 @@ async def airtable_callback(
user_email = await fetch_airtable_user_email(access_token) user_email = await fetch_airtable_user_email(access_token)
# Calculate expiration time (UTC, tz-aware) # Calculate expiration time (UTC, tz-aware)
expires_at = None expires_at = None
if token_json.get("expires_in"): if token_json.get("expires_in"):

View file

@ -14,7 +14,6 @@ from fastapi.responses import RedirectResponse
from pydantic import ValidationError from pydantic import ValidationError
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.config import config from app.config import config
from app.db import ( from app.db import (
@ -25,12 +24,12 @@ from app.db import (
) )
from app.schemas.atlassian_auth_credentials import AtlassianAuthCredentialsBase from app.schemas.atlassian_auth_credentials import AtlassianAuthCredentialsBase
from app.users import current_active_user from app.users import current_active_user
from app.utils.oauth_security import OAuthStateManager, TokenEncryption
from app.utils.connector_naming import ( from app.utils.connector_naming import (
check_duplicate_connector, check_duplicate_connector,
extract_identifier_from_credentials, extract_identifier_from_credentials,
generate_unique_connector_name, generate_unique_connector_name,
) )
from app.utils.oauth_security import OAuthStateManager, TokenEncryption
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -14,7 +14,6 @@ from fastapi.responses import RedirectResponse
from pydantic import ValidationError from pydantic import ValidationError
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.config import config from app.config import config
from app.db import ( from app.db import (
@ -25,12 +24,12 @@ from app.db import (
) )
from app.schemas.discord_auth_credentials import DiscordAuthCredentialsBase from app.schemas.discord_auth_credentials import DiscordAuthCredentialsBase
from app.users import current_active_user from app.users import current_active_user
from app.utils.oauth_security import OAuthStateManager, TokenEncryption
from app.utils.connector_naming import ( from app.utils.connector_naming import (
check_duplicate_connector, check_duplicate_connector,
extract_identifier_from_credentials, extract_identifier_from_credentials,
generate_unique_connector_name, generate_unique_connector_name,
) )
from app.utils.oauth_security import OAuthStateManager, TokenEncryption
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -12,7 +12,6 @@ from google_auth_oauthlib.flow import Flow
from pydantic import ValidationError from pydantic import ValidationError
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.config import config from app.config import config
from app.connectors.google_gmail_connector import fetch_google_user_email from app.connectors.google_gmail_connector import fetch_google_user_email
@ -23,7 +22,10 @@ from app.db import (
get_async_session, get_async_session,
) )
from app.users import current_active_user from app.users import current_active_user
from app.utils.connector_naming import check_duplicate_connector, generate_unique_connector_name from app.utils.connector_naming import (
check_duplicate_connector,
generate_unique_connector_name,
)
from app.utils.oauth_security import OAuthStateManager, TokenEncryption from app.utils.oauth_security import OAuthStateManager, TokenEncryption
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -37,7 +37,10 @@ from app.db import (
get_async_session, get_async_session,
) )
from app.users import current_active_user from app.users import current_active_user
from app.utils.connector_naming import check_duplicate_connector, generate_unique_connector_name from app.utils.connector_naming import (
check_duplicate_connector,
generate_unique_connector_name,
)
from app.utils.oauth_security import OAuthStateManager, TokenEncryption from app.utils.oauth_security import OAuthStateManager, TokenEncryption
# Relax token scope validation for Google OAuth # Relax token scope validation for Google OAuth

View file

@ -12,7 +12,6 @@ from google_auth_oauthlib.flow import Flow
from pydantic import ValidationError from pydantic import ValidationError
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.config import config from app.config import config
from app.connectors.google_gmail_connector import fetch_google_user_email from app.connectors.google_gmail_connector import fetch_google_user_email
@ -23,7 +22,10 @@ from app.db import (
get_async_session, get_async_session,
) )
from app.users import current_active_user from app.users import current_active_user
from app.utils.connector_naming import check_duplicate_connector, generate_unique_connector_name from app.utils.connector_naming import (
check_duplicate_connector,
generate_unique_connector_name,
)
from app.utils.oauth_security import OAuthStateManager, TokenEncryption from app.utils.oauth_security import OAuthStateManager, TokenEncryption
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -15,7 +15,6 @@ from fastapi.responses import RedirectResponse
from pydantic import ValidationError from pydantic import ValidationError
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.config import config from app.config import config
from app.db import ( from app.db import (
@ -26,12 +25,12 @@ from app.db import (
) )
from app.schemas.atlassian_auth_credentials import AtlassianAuthCredentialsBase from app.schemas.atlassian_auth_credentials import AtlassianAuthCredentialsBase
from app.users import current_active_user from app.users import current_active_user
from app.utils.oauth_security import OAuthStateManager, TokenEncryption
from app.utils.connector_naming import ( from app.utils.connector_naming import (
check_duplicate_connector, check_duplicate_connector,
extract_identifier_from_credentials, extract_identifier_from_credentials,
generate_unique_connector_name, generate_unique_connector_name,
) )
from app.utils.oauth_security import OAuthStateManager, TokenEncryption
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -14,19 +14,21 @@ from fastapi.responses import RedirectResponse
from pydantic import ValidationError from pydantic import ValidationError
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.config import config from app.config import config
from app.connectors.linear_connector import fetch_linear_organization_name
from app.db import ( from app.db import (
SearchSourceConnector, SearchSourceConnector,
SearchSourceConnectorType, SearchSourceConnectorType,
User, User,
get_async_session, get_async_session,
) )
from app.connectors.linear_connector import fetch_linear_organization_name
from app.schemas.linear_auth_credentials import LinearAuthCredentialsBase from app.schemas.linear_auth_credentials import LinearAuthCredentialsBase
from app.users import current_active_user from app.users import current_active_user
from app.utils.connector_naming import check_duplicate_connector, generate_unique_connector_name from app.utils.connector_naming import (
check_duplicate_connector,
generate_unique_connector_name,
)
from app.utils.oauth_security import OAuthStateManager, TokenEncryption from app.utils.oauth_security import OAuthStateManager, TokenEncryption
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -14,7 +14,6 @@ from fastapi.responses import RedirectResponse
from pydantic import ValidationError from pydantic import ValidationError
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.config import config from app.config import config
from app.db import ( from app.db import (
@ -25,12 +24,12 @@ from app.db import (
) )
from app.schemas.notion_auth_credentials import NotionAuthCredentialsBase from app.schemas.notion_auth_credentials import NotionAuthCredentialsBase
from app.users import current_active_user from app.users import current_active_user
from app.utils.oauth_security import OAuthStateManager, TokenEncryption
from app.utils.connector_naming import ( from app.utils.connector_naming import (
check_duplicate_connector, check_duplicate_connector,
extract_identifier_from_credentials, extract_identifier_from_credentials,
generate_unique_connector_name, generate_unique_connector_name,
) )
from app.utils.oauth_security import OAuthStateManager, TokenEncryption
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -14,7 +14,6 @@ from fastapi.responses import RedirectResponse
from pydantic import ValidationError from pydantic import ValidationError
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.config import config from app.config import config
from app.db import ( from app.db import (

View file

@ -31,7 +31,9 @@ BASE_NAME_FOR_TYPE = {
def get_base_name_for_type(connector_type: SearchSourceConnectorType) -> str: def get_base_name_for_type(connector_type: SearchSourceConnectorType) -> str:
"""Get a friendly display name for a connector type.""" """Get a friendly display name for a connector type."""
return BASE_NAME_FOR_TYPE.get(connector_type, connector_type.replace("_", " ").title()) return BASE_NAME_FOR_TYPE.get(
connector_type, connector_type.replace("_", " ").title()
)
def extract_identifier_from_credentials( def extract_identifier_from_credentials(
@ -178,9 +180,10 @@ async def generate_unique_connector_name(
return f"{base} - {identifier}" return f"{base} - {identifier}"
# Fallback: use counter for uniqueness # Fallback: use counter for uniqueness
count = await count_connectors_of_type(session, connector_type, search_space_id, user_id) count = await count_connectors_of_type(
session, connector_type, search_space_id, user_id
)
if count == 0: if count == 0:
return base return base
return f"{base} ({count + 1})" return f"{base} ({count + 1})"