Files
orion/app/modules/catalog/schemas/catalog.py
Samir Boulahtit 1b8a40f1ff
All checks were successful
CI / dependency-scanning (push) Successful in 27s
CI / docs (push) Successful in 35s
CI / ruff (push) Successful in 8s
CI / pytest (push) Successful in 34m22s
CI / validate (push) Successful in 19s
CI / deploy (push) Successful in 2m25s
feat(validators): add noqa suppression support to security and performance validators
- Add centralized _is_noqa_suppressed() to BaseValidator with normalization
  (accepts both SEC001 and SEC-001 formats for ruff compatibility)
- Wire noqa support into all 21 security and 18 performance check functions
- Add ruff external config for SEC/PERF/MOD/EXC codes in pyproject.toml
- Convert all 280 Python noqa comments to dashless format (ruff-compatible)
- Add site/ to IGNORE_PATTERNS (excludes mkdocs build output)
- Suppress 152 false positive findings (test passwords, seed data, validator
  self-references, Apple Wallet SHA1, etc.)
- Security: 79 errors → 0, 60 warnings → 0
- Performance: 80 warnings → 77 (3 test script suppressions)
- Add proposal doc with noqa inventory and remaining findings recommendations

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 22:56:56 +01:00

57 lines
1.4 KiB
Python

# app/modules/catalog/schemas/catalog.py
"""
Pydantic schemas for catalog browsing operations.
These schemas are for the public storefront catalog API.
For store product management, see the products module.
"""
from datetime import datetime
from pydantic import BaseModel, ConfigDict
from app.modules.inventory.schemas import InventoryLocationResponse # noqa: IMPORT002
from app.modules.marketplace.schemas import MarketplaceProductResponse # IMPORT-002
class ProductResponse(BaseModel):
"""Response model for a product in the catalog."""
model_config = ConfigDict(from_attributes=True)
id: int
store_id: int
marketplace_product: MarketplaceProductResponse
store_sku: str | None
price: float | None
sale_price: float | None
currency: str | None
availability: str | None
condition: str | None
is_featured: bool
is_active: bool
display_order: int
min_quantity: int
max_quantity: int | None
created_at: datetime
updated_at: datetime
# Include inventory summary
total_inventory: int | None = None
available_inventory: int | None = None
class ProductDetailResponse(ProductResponse):
"""Product with full inventory details."""
inventory_locations: list[InventoryLocationResponse] = []
class ProductListResponse(BaseModel):
"""Paginated list of products."""
products: list[ProductResponse]
total: int
skip: int
limit: int