diff --git a/backend/.pre-commit-config.yaml b/backend/.pre-commit-config.yaml index 9a8d0da..f05929a 100644 --- a/backend/.pre-commit-config.yaml +++ b/backend/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.9 + rev: v0.5.0 hooks: - id: ruff args: [--fix] diff --git a/backend/alembic/versions/2024_07_04_2338-c09c3268e2b9_init_db.py b/backend/alembic/versions/2024_07_04_2338-c09c3268e2b9_init_db.py index 78e2ee3..20f3493 100644 --- a/backend/alembic/versions/2024_07_04_2338-c09c3268e2b9_init_db.py +++ b/backend/alembic/versions/2024_07_04_2338-c09c3268e2b9_init_db.py @@ -7,7 +7,6 @@ """ from collections.abc import Sequence -from typing import Union import sqlalchemy as sa import sqlalchemy_utils @@ -18,9 +17,9 @@ # revision identifiers, used by Alembic. revision: str = "c09c3268e2b9" -down_revision: Union[str, None] = None -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None +down_revision: str | None = None +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None def upgrade() -> None: @@ -444,7 +443,7 @@ def upgrade() -> None: sa.Column("description", sa.String(), nullable=True), sa.Column("status", sqlalchemy_utils.types.choice.ChoiceType(length=255), nullable=False), sa.Column("ip_address", sa.String(), nullable=False), - sa.Column("associted_interfaces", postgresql.ARRAY(sa.String(), dimensions=1), nullable=True), + sa.Column("associated_interfaces", postgresql.ARRAY(sa.String(), dimensions=1), nullable=True), sa.Column("site_id", sa.Integer(), nullable=False), sa.Column("role_id", sa.Integer(), nullable=True), sa.ForeignKeyConstraint(["role_id"], ["ip_role.id"], ondelete="SET NULL"), @@ -788,7 +787,7 @@ def upgrade() -> None: sa.Column("serial_number", sa.String(), nullable=True), sa.Column("part_number", sa.String(), nullable=True), sa.Column("hardware_version", sa.String(), nullable=True), - sa.Column("phsical_index", sa.Integer(), nullable=True), + sa.Column("physical_index", sa.Integer(), nullable=True), sa.Column("replaceable", sa.Boolean(), nullable=True), sa.Column("device_id", sa.Integer(), nullable=False), sa.ForeignKeyConstraint(["device_id"], ["device.id"], ondelete="CASCADE"), diff --git a/backend/src/core/errors/exception_handlers.py b/backend/src/core/errors/exception_handlers.py index 024d5b7..4fa18d3 100644 --- a/backend/src/core/errors/exception_handlers.py +++ b/backend/src/core/errors/exception_handlers.py @@ -101,42 +101,42 @@ def log_exception(exc: type[BaseException] | Exception, logger_trace_info: bool) logger.exception(f"Stack trace: {trace_back}") -async def token_invalid_handler(request: Request, exc: TokenInvalidError) -> JSONResponse: +async def token_invalid_handler(request: Request, exc: TokenInvalidError) -> JSONResponse: # noqa: ARG001 log_exception(exc, False) response_content = err_codes.ERR_10002.dict() return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content=response_content) -async def invalid_token_for_refresh_handler(request: Request, exc: TokenInvalidForRefreshError) -> JSONResponse: +async def invalid_token_for_refresh_handler(request: Request, exc: TokenInvalidForRefreshError) -> JSONResponse: # noqa: ARG001 log_exception(exc, False) return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content=err_codes.ERR_10004.dict()) -async def token_expired_handler(request: Request, exc: TokenExpireError) -> JSONResponse: +async def token_expired_handler(request: Request, exc: TokenExpireError) -> JSONResponse: # noqa: ARG001 log_exception(exc, False) return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content=err_codes.ERR_10003.dict()) -async def permission_deny_handler(request: Request, exc: PermissionDenyError) -> JSONResponse: +async def permission_deny_handler(request: Request, exc: PermissionDenyError) -> JSONResponse: # noqa: ARG001 log_exception(exc, False) return JSONResponse(status_code=status.HTTP_403_FORBIDDEN, content=err_codes.ERR_10004.dict()) -async def resource_not_found_handler(request: Request, exc: NotFoundError) -> JSONResponse: +async def resource_not_found_handler(request: Request, exc: NotFoundError) -> JSONResponse: # noqa: ARG001 log_exception(exc, True) error_message = _(err_codes.ERR_404.message, name=exc.name, filed=exc.field, value=exc.value) content = {"error": err_codes.ERR_404.error, "message": error_message} return JSONResponse(status_code=status.HTTP_404_NOT_FOUND, content=content) -async def resource_exist_handler(request: Request, exc: ExistError) -> JSONResponse: +async def resource_exist_handler(request: Request, exc: ExistError) -> JSONResponse: # noqa: ARG001 log_exception(exc, True) error_message = _(err_codes.ERR_409.message, name=exc.name, filed=exc.field, value=exc.value) content = {"error": err_codes.ERR_409.error, "message": error_message} return JSONResponse(status_code=status.HTTP_404_NOT_FOUND, content=content) -def gener_error_handler(request: Request, exc: GenerError) -> JSONResponse: +def gener_error_handler(request: Request, exc: GenerError) -> JSONResponse: # noqa: ARG001 log_exception(exc, True) return JSONResponse( status_code=exc.status_code, @@ -147,7 +147,7 @@ def gener_error_handler(request: Request, exc: GenerError) -> JSONResponse: ) -def default_exception_handler(request: Request, exc: Exception) -> JSONResponse: +def default_exception_handler(request: Request, exc: Exception) -> JSONResponse: # noqa: ARG001 log_exception(exc, logger_trace_info=True) return JSONResponse( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, diff --git a/backend/src/features/dcim/api.py b/backend/src/features/dcim/api.py index 94ee5a2..cce31b6 100644 --- a/backend/src/features/dcim/api.py +++ b/backend/src/features/dcim/api.py @@ -8,8 +8,8 @@ from src.features.admin.models import User from src.features.dcim import schemas from src.features.dcim.models import Device -from src.features.intend.models import DeviceType from src.features.deps import auth, get_session +from src.features.intend.models import DeviceType router = APIRouter() diff --git a/backend/src/features/dcim/models.py b/backend/src/features/dcim/models.py index 5a598ac..2aa2390 100644 --- a/backend/src/features/dcim/models.py +++ b/backend/src/features/dcim/models.py @@ -71,7 +71,7 @@ class DeviceModule(Base): serial_number: Mapped[str | None] = mapped_column(unique=True) part_number: Mapped[str | None] hardware_version: Mapped[str | None] - phsical_index: Mapped[int | None] # cisco physical_index, huawei slot_id + physical_index: Mapped[int | None] # cisco physical_index, huawei slot_id replaceable: Mapped[bool | None] device_id: Mapped[int] = mapped_column(ForeignKey("device.id", ondelete="CASCADE")) diff --git a/backend/src/features/deps.py b/backend/src/features/deps.py index d14424e..81011aa 100644 --- a/backend/src/features/deps.py +++ b/backend/src/features/deps.py @@ -11,12 +11,7 @@ from src.core.config import settings from src.core.database.session import async_session -from src.core.errors.exception_handlers import ( - NotFoundError, - TokenExpireError, - TokenInvalidError, - PermissionDenyError -) +from src.core.errors.exception_handlers import NotFoundError, PermissionDenyError, TokenExpireError, TokenInvalidError from src.core.utils.context import locale_ctx from src.features.admin.models import RolePermission, User from src.features.admin.security import API_WHITE_LISTS, JWT_ALGORITHM, JwtTokenPayload @@ -54,7 +49,7 @@ async def auth( check_user_active(user.is_active) operation_id = request.scope["route"].operation_id if not operation_id: - raise + return user privileged = check_privileged_role(user.role.slug, operation_id) if privileged: return user @@ -70,9 +65,7 @@ def check_user_active(is_active: bool) -> None: def check_privileged_role(slug: str, operation_id: str) -> bool: if slug == ReservedRoleSlug.ADMIN: return True - if operation_id in API_WHITE_LISTS: - return True - return False + return operation_id in API_WHITE_LISTS async def check_role_permissions(role_id: int, session: AsyncSession, operation_id: str) -> None: