mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-29 19:35:20 +02:00
style: format backend with ruff
This commit is contained in:
parent
b664547178
commit
9841bdda72
14 changed files with 46 additions and 32 deletions
|
|
@ -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"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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"):
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
@ -454,4 +456,4 @@ async def refresh_linear_token(
|
||||||
logger.error(f"Failed to refresh Linear token: {e!s}", exc_info=True)
|
logger.error(f"Failed to refresh Linear token: {e!s}", exc_info=True)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=500, detail=f"Failed to refresh Linear token: {e!s}"
|
status_code=500, detail=f"Failed to refresh Linear token: {e!s}"
|
||||||
) from e
|
) from e
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 (
|
||||||
|
|
|
||||||
|
|
@ -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})"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue