From c79b76be41b6c46578e0810c825275d7b0e7f639 Mon Sep 17 00:00:00 2001 From: Felipe Cardoso Date: Sat, 1 Nov 2025 04:50:43 +0100 Subject: [PATCH] Remove and reorder unused imports across the project for cleaner and more consistent code structure --- backend/app/alembic/env.py | 1 - .../2d0fcec3b06d_add_soft_delete_to_users.py | 2 +- .../38bf9e7e74b3_add_all_initial_models.py | 4 ++-- .../549b50ea888d_add_user_sessions_table.py | 2 +- .../7396957cbe80_initial_empty_migration.py | 2 -- ...dd_missing_indexes_and_fix_column_types.py | 2 +- .../b76c725fc3cf_add_composite_indexes.py | 2 +- ...dd_organizations_and_user_organizations.py | 2 +- backend/app/api/dependencies/auth.py | 2 +- backend/app/api/dependencies/permissions.py | 5 ++-- backend/app/api/routes/admin.py | 24 +++++++++---------- backend/app/api/routes/organizations.py | 20 +++++++--------- backend/app/api/routes/users.py | 14 +++++------ backend/app/core/config.py | 7 +++--- backend/app/core/database.py | 5 ++-- backend/app/core/database_async.py | 2 +- backend/app/core/exceptions.py | 5 ++-- backend/app/crud/__init__.py | 4 ++-- backend/app/crud/base.py | 18 +++++++------- backend/app/crud/base_async.py | 4 ++-- backend/app/crud/organization.py | 15 ++++++------ backend/app/crud/organization_async.py | 9 +++---- backend/app/crud/session.py | 5 ++-- backend/app/crud/user.py | 10 ++++---- backend/app/crud/user_async.py | 12 ++++++---- backend/app/init_db.py | 4 +++- backend/app/main.py | 5 ++-- backend/app/models/__init__.py | 5 ++-- backend/app/schemas/common.py | 6 ++--- backend/app/schemas/errors.py | 1 + backend/app/schemas/users.py | 1 - backend/app/services/auth_service.py | 2 +- backend/app/services/email_service.py | 2 +- backend/app/utils/device.py | 1 + backend/app/utils/test_utils.py | 5 ++-- 35 files changed, 109 insertions(+), 101 deletions(-) diff --git a/backend/app/alembic/env.py b/backend/app/alembic/env.py index 5b616e5..5db5c51 100644 --- a/backend/app/alembic/env.py +++ b/backend/app/alembic/env.py @@ -14,7 +14,6 @@ sys.path.append(str(app_dir.parent)) # Import Core modules from app.core.config import settings -from app.core.database import Base # Import all models to ensure they're registered with SQLAlchemy from app.models import * diff --git a/backend/app/alembic/versions/2d0fcec3b06d_add_soft_delete_to_users.py b/backend/app/alembic/versions/2d0fcec3b06d_add_soft_delete_to_users.py index 3eb97b0..da49433 100644 --- a/backend/app/alembic/versions/2d0fcec3b06d_add_soft_delete_to_users.py +++ b/backend/app/alembic/versions/2d0fcec3b06d_add_soft_delete_to_users.py @@ -7,9 +7,9 @@ Create Date: 2025-10-30 16:40:21.000021 """ from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '2d0fcec3b06d' diff --git a/backend/app/alembic/versions/38bf9e7e74b3_add_all_initial_models.py b/backend/app/alembic/versions/38bf9e7e74b3_add_all_initial_models.py index f563857..1a990d1 100644 --- a/backend/app/alembic/versions/38bf9e7e74b3_add_all_initial_models.py +++ b/backend/app/alembic/versions/38bf9e7e74b3_add_all_initial_models.py @@ -7,9 +7,9 @@ Create Date: 2025-02-28 09:19:33.212278 """ from typing import Sequence, Union -from alembic import op import sqlalchemy as sa -from sqlalchemy.dialects import postgresql + +from alembic import op # revision identifiers, used by Alembic. revision: str = '38bf9e7e74b3' diff --git a/backend/app/alembic/versions/549b50ea888d_add_user_sessions_table.py b/backend/app/alembic/versions/549b50ea888d_add_user_sessions_table.py index f47a652..7c31b1e 100644 --- a/backend/app/alembic/versions/549b50ea888d_add_user_sessions_table.py +++ b/backend/app/alembic/versions/549b50ea888d_add_user_sessions_table.py @@ -7,9 +7,9 @@ Create Date: 2025-10-31 07:41:18.729544 """ from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '549b50ea888d' diff --git a/backend/app/alembic/versions/7396957cbe80_initial_empty_migration.py b/backend/app/alembic/versions/7396957cbe80_initial_empty_migration.py index bd34663..29dde03 100644 --- a/backend/app/alembic/versions/7396957cbe80_initial_empty_migration.py +++ b/backend/app/alembic/versions/7396957cbe80_initial_empty_migration.py @@ -8,8 +8,6 @@ Create Date: 2025-02-27 12:47:46.445313 from typing import Sequence, Union from alembic import op -import sqlalchemy as sa - # revision identifiers, used by Alembic. revision: str = '7396957cbe80' diff --git a/backend/app/alembic/versions/9e4f2a1b8c7d_add_missing_indexes_and_fix_column_types.py b/backend/app/alembic/versions/9e4f2a1b8c7d_add_missing_indexes_and_fix_column_types.py index 86da660..dba8ef6 100644 --- a/backend/app/alembic/versions/9e4f2a1b8c7d_add_missing_indexes_and_fix_column_types.py +++ b/backend/app/alembic/versions/9e4f2a1b8c7d_add_missing_indexes_and_fix_column_types.py @@ -7,9 +7,9 @@ Create Date: 2025-10-30 10:00:00.000000 """ from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '9e4f2a1b8c7d' diff --git a/backend/app/alembic/versions/b76c725fc3cf_add_composite_indexes.py b/backend/app/alembic/versions/b76c725fc3cf_add_composite_indexes.py index 75172c6..f7b7207 100644 --- a/backend/app/alembic/versions/b76c725fc3cf_add_composite_indexes.py +++ b/backend/app/alembic/versions/b76c725fc3cf_add_composite_indexes.py @@ -7,9 +7,9 @@ Create Date: 2025-10-30 16:41:33.273135 """ from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = 'b76c725fc3cf' diff --git a/backend/app/alembic/versions/fbf6318a8a36_add_organizations_and_user_organizations.py b/backend/app/alembic/versions/fbf6318a8a36_add_organizations_and_user_organizations.py index a71626d..ea6af13 100644 --- a/backend/app/alembic/versions/fbf6318a8a36_add_organizations_and_user_organizations.py +++ b/backend/app/alembic/versions/fbf6318a8a36_add_organizations_and_user_organizations.py @@ -7,9 +7,9 @@ Create Date: 2025-10-31 12:08:05.141353 """ from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = 'fbf6318a8a36' diff --git a/backend/app/api/dependencies/auth.py b/backend/app/api/dependencies/auth.py index 736f209..6502f9d 100755 --- a/backend/app/api/dependencies/auth.py +++ b/backend/app/api/dependencies/auth.py @@ -3,8 +3,8 @@ from typing import Optional from fastapi import Depends, HTTPException, status, Header from fastapi.security import OAuth2PasswordBearer from fastapi.security.utils import get_authorization_scheme_param -from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession from app.core.auth import get_token_data, TokenExpiredError, TokenInvalidError from app.core.database_async import get_async_db diff --git a/backend/app/api/dependencies/permissions.py b/backend/app/api/dependencies/permissions.py index 73749ce..76e4545 100755 --- a/backend/app/api/dependencies/permissions.py +++ b/backend/app/api/dependencies/permissions.py @@ -9,14 +9,15 @@ These dependencies are optional and flexible: """ from typing import Optional from uuid import UUID + from fastapi import Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession +from app.api.dependencies.auth import get_current_user from app.core.database_async import get_async_db +from app.crud.organization_async import organization_async as organization_crud from app.models.user import User from app.models.user_organization import OrganizationRole -from app.api.dependencies.auth import get_current_user -from app.crud.organization_async import organization_async as organization_crud def require_superuser( diff --git a/backend/app/api/routes/admin.py b/backend/app/api/routes/admin.py index 9dd0ba6..95dbca1 100755 --- a/backend/app/api/routes/admin.py +++ b/backend/app/api/routes/admin.py @@ -6,27 +6,21 @@ These endpoints require superuser privileges and provide CMS-like functionality for managing the application. """ import logging +from enum import Enum from typing import Any, List, Optional from uuid import UUID -from enum import Enum -from fastapi import APIRouter, Depends, Query, Body, status -from sqlalchemy.ext.asyncio import AsyncSession +from fastapi import APIRouter, Depends, Query, status from pydantic import BaseModel, Field +from sqlalchemy.ext.asyncio import AsyncSession from app.api.dependencies.permissions import require_superuser from app.core.database_async import get_async_db -from app.crud.user_async import user_async as user_crud +from app.core.exceptions import NotFoundError, DuplicateError, AuthorizationError, ErrorCode from app.crud.organization_async import organization_async as organization_crud +from app.crud.user_async import user_async as user_crud from app.models.user import User from app.models.user_organization import OrganizationRole -from app.schemas.users import UserResponse, UserCreate, UserUpdate -from app.schemas.organizations import ( - OrganizationResponse, - OrganizationCreate, - OrganizationUpdate, - OrganizationMemberResponse -) from app.schemas.common import ( PaginationParams, PaginatedResponse, @@ -34,7 +28,13 @@ from app.schemas.common import ( SortParams, create_pagination_meta ) -from app.core.exceptions import NotFoundError, DuplicateError, AuthorizationError, ErrorCode +from app.schemas.organizations import ( + OrganizationResponse, + OrganizationCreate, + OrganizationUpdate, + OrganizationMemberResponse +) +from app.schemas.users import UserResponse, UserCreate, UserUpdate logger = logging.getLogger(__name__) diff --git a/backend/app/api/routes/organizations.py b/backend/app/api/routes/organizations.py index 173d3dc..9b1c953 100755 --- a/backend/app/api/routes/organizations.py +++ b/backend/app/api/routes/organizations.py @@ -5,30 +5,28 @@ Organization endpoints for regular users. These endpoints allow users to view and manage organizations they belong to. """ import logging -from typing import Any, List, Optional +from typing import Any, List from uuid import UUID -from fastapi import APIRouter, Depends, Query, status +from fastapi import APIRouter, Depends, Query from sqlalchemy.ext.asyncio import AsyncSession from app.api.dependencies.auth import get_current_user -from app.api.dependencies.permissions import require_org_admin, require_org_membership, get_current_org_role +from app.api.dependencies.permissions import require_org_admin, require_org_membership from app.core.database_async import get_async_db +from app.core.exceptions import NotFoundError, ErrorCode from app.crud.organization_async import organization_async as organization_crud from app.models.user import User -from app.models.user_organization import OrganizationRole +from app.schemas.common import ( + PaginationParams, + PaginatedResponse, + create_pagination_meta +) from app.schemas.organizations import ( OrganizationResponse, OrganizationMemberResponse, OrganizationUpdate ) -from app.schemas.common import ( - PaginationParams, - PaginatedResponse, - MessageResponse, - create_pagination_meta -) -from app.core.exceptions import NotFoundError, AuthorizationError, ErrorCode logger = logging.getLogger(__name__) diff --git a/backend/app/api/routes/users.py b/backend/app/api/routes/users.py index 1412040..050f833 100755 --- a/backend/app/api/routes/users.py +++ b/backend/app/api/routes/users.py @@ -6,15 +6,19 @@ from typing import Any, Optional from uuid import UUID from fastapi import APIRouter, Depends, Query, status, Request -from sqlalchemy.ext.asyncio import AsyncSession from slowapi import Limiter from slowapi.util import get_remote_address +from sqlalchemy.ext.asyncio import AsyncSession from app.api.dependencies.auth import get_current_user, get_current_superuser from app.core.database_async import get_async_db +from app.core.exceptions import ( + NotFoundError, + AuthorizationError, + ErrorCode +) from app.crud.user_async import user_async as user_crud from app.models.user import User -from app.schemas.users import UserResponse, UserUpdate, PasswordChange from app.schemas.common import ( PaginationParams, PaginatedResponse, @@ -22,12 +26,8 @@ from app.schemas.common import ( SortParams, create_pagination_meta ) +from app.schemas.users import UserResponse, UserUpdate, PasswordChange from app.services.auth_service import AuthService, AuthenticationError -from app.core.exceptions import ( - NotFoundError, - AuthorizationError, - ErrorCode -) logger = logging.getLogger(__name__) diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 0f5b617..53c6cba 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -1,7 +1,8 @@ -from pydantic_settings import BaseSettings -from typing import Optional, List -from pydantic import Field, field_validator import logging +from typing import Optional, List + +from pydantic import Field, field_validator +from pydantic_settings import BaseSettings class Settings(BaseSettings): diff --git a/backend/app/core/database.py b/backend/app/core/database.py index d95e7a0..1e51a43 100644 --- a/backend/app/core/database.py +++ b/backend/app/core/database.py @@ -2,11 +2,12 @@ import logging from contextlib import contextmanager from typing import Generator + from sqlalchemy import create_engine, text +from sqlalchemy.dialects.postgresql import JSONB, UUID +from sqlalchemy.ext.compiler import compiles from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, Session -from sqlalchemy.ext.compiler import compiles -from sqlalchemy.dialects.postgresql import JSONB, UUID from app.core.config import settings diff --git a/backend/app/core/database_async.py b/backend/app/core/database_async.py index e198b33..bf0dfbd 100755 --- a/backend/app/core/database_async.py +++ b/backend/app/core/database_async.py @@ -10,6 +10,7 @@ from contextlib import asynccontextmanager from typing import AsyncGenerator from sqlalchemy import text +from sqlalchemy.dialects.postgresql import JSONB, UUID from sqlalchemy.ext.asyncio import ( AsyncSession, AsyncEngine, @@ -17,7 +18,6 @@ from sqlalchemy.ext.asyncio import ( async_sessionmaker, ) from sqlalchemy.ext.compiler import compiles -from sqlalchemy.dialects.postgresql import JSONB, UUID from sqlalchemy.orm import DeclarativeBase from app.core.config import settings diff --git a/backend/app/core/exceptions.py b/backend/app/core/exceptions.py index ba3489f..af39ace 100644 --- a/backend/app/core/exceptions.py +++ b/backend/app/core/exceptions.py @@ -2,10 +2,11 @@ Custom exceptions and global exception handlers for the API. """ import logging -from typing import Optional, Union, List +from typing import Optional, Union + from fastapi import HTTPException, Request, status -from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError +from fastapi.responses import JSONResponse from pydantic import ValidationError from app.schemas.errors import ErrorCode, ErrorDetail, ErrorResponse diff --git a/backend/app/crud/__init__.py b/backend/app/crud/__init__.py index 77c1ef5..734fad0 100644 --- a/backend/app/crud/__init__.py +++ b/backend/app/crud/__init__.py @@ -1,6 +1,6 @@ # app/crud/__init__.py -from .user import user -from .session import session as session_crud from .organization import organization +from .session import session as session_crud +from .user import user __all__ = ["user", "session_crud", "organization"] diff --git a/backend/app/crud/base.py b/backend/app/crud/base.py index c524df4..bf8728e 100644 --- a/backend/app/crud/base.py +++ b/backend/app/crud/base.py @@ -1,13 +1,15 @@ -from typing import Any, Dict, Generic, List, Optional, Type, TypeVar, Union, Tuple -from datetime import datetime, timezone -from fastapi.encoders import jsonable_encoder -from pydantic import BaseModel -from sqlalchemy.orm import Session -from sqlalchemy.exc import IntegrityError, OperationalError, DataError -from sqlalchemy import func, asc, desc -from app.core.database import Base import logging import uuid +from datetime import datetime, timezone +from typing import Any, Dict, Generic, List, Optional, Type, TypeVar, Union, Tuple + +from fastapi.encoders import jsonable_encoder +from pydantic import BaseModel +from sqlalchemy import asc, desc +from sqlalchemy.exc import IntegrityError, OperationalError, DataError +from sqlalchemy.orm import Session + +from app.core.database import Base logger = logging.getLogger(__name__) diff --git a/backend/app/crud/base_async.py b/backend/app/crud/base_async.py index 66b40bf..c10715f 100755 --- a/backend/app/crud/base_async.py +++ b/backend/app/crud/base_async.py @@ -4,15 +4,15 @@ Async CRUD operations base class using SQLAlchemy 2.0 async patterns. Provides reusable create, read, update, and delete operations for all models. """ -from typing import Any, Dict, Generic, List, Optional, Type, TypeVar, Union, Tuple import logging import uuid +from typing import Any, Dict, Generic, List, Optional, Type, TypeVar, Union, Tuple from fastapi.encoders import jsonable_encoder from pydantic import BaseModel from sqlalchemy import func, select -from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.exc import IntegrityError, OperationalError, DataError +from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import Load from app.core.database_async import Base diff --git a/backend/app/crud/organization.py b/backend/app/crud/organization.py index e2a0eba..0a86b31 100644 --- a/backend/app/crud/organization.py +++ b/backend/app/crud/organization.py @@ -1,21 +1,20 @@ # app/crud/organization.py -from typing import Optional, List, Dict, Any, Union +import logging +from typing import Optional, List, Dict, Any from uuid import UUID -from sqlalchemy.orm import Session -from sqlalchemy.exc import IntegrityError + from sqlalchemy import func, or_, and_ +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import Session from app.crud.base import CRUDBase from app.models.organization import Organization -from app.models.user_organization import UserOrganization, OrganizationRole from app.models.user import User +from app.models.user_organization import UserOrganization, OrganizationRole from app.schemas.organizations import ( OrganizationCreate, - OrganizationUpdate, - UserOrganizationCreate, - UserOrganizationUpdate + OrganizationUpdate ) -import logging logger = logging.getLogger(__name__) diff --git a/backend/app/crud/organization_async.py b/backend/app/crud/organization_async.py index 5ab93f5..fe8f010 100755 --- a/backend/app/crud/organization_async.py +++ b/backend/app/crud/organization_async.py @@ -1,20 +1,21 @@ # app/crud/organization_async.py """Async CRUD operations for Organization model using SQLAlchemy 2.0 patterns.""" +import logging from typing import Optional, List, Dict, Any from uuid import UUID -from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy.exc import IntegrityError + from sqlalchemy import func, or_, and_, select +from sqlalchemy.exc import IntegrityError +from sqlalchemy.ext.asyncio import AsyncSession from app.crud.base_async import CRUDBaseAsync from app.models.organization import Organization -from app.models.user_organization import UserOrganization, OrganizationRole from app.models.user import User +from app.models.user_organization import UserOrganization, OrganizationRole from app.schemas.organizations import ( OrganizationCreate, OrganizationUpdate, ) -import logging logger = logging.getLogger(__name__) diff --git a/backend/app/crud/session.py b/backend/app/crud/session.py index e279bf7..2b23a04 100644 --- a/backend/app/crud/session.py +++ b/backend/app/crud/session.py @@ -1,12 +1,13 @@ """ CRUD operations for user sessions. """ +import logging from datetime import datetime, timezone, timedelta from typing import List, Optional from uuid import UUID -from sqlalchemy.orm import Session + from sqlalchemy import and_ -import logging +from sqlalchemy.orm import Session from app.crud.base import CRUDBase from app.models.user_session import UserSession diff --git a/backend/app/crud/user.py b/backend/app/crud/user.py index 6887407..d1fafd6 100644 --- a/backend/app/crud/user.py +++ b/backend/app/crud/user.py @@ -1,13 +1,15 @@ # app/crud/user.py +import logging from typing import Optional, Union, Dict, Any, List, Tuple -from sqlalchemy.orm import Session -from sqlalchemy.exc import IntegrityError + from sqlalchemy import or_, asc, desc +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import Session + +from app.core.auth import get_password_hash from app.crud.base import CRUDBase from app.models.user import User from app.schemas.users import UserCreate, UserUpdate -from app.core.auth import get_password_hash -import logging logger = logging.getLogger(__name__) diff --git a/backend/app/crud/user_async.py b/backend/app/crud/user_async.py index 03e50b9..63fdecd 100755 --- a/backend/app/crud/user_async.py +++ b/backend/app/crud/user_async.py @@ -1,16 +1,18 @@ # app/crud/user_async.py """Async CRUD operations for User model using SQLAlchemy 2.0 patterns.""" +import logging +from datetime import datetime, timezone from typing import Optional, Union, Dict, Any, List, Tuple from uuid import UUID -from datetime import datetime, timezone -from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy.exc import IntegrityError + from sqlalchemy import or_, select, update +from sqlalchemy.exc import IntegrityError +from sqlalchemy.ext.asyncio import AsyncSession + +from app.core.auth import get_password_hash_async from app.crud.base_async import CRUDBaseAsync from app.models.user import User from app.schemas.users import UserCreate, UserUpdate -from app.core.auth import get_password_hash_async -import logging logger = logging.getLogger(__name__) diff --git a/backend/app/init_db.py b/backend/app/init_db.py index 53f3aa5..c67e2f8 100755 --- a/backend/app/init_db.py +++ b/backend/app/init_db.py @@ -1,11 +1,13 @@ # app/init_db.py import logging from typing import Optional + from sqlalchemy.orm import Session + from app.core.config import settings +from app.core.database import engine from app.crud.user import user as user_crud from app.schemas.users import UserCreate -from app.core.database import engine logger = logging.getLogger(__name__) diff --git a/backend/app/main.py b/backend/app/main.py index 32c02c8..8f7d7f3 100755 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -4,13 +4,12 @@ from typing import Dict, Any from apscheduler.schedulers.asyncio import AsyncIOScheduler from fastapi import FastAPI, status, Request, HTTPException +from fastapi.exceptions import RequestValidationError from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import HTMLResponse, JSONResponse -from fastapi.exceptions import RequestValidationError from slowapi import Limiter, _rate_limit_exceeded_handler -from slowapi.util import get_remote_address from slowapi.errors import RateLimitExceeded -from sqlalchemy import text +from slowapi.util import get_remote_address from app.api.main import api_router from app.core.config import settings diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index f31a975..581caf6 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -5,12 +5,11 @@ Imports all models to ensure they're registered with SQLAlchemy. # First import Base to avoid circular imports from app.core.database import Base from .base import TimestampMixin, UUIDMixin - +from .organization import Organization # Import models from .user import User -from .user_session import UserSession -from .organization import Organization from .user_organization import UserOrganization, OrganizationRole +from .user_session import UserSession __all__ = [ 'Base', 'TimestampMixin', 'UUIDMixin', diff --git a/backend/app/schemas/common.py b/backend/app/schemas/common.py index 4f77cf5..a5f7a5d 100644 --- a/backend/app/schemas/common.py +++ b/backend/app/schemas/common.py @@ -1,12 +1,12 @@ """ Common schemas used across the API for pagination, responses, filtering, and sorting. """ +from enum import Enum +from math import ceil from typing import Generic, TypeVar, List, Optional from uuid import UUID -from enum import Enum -from pydantic import BaseModel, Field -from math import ceil +from pydantic import BaseModel, Field T = TypeVar('T') diff --git a/backend/app/schemas/errors.py b/backend/app/schemas/errors.py index 90b9f33..99c9a95 100644 --- a/backend/app/schemas/errors.py +++ b/backend/app/schemas/errors.py @@ -3,6 +3,7 @@ Error schemas for standardized API error responses. """ from enum import Enum from typing import List, Optional + from pydantic import BaseModel, Field diff --git a/backend/app/schemas/users.py b/backend/app/schemas/users.py index 7fd7ab6..564e6ff 100644 --- a/backend/app/schemas/users.py +++ b/backend/app/schemas/users.py @@ -1,5 +1,4 @@ # app/schemas/users.py -import re from datetime import datetime from typing import Optional, Dict, Any from uuid import UUID diff --git a/backend/app/services/auth_service.py b/backend/app/services/auth_service.py index 36a91a0..cc3a46b 100755 --- a/backend/app/services/auth_service.py +++ b/backend/app/services/auth_service.py @@ -3,8 +3,8 @@ import logging from typing import Optional from uuid import UUID -from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession from app.core.auth import ( verify_password_async, diff --git a/backend/app/services/email_service.py b/backend/app/services/email_service.py index c611080..e693b37 100644 --- a/backend/app/services/email_service.py +++ b/backend/app/services/email_service.py @@ -6,8 +6,8 @@ This service provides email sending functionality with a simple console/log-base placeholder that can be easily replaced with a real email provider (SendGrid, SES, etc.) """ import logging -from typing import List, Optional from abc import ABC, abstractmethod +from typing import List, Optional from app.core.config import settings diff --git a/backend/app/utils/device.py b/backend/app/utils/device.py index fedcc55..c6614d6 100644 --- a/backend/app/utils/device.py +++ b/backend/app/utils/device.py @@ -3,6 +3,7 @@ Utility functions for extracting and parsing device information from HTTP reques """ import re from typing import Optional + from fastapi import Request from app.schemas.sessions import DeviceInfo diff --git a/backend/app/utils/test_utils.py b/backend/app/utils/test_utils.py index 26598b6..ce33e84 100644 --- a/backend/app/utils/test_utils.py +++ b/backend/app/utils/test_utils.py @@ -1,7 +1,8 @@ import logging -from sqlalchemy import create_engine, event + +from sqlalchemy import create_engine from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine -from sqlalchemy.orm import sessionmaker, clear_mappers +from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import StaticPool from app.core.database import Base