diff --git a/alembic/env.py b/alembic/env.py index c3b8e684..ba3a8782 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -108,14 +108,14 @@ except ImportError as e: # PRODUCT MODELS # ---------------------------------------------------------------------------- try: - from models.database.product import Product + from app.modules.catalog.models import Product print(" ✓ Product model imported") except ImportError as e: print(f" ✗ Product model failed: {e}") try: - from models.database.marketplace_product import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProduct print(" ✓ MarketplaceProduct model imported") except ImportError as e: @@ -135,7 +135,7 @@ except ImportError as e: # MARKETPLACE IMPORT # ---------------------------------------------------------------------------- try: - from models.database.marketplace_import_job import MarketplaceImportJob + from app.modules.marketplace.models import MarketplaceImportJob print(" ✓ MarketplaceImportJob model imported") except ImportError as e: diff --git a/app/api/v1/platform/letzshop_vendors.py b/app/api/v1/platform/letzshop_vendors.py index fd2cdaad..721b0c22 100644 --- a/app/api/v1/platform/letzshop_vendors.py +++ b/app/api/v1/platform/letzshop_vendors.py @@ -21,7 +21,7 @@ from sqlalchemy.orm import Session from app.core.database import get_db from app.services.letzshop.vendor_sync_service import LetzshopVendorSyncService from app.services.platform_signup_service import platform_signup_service -from models.database.letzshop import LetzshopVendorCache +from app.modules.marketplace.models import LetzshopVendorCache router = APIRouter() logger = logging.getLogger(__name__) diff --git a/app/modules/analytics/services/stats_service.py b/app/modules/analytics/services/stats_service.py index 3bb8464c..cb9d26be 100644 --- a/app/modules/analytics/services/stats_service.py +++ b/app/modules/analytics/services/stats_service.py @@ -21,10 +21,9 @@ from sqlalchemy.orm import Session from app.exceptions import AdminOperationException, VendorNotFoundException from app.modules.customers.models.customer import Customer from app.modules.inventory.models import Inventory -from models.database.marketplace_import_job import MarketplaceImportJob -from models.database.marketplace_product import MarketplaceProduct +from app.modules.marketplace.models import MarketplaceImportJob, MarketplaceProduct from app.modules.orders.models import Order -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.user import User from models.database.vendor import Vendor diff --git a/app/modules/analytics/services/usage_service.py b/app/modules/analytics/services/usage_service.py index 97bb397c..0bf81891 100644 --- a/app/modules/analytics/services/usage_service.py +++ b/app/modules/analytics/services/usage_service.py @@ -16,7 +16,7 @@ from dataclasses import dataclass from sqlalchemy import func from sqlalchemy.orm import Session -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.subscription import SubscriptionTier, VendorSubscription from models.database.vendor import VendorUser diff --git a/app/modules/billing/services/admin_subscription_service.py b/app/modules/billing/services/admin_subscription_service.py index 509dfc0d..402eec66 100644 --- a/app/modules/billing/services/admin_subscription_service.py +++ b/app/modules/billing/services/admin_subscription_service.py @@ -27,7 +27,7 @@ from app.modules.billing.models import ( SubscriptionTier, VendorSubscription, ) -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.vendor import Vendor, VendorUser logger = logging.getLogger(__name__) diff --git a/app/modules/billing/services/subscription_service.py b/app/modules/billing/services/subscription_service.py index 51eb48ae..7254dd8b 100644 --- a/app/modules/billing/services/subscription_service.py +++ b/app/modules/billing/services/subscription_service.py @@ -45,7 +45,7 @@ from app.modules.billing.schemas import ( TierLimits, UsageSummary, ) -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.vendor import Vendor, VendorUser logger = logging.getLogger(__name__) diff --git a/app/modules/cart/services/cart_service.py b/app/modules/cart/services/cart_service.py index 2a2ce284..b6d826ea 100644 --- a/app/modules/cart/services/cart_service.py +++ b/app/modules/cart/services/cart_service.py @@ -24,7 +24,7 @@ from app.exceptions import ( ) from app.utils.money import cents_to_euros from app.modules.cart.models.cart import CartItem -from models.database.product import Product +from app.modules.catalog.models import Product logger = logging.getLogger(__name__) diff --git a/app/modules/catalog/models/__init__.py b/app/modules/catalog/models/__init__.py index 39f52d6c..f13327a5 100644 --- a/app/modules/catalog/models/__init__.py +++ b/app/modules/catalog/models/__init__.py @@ -2,6 +2,16 @@ """ Catalog module models. -Note: The catalog module uses the Product model from the products module. -This file exists for consistency with the module structure. +This is the canonical location for product models. + +Usage: + from app.modules.catalog.models import Product, ProductTranslation """ + +from app.modules.catalog.models.product import Product +from app.modules.catalog.models.product_translation import ProductTranslation + +__all__ = [ + "Product", + "ProductTranslation", +] diff --git a/models/database/product.py b/app/modules/catalog/models/product.py similarity index 97% rename from models/database/product.py rename to app/modules/catalog/models/product.py index a07dcfbc..72291601 100644 --- a/models/database/product.py +++ b/app/modules/catalog/models/product.py @@ -1,3 +1,4 @@ +# app/modules/catalog/models/product.py """Vendor Product model - independent copy pattern. This model represents a vendor's product. Products can be: @@ -7,7 +8,7 @@ This model represents a vendor's product. Products can be: When created from marketplace, the marketplace_product_id FK provides "view original source" comparison feature. -Money values are stored as integer cents (e.g., €105.91 = 10591). +Money values are stored as integer cents (e.g., 105.91 = 10591). See docs/architecture/money-handling.md for details. """ @@ -34,7 +35,7 @@ class Product(Base, TimestampMixin): Products can be created from marketplace imports or directly by vendors. When from marketplace, marketplace_product_id provides source comparison. - Price fields use integer cents for precision (€19.99 = 1999 cents). + Price fields use integer cents for precision (19.99 = 1999 cents). """ __tablename__ = "products" @@ -55,7 +56,7 @@ class Product(Base, TimestampMixin): gtin_type = Column(String(20)) # Format: gtin13, gtin14, gtin12, gtin8, isbn13, isbn10 # === PRODUCT FIELDS (copied from marketplace at creation) === - # Pricing - stored as integer cents (€19.99 = 1999) + # Pricing - stored as integer cents (19.99 = 1999) price_cents = Column(Integer) # Price in cents sale_price_cents = Column(Integer) # Sale price in cents currency = Column(String(3), default="EUR") @@ -188,7 +189,7 @@ class Product(Base, TimestampMixin): """Calculate net price (excluding VAT) from gross price. Formula: Net = Gross / (1 + rate/100) - Example: €119 gross at 17% VAT = €119 / 1.17 = €101.71 net + Example: 119 gross at 17% VAT = 119 / 1.17 = 101.71 net """ if self.price_cents is None: return None @@ -244,7 +245,7 @@ class Product(Base, TimestampMixin): """Calculate profit margin as percentage of net revenue. Formula: Margin% = (Profit / Net) * 100 - Example: €41.71 profit on €101.71 net = 41.0% margin + Example: 41.71 profit on 101.71 net = 41.0% margin """ net = self.net_price_cents profit = self.profit_cents diff --git a/models/database/product_translation.py b/app/modules/catalog/models/product_translation.py similarity index 98% rename from models/database/product_translation.py rename to app/modules/catalog/models/product_translation.py index 227bdf50..a3f2b48f 100644 --- a/models/database/product_translation.py +++ b/app/modules/catalog/models/product_translation.py @@ -1,3 +1,4 @@ +# app/modules/catalog/models/product_translation.py """Product Translation model for vendor-specific localized content. This model stores vendor-specific translations. Translations are independent diff --git a/app/modules/catalog/services/catalog_service.py b/app/modules/catalog/services/catalog_service.py index 4241eca9..afef5155 100644 --- a/app/modules/catalog/services/catalog_service.py +++ b/app/modules/catalog/services/catalog_service.py @@ -18,8 +18,7 @@ from sqlalchemy import or_ from sqlalchemy.orm import Session, joinedload from app.exceptions import ProductNotFoundException, ValidationException -from models.database.product import Product -from models.database.product_translation import ProductTranslation +from app.modules.catalog.models import Product, ProductTranslation logger = logging.getLogger(__name__) diff --git a/app/modules/inventory/services/inventory_import_service.py b/app/modules/inventory/services/inventory_import_service.py index 30341324..f9d5dcc8 100644 --- a/app/modules/inventory/services/inventory_import_service.py +++ b/app/modules/inventory/services/inventory_import_service.py @@ -24,7 +24,7 @@ from dataclasses import dataclass, field from sqlalchemy.orm import Session from app.modules.inventory.models.inventory import Inventory -from models.database.product import Product +from app.modules.catalog.models import Product logger = logging.getLogger(__name__) diff --git a/app/modules/inventory/services/inventory_service.py b/app/modules/inventory/services/inventory_service.py index 5a845cef..0d6c18b2 100644 --- a/app/modules/inventory/services/inventory_service.py +++ b/app/modules/inventory/services/inventory_service.py @@ -30,7 +30,7 @@ from app.modules.inventory.schemas.inventory import ( InventoryUpdate, ProductInventorySummary, ) -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.vendor import Vendor logger = logging.getLogger(__name__) @@ -603,8 +603,8 @@ class InventoryService: query = query.filter(Inventory.quantity <= low_stock) if search: - from models.database.marketplace_product import MarketplaceProduct - from models.database.marketplace_product_translation import ( + from app.modules.marketplace.models import ( + MarketplaceProduct, MarketplaceProductTranslation, ) diff --git a/app/modules/inventory/services/inventory_transaction_service.py b/app/modules/inventory/services/inventory_transaction_service.py index 34ee1742..fbba7525 100644 --- a/app/modules/inventory/services/inventory_transaction_service.py +++ b/app/modules/inventory/services/inventory_transaction_service.py @@ -15,7 +15,7 @@ from app.exceptions import OrderNotFoundException, ProductNotFoundException from app.modules.inventory.models.inventory import Inventory from app.modules.inventory.models.inventory_transaction import InventoryTransaction from app.modules.orders.models import Order -from models.database.product import Product +from app.modules.catalog.models import Product logger = logging.getLogger(__name__) diff --git a/app/modules/marketplace/models/__init__.py b/app/modules/marketplace/models/__init__.py index 495b3187..7162b1a7 100644 --- a/app/modules/marketplace/models/__init__.py +++ b/app/modules/marketplace/models/__init__.py @@ -35,6 +35,12 @@ from app.modules.marketplace.models.letzshop import ( # Import jobs LetzshopHistoricalImportJob, ) +from app.modules.marketplace.models.onboarding import ( + OnboardingStatus, + OnboardingStep, + STEP_ORDER, + VendorOnboarding, +) __all__ = [ # Marketplace products @@ -51,4 +57,9 @@ __all__ = [ "LetzshopFulfillmentQueue", "LetzshopVendorCache", "LetzshopSyncLog", + # Onboarding + "OnboardingStatus", + "OnboardingStep", + "STEP_ORDER", + "VendorOnboarding", ] diff --git a/models/database/onboarding.py b/app/modules/marketplace/models/onboarding.py similarity index 96% rename from models/database/onboarding.py rename to app/modules/marketplace/models/onboarding.py index 4b708b01..b613eb9a 100644 --- a/models/database/onboarding.py +++ b/app/modules/marketplace/models/onboarding.py @@ -1,9 +1,15 @@ -# models/database/onboarding.py +# app/modules/marketplace/models/onboarding.py """ Vendor onboarding progress tracking. Tracks completion status of mandatory onboarding steps for new vendors. Onboarding must be completed before accessing the vendor dashboard. + +The onboarding flow guides vendors through Letzshop marketplace integration: +1. Company Profile setup +2. Letzshop API configuration +3. Product import from CSV feed +4. Historical order sync """ import enum @@ -23,8 +29,7 @@ from sqlalchemy.dialects.sqlite import JSON from sqlalchemy.orm import relationship from app.core.database import Base - -from .base import TimestampMixin +from models.database.base import TimestampMixin class OnboardingStep(str, enum.Enum): diff --git a/app/modules/marketplace/services/letzshop/credentials_service.py b/app/modules/marketplace/services/letzshop/credentials_service.py index 1528cb07..11858ef6 100644 --- a/app/modules/marketplace/services/letzshop/credentials_service.py +++ b/app/modules/marketplace/services/letzshop/credentials_service.py @@ -11,7 +11,7 @@ from datetime import UTC, datetime from sqlalchemy.orm import Session from app.utils.encryption import decrypt_value, encrypt_value, mask_api_key -from models.database.letzshop import VendorLetzshopCredentials +from app.modules.marketplace.models import VendorLetzshopCredentials from .client_service import LetzshopClient diff --git a/app/modules/marketplace/services/letzshop/order_service.py b/app/modules/marketplace/services/letzshop/order_service.py index e1b5f107..dd88973d 100644 --- a/app/modules/marketplace/services/letzshop/order_service.py +++ b/app/modules/marketplace/services/letzshop/order_service.py @@ -16,15 +16,15 @@ from sqlalchemy.orm import Session from app.services.order_service import order_service as unified_order_service from app.services.subscription_service import subscription_service -from models.database.letzshop import ( +from app.modules.marketplace.models import ( LetzshopFulfillmentQueue, LetzshopHistoricalImportJob, LetzshopSyncLog, + MarketplaceImportJob, VendorLetzshopCredentials, ) -from models.database.marketplace_import_job import MarketplaceImportJob from app.modules.orders.models import Order, OrderItem -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.vendor import Vendor logger = logging.getLogger(__name__) diff --git a/app/modules/marketplace/services/letzshop/vendor_sync_service.py b/app/modules/marketplace/services/letzshop/vendor_sync_service.py index 7fa963bb..beb1a6ea 100644 --- a/app/modules/marketplace/services/letzshop/vendor_sync_service.py +++ b/app/modules/marketplace/services/letzshop/vendor_sync_service.py @@ -15,7 +15,7 @@ from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlalchemy.orm import Session from app.services.letzshop.client_service import LetzshopClient -from models.database.letzshop import LetzshopVendorCache +from app.modules.marketplace.models import LetzshopVendorCache logger = logging.getLogger(__name__) diff --git a/app/modules/marketplace/services/letzshop_export_service.py b/app/modules/marketplace/services/letzshop_export_service.py index 5e4dee29..17cd8089 100644 --- a/app/modules/marketplace/services/letzshop_export_service.py +++ b/app/modules/marketplace/services/letzshop_export_service.py @@ -12,9 +12,8 @@ from datetime import UTC, datetime from sqlalchemy.orm import Session, joinedload -from models.database.letzshop import LetzshopSyncLog -from models.database.marketplace_product import MarketplaceProduct -from models.database.product import Product +from app.modules.marketplace.models import LetzshopSyncLog, MarketplaceProduct +from app.modules.catalog.models import Product logger = logging.getLogger(__name__) diff --git a/app/modules/marketplace/services/marketplace_import_job_service.py b/app/modules/marketplace/services/marketplace_import_job_service.py index a36973c2..26d1cf2c 100644 --- a/app/modules/marketplace/services/marketplace_import_job_service.py +++ b/app/modules/marketplace/services/marketplace_import_job_service.py @@ -8,7 +8,7 @@ from app.exceptions import ( ImportJobNotOwnedException, ValidationException, ) -from models.database.marketplace_import_job import ( +from app.modules.marketplace.models import ( MarketplaceImportError, MarketplaceImportJob, ) diff --git a/app/modules/marketplace/services/marketplace_product_service.py b/app/modules/marketplace/services/marketplace_product_service.py index f9034718..15f25699 100644 --- a/app/modules/marketplace/services/marketplace_product_service.py +++ b/app/modules/marketplace/services/marketplace_product_service.py @@ -31,8 +31,8 @@ from app.exceptions import ( ) from app.utils.data_processing import GTINProcessor, PriceProcessor from app.modules.inventory.models import Inventory -from models.database.marketplace_product import MarketplaceProduct -from models.database.marketplace_product_translation import ( +from app.modules.marketplace.models import ( + MarketplaceProduct, MarketplaceProductTranslation, ) from app.modules.inventory.schemas import InventoryLocationResponse, InventorySummaryResponse @@ -859,8 +859,8 @@ class MarketplaceProductService: Returns: Dict with copied, skipped, failed counts and details """ - from models.database.product import Product - from models.database.product_translation import ProductTranslation + from app.modules.catalog.models import Product + from app.modules.catalog.models import ProductTranslation from models.database.vendor import Vendor vendor = db.query(Vendor).filter(Vendor.id == vendor_id).first() diff --git a/app/modules/marketplace/tasks/import_tasks.py b/app/modules/marketplace/tasks/import_tasks.py index 042fa1c9..ddbff461 100644 --- a/app/modules/marketplace/tasks/import_tasks.py +++ b/app/modules/marketplace/tasks/import_tasks.py @@ -13,8 +13,7 @@ from datetime import UTC, datetime from typing import Callable from app.core.celery_config import celery_app -from models.database.marketplace_import_job import MarketplaceImportJob -from models.database.letzshop import LetzshopHistoricalImportJob +from app.modules.marketplace.models import MarketplaceImportJob, LetzshopHistoricalImportJob from app.services.admin_notification_service import admin_notification_service from app.services.letzshop import LetzshopClientError from app.services.letzshop.credentials_service import LetzshopCredentialsService diff --git a/app/modules/monitoring/services/background_tasks_service.py b/app/modules/monitoring/services/background_tasks_service.py index 525b8566..c8382652 100644 --- a/app/modules/monitoring/services/background_tasks_service.py +++ b/app/modules/monitoring/services/background_tasks_service.py @@ -10,7 +10,7 @@ from sqlalchemy import case, desc, func from sqlalchemy.orm import Session from models.database.architecture_scan import ArchitectureScan -from models.database.marketplace_import_job import MarketplaceImportJob +from app.modules.marketplace.models import MarketplaceImportJob from models.database.test_run import TestRun diff --git a/app/modules/orders/services/order_item_exception_service.py b/app/modules/orders/services/order_item_exception_service.py index ce99fb60..29c5a6c4 100644 --- a/app/modules/orders/services/order_item_exception_service.py +++ b/app/modules/orders/services/order_item_exception_service.py @@ -23,7 +23,7 @@ from app.exceptions import ( ) from app.modules.orders.models.order import Order, OrderItem from app.modules.orders.models.order_item_exception import OrderItemException -from models.database.product import Product +from app.modules.catalog.models import Product logger = logging.getLogger(__name__) diff --git a/app/modules/orders/services/order_service.py b/app/modules/orders/services/order_service.py index 838abbb9..24b68dbf 100644 --- a/app/modules/orders/services/order_service.py +++ b/app/modules/orders/services/order_service.py @@ -49,9 +49,8 @@ from app.utils.vat import ( calculate_vat_amount, determine_vat_regime, ) -from models.database.marketplace_product import MarketplaceProduct -from models.database.marketplace_product_translation import MarketplaceProductTranslation -from models.database.product import Product +from app.modules.marketplace.models import MarketplaceProduct, MarketplaceProductTranslation +from app.modules.catalog.models import Product from models.database.vendor import Vendor # Placeholder product constants diff --git a/app/services/admin_service.py b/app/services/admin_service.py index f016c4a5..d8c19f3f 100644 --- a/app/services/admin_service.py +++ b/app/services/admin_service.py @@ -33,7 +33,7 @@ from app.exceptions import ( from app.exceptions.auth import UserAlreadyExistsException from middleware.auth import AuthManager from models.database.company import Company -from models.database.marketplace_import_job import MarketplaceImportJob +from app.modules.marketplace.models import MarketplaceImportJob from models.database.platform import Platform from models.database.user import User from models.database.vendor import Role, Vendor diff --git a/app/services/capacity_forecast_service.py b/app/services/capacity_forecast_service.py index de380c37..4e59b56b 100644 --- a/app/services/capacity_forecast_service.py +++ b/app/services/capacity_forecast_service.py @@ -16,7 +16,7 @@ from decimal import Decimal from sqlalchemy import func from sqlalchemy.orm import Session -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.subscription import ( CapacitySnapshot, SubscriptionStatus, diff --git a/app/services/letzshop/credentials_service.py b/app/services/letzshop/credentials_service.py index 1528cb07..11858ef6 100644 --- a/app/services/letzshop/credentials_service.py +++ b/app/services/letzshop/credentials_service.py @@ -11,7 +11,7 @@ from datetime import UTC, datetime from sqlalchemy.orm import Session from app.utils.encryption import decrypt_value, encrypt_value, mask_api_key -from models.database.letzshop import VendorLetzshopCredentials +from app.modules.marketplace.models import VendorLetzshopCredentials from .client_service import LetzshopClient diff --git a/app/services/letzshop/order_service.py b/app/services/letzshop/order_service.py index e1b5f107..dd88973d 100644 --- a/app/services/letzshop/order_service.py +++ b/app/services/letzshop/order_service.py @@ -16,15 +16,15 @@ from sqlalchemy.orm import Session from app.services.order_service import order_service as unified_order_service from app.services.subscription_service import subscription_service -from models.database.letzshop import ( +from app.modules.marketplace.models import ( LetzshopFulfillmentQueue, LetzshopHistoricalImportJob, LetzshopSyncLog, + MarketplaceImportJob, VendorLetzshopCredentials, ) -from models.database.marketplace_import_job import MarketplaceImportJob from app.modules.orders.models import Order, OrderItem -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.vendor import Vendor logger = logging.getLogger(__name__) diff --git a/app/services/letzshop/vendor_sync_service.py b/app/services/letzshop/vendor_sync_service.py index 7fa963bb..beb1a6ea 100644 --- a/app/services/letzshop/vendor_sync_service.py +++ b/app/services/letzshop/vendor_sync_service.py @@ -15,7 +15,7 @@ from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlalchemy.orm import Session from app.services.letzshop.client_service import LetzshopClient -from models.database.letzshop import LetzshopVendorCache +from app.modules.marketplace.models import LetzshopVendorCache logger = logging.getLogger(__name__) diff --git a/app/services/onboarding_service.py b/app/services/onboarding_service.py index feadead4..0a59871d 100644 --- a/app/services/onboarding_service.py +++ b/app/services/onboarding_service.py @@ -24,7 +24,7 @@ from app.exceptions import ( ) from app.services.letzshop.credentials_service import LetzshopCredentialsService from app.services.letzshop.order_service import LetzshopOrderService -from models.database.onboarding import ( +from app.modules.marketplace.models import ( OnboardingStatus, OnboardingStep, VendorOnboarding, diff --git a/app/services/platform_health_service.py b/app/services/platform_health_service.py index 7216d6cf..64777ffd 100644 --- a/app/services/platform_health_service.py +++ b/app/services/platform_health_service.py @@ -19,7 +19,7 @@ from sqlalchemy.orm import Session from app.services.image_service import image_service from app.modules.inventory.models import Inventory from app.modules.orders.models import Order -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.vendor import Vendor logger = logging.getLogger(__name__) diff --git a/app/services/product_service.py b/app/services/product_service.py index e9a86d21..7e1d01fa 100644 --- a/app/services/product_service.py +++ b/app/services/product_service.py @@ -18,8 +18,8 @@ from app.exceptions import ( ProductNotFoundException, ValidationException, ) -from models.database.marketplace_product import MarketplaceProduct -from models.database.product import Product +from app.modules.marketplace.models import MarketplaceProduct +from app.modules.catalog.models import Product from models.schema.product import ProductCreate, ProductUpdate logger = logging.getLogger(__name__) @@ -272,7 +272,7 @@ class ProductService: from sqlalchemy import or_ from sqlalchemy.orm import joinedload - from models.database.product_translation import ProductTranslation + from app.modules.catalog.models import ProductTranslation try: # Prepare search pattern for LIKE queries diff --git a/app/services/vendor_product_service.py b/app/services/vendor_product_service.py index 2ee336f0..539d85bc 100644 --- a/app/services/vendor_product_service.py +++ b/app/services/vendor_product_service.py @@ -15,7 +15,7 @@ from sqlalchemy import func from sqlalchemy.orm import Session, joinedload from app.exceptions import ProductNotFoundException -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.vendor import Vendor logger = logging.getLogger(__name__) @@ -270,7 +270,7 @@ class VendorProductService: Returns: Created Product instance """ - from models.database.product_translation import ProductTranslation + from app.modules.catalog.models import ProductTranslation # Determine product_type from is_digital flag is_digital = data.get("is_digital", False) @@ -344,7 +344,7 @@ class VendorProductService: Returns: Updated Product instance """ - from models.database.product_translation import ProductTranslation + from app.modules.catalog.models import ProductTranslation product = ( db.query(Product) diff --git a/app/services/vendor_service.py b/app/services/vendor_service.py index 46c10dbf..f28037b9 100644 --- a/app/services/vendor_service.py +++ b/app/services/vendor_service.py @@ -23,8 +23,8 @@ from app.exceptions import ( VendorAlreadyExistsException, VendorNotFoundException, ) -from models.database.marketplace_product import MarketplaceProduct -from models.database.product import Product +from app.modules.marketplace.models import MarketplaceProduct +from app.modules.catalog.models import Product from models.database.user import User from models.database.vendor import Vendor from models.schema.product import ProductCreate diff --git a/app/tasks/background_tasks.py b/app/tasks/background_tasks.py index 700e1340..d5cc4aa0 100644 --- a/app/tasks/background_tasks.py +++ b/app/tasks/background_tasks.py @@ -7,7 +7,7 @@ from datetime import UTC, datetime from app.core.database import SessionLocal from app.services.admin_notification_service import admin_notification_service from app.utils.csv_processor import CSVProcessor -from models.database.marketplace_import_job import MarketplaceImportJob +from app.modules.marketplace.models import MarketplaceImportJob from models.database.vendor import Vendor logger = logging.getLogger(__name__) diff --git a/app/tasks/letzshop_tasks.py b/app/tasks/letzshop_tasks.py index 45ed7b10..1a508666 100644 --- a/app/tasks/letzshop_tasks.py +++ b/app/tasks/letzshop_tasks.py @@ -11,7 +11,7 @@ from app.services.letzshop import LetzshopClientError from app.services.letzshop.credentials_service import LetzshopCredentialsService from app.services.letzshop.order_service import LetzshopOrderService from app.services.letzshop.vendor_sync_service import LetzshopVendorSyncService -from models.database.letzshop import LetzshopHistoricalImportJob +from app.modules.marketplace.models import LetzshopHistoricalImportJob logger = logging.getLogger(__name__) diff --git a/app/utils/csv_processor.py b/app/utils/csv_processor.py index dc4f3083..f188f028 100644 --- a/app/utils/csv_processor.py +++ b/app/utils/csv_processor.py @@ -19,9 +19,9 @@ from sqlalchemy import literal from sqlalchemy.orm import Session from app.utils.money import euros_to_cents -from models.database.marketplace_import_job import MarketplaceImportError -from models.database.marketplace_product import MarketplaceProduct -from models.database.marketplace_product_translation import ( +from app.modules.marketplace.models import ( + MarketplaceImportError, + MarketplaceProduct, MarketplaceProductTranslation, ) diff --git a/models/__init__.py b/models/__init__.py index a4c6d20f..4f62f88e 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -6,14 +6,13 @@ from . import schema # Database models (SQLAlchemy) from .database.base import Base -from .database.marketplace_import_job import MarketplaceImportJob -from .database.marketplace_product import MarketplaceProduct -from .database.product import Product from .database.user import User from .database.vendor import Vendor # Module-based models from app.modules.inventory.models import Inventory +from app.modules.marketplace.models import MarketplaceImportJob, MarketplaceProduct +from app.modules.catalog.models import Product # Export database models for Alembic __all__ = [ diff --git a/models/database/__init__.py b/models/database/__init__.py index 8b738f05..bd23fd2f 100644 --- a/models/database/__init__.py +++ b/models/database/__init__.py @@ -57,13 +57,18 @@ from app.modules.orders.models import ( VATRegime, VendorInvoiceSettings, ) -from .letzshop import ( +from app.modules.marketplace.models import ( LetzshopFulfillmentQueue, LetzshopHistoricalImportJob, LetzshopSyncLog, VendorLetzshopCredentials, + MarketplaceImportError, + MarketplaceImportJob, + DigitalDeliveryMethod, + MarketplaceProduct, + ProductType, + MarketplaceProductTranslation, ) -from .marketplace_import_job import MarketplaceImportError, MarketplaceImportJob from app.modules.messaging.models import ( Conversation, ConversationParticipant, @@ -72,18 +77,11 @@ from app.modules.messaging.models import ( MessageAttachment, ParticipantType, ) -from .marketplace_product import ( - DigitalDeliveryMethod, - MarketplaceProduct, - ProductType, -) from .media import MediaFile, ProductMedia -from .marketplace_product_translation import MarketplaceProductTranslation -from .onboarding import OnboardingStatus, OnboardingStep, VendorOnboarding +from app.modules.marketplace.models import OnboardingStatus, OnboardingStep, VendorOnboarding from app.modules.orders.models import Order, OrderItem from app.modules.orders.models import OrderItemException -from .product import Product -from .product_translation import ProductTranslation +from app.modules.catalog.models import Product, ProductTranslation from .subscription import ( AddOnCategory, AddOnProduct, diff --git a/models/database/letzshop.py b/models/database/letzshop.py deleted file mode 100644 index cb49cf7e..00000000 --- a/models/database/letzshop.py +++ /dev/null @@ -1,34 +0,0 @@ -# models/database/letzshop.py -""" -Legacy location for Letzshop models. - -MIGRATED: Models have been moved to app.modules.marketplace.models.letzshop. - -New location: - from app.modules.marketplace.models import ( - VendorLetzshopCredentials, - LetzshopFulfillmentQueue, - LetzshopVendorCache, - LetzshopSyncLog, - LetzshopHistoricalImportJob, - ) - -This file re-exports from the new location for backward compatibility. -""" - -# Re-export from the new canonical location -from app.modules.marketplace.models.letzshop import ( - VendorLetzshopCredentials, - LetzshopFulfillmentQueue, - LetzshopVendorCache, - LetzshopSyncLog, - LetzshopHistoricalImportJob, -) - -__all__ = [ - "VendorLetzshopCredentials", - "LetzshopFulfillmentQueue", - "LetzshopVendorCache", - "LetzshopSyncLog", - "LetzshopHistoricalImportJob", -] diff --git a/models/database/marketplace.py b/models/database/marketplace.py deleted file mode 100644 index 5cae6517..00000000 --- a/models/database/marketplace.py +++ /dev/null @@ -1 +0,0 @@ -# MarketplaceImportJob model diff --git a/models/database/marketplace_import_job.py b/models/database/marketplace_import_job.py deleted file mode 100644 index a84f2c51..00000000 --- a/models/database/marketplace_import_job.py +++ /dev/null @@ -1,22 +0,0 @@ -# models/database/marketplace_import_job.py -""" -Legacy location for marketplace import job models. - -MIGRATED: Models have been moved to app.modules.marketplace.models.marketplace_import_job. - -New location: - from app.modules.marketplace.models import ( - MarketplaceImportJob, - MarketplaceImportError, - ) - -This file re-exports from the new location for backward compatibility. -""" - -# Re-export from the new canonical location -from app.modules.marketplace.models.marketplace_import_job import ( - MarketplaceImportJob, - MarketplaceImportError, -) - -__all__ = ["MarketplaceImportJob", "MarketplaceImportError"] diff --git a/models/database/marketplace_product.py b/models/database/marketplace_product.py deleted file mode 100644 index dacec6c2..00000000 --- a/models/database/marketplace_product.py +++ /dev/null @@ -1,28 +0,0 @@ -# models/database/marketplace_product.py -""" -Legacy location for marketplace product model. - -MIGRATED: All models have been moved to app.modules.marketplace.models.marketplace_product. - -New location: - from app.modules.marketplace.models import ( - MarketplaceProduct, - ProductType, - DigitalDeliveryMethod, - ) - -This file re-exports from the new location for backward compatibility. -""" - -# Re-export everything from the new canonical location -from app.modules.marketplace.models.marketplace_product import ( - MarketplaceProduct, - ProductType, - DigitalDeliveryMethod, -) - -__all__ = [ - "MarketplaceProduct", - "ProductType", - "DigitalDeliveryMethod", -] diff --git a/models/database/marketplace_product_translation.py b/models/database/marketplace_product_translation.py deleted file mode 100644 index d9a96fd4..00000000 --- a/models/database/marketplace_product_translation.py +++ /dev/null @@ -1,18 +0,0 @@ -# models/database/marketplace_product_translation.py -""" -Legacy location for marketplace product translation model. - -MIGRATED: Model has been moved to app.modules.marketplace.models.marketplace_product_translation. - -New location: - from app.modules.marketplace.models import MarketplaceProductTranslation - -This file re-exports from the new location for backward compatibility. -""" - -# Re-export from the new canonical location -from app.modules.marketplace.models.marketplace_product_translation import ( - MarketplaceProductTranslation, -) - -__all__ = ["MarketplaceProductTranslation"] diff --git a/scripts/debug_historical_import.py b/scripts/debug_historical_import.py index b01b177b..078a6cbf 100644 --- a/scripts/debug_historical_import.py +++ b/scripts/debug_historical_import.py @@ -6,7 +6,7 @@ sys.path.insert(0, ".") from app.core.database import SessionLocal from app.services.letzshop.credentials_service import LetzshopCredentialsService -from models.database.letzshop import LetzshopHistoricalImportJob +from app.modules.marketplace.models import LetzshopHistoricalImportJob def get_valid_shipment_states(vendor_id: int = 1): diff --git a/scripts/seed_demo.py b/scripts/seed_demo.py index 2eaaea9a..da9d92e0 100644 --- a/scripts/seed_demo.py +++ b/scripts/seed_demo.py @@ -55,13 +55,13 @@ from app.modules.cms.models import ContentPage from models.database.admin import PlatformAlert from models.database.company import Company from app.modules.customers.models.customer import Customer, CustomerAddress -from models.database.marketplace_import_job import MarketplaceImportJob -from models.database.marketplace_product import MarketplaceProduct -from models.database.marketplace_product_translation import ( +from app.modules.marketplace.models import ( + MarketplaceImportJob, + MarketplaceProduct, MarketplaceProductTranslation, ) from app.modules.orders.models import Order, OrderItem -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.user import User from models.database.vendor import Role, Vendor, VendorUser from models.database.vendor_domain import VendorDomain diff --git a/scripts/verify_setup.py b/scripts/verify_setup.py index 421ca519..e8cb60d9 100644 --- a/scripts/verify_setup.py +++ b/scripts/verify_setup.py @@ -144,9 +144,8 @@ def verify_model_structure(): # Import specific models from app.modules.inventory.models import Inventory - from models.database.marketplace_import_job import MarketplaceImportJob - from models.database.marketplace_product import MarketplaceProduct - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceImportJob, MarketplaceProduct + from app.modules.catalog.models import Product from models.database.user import User from models.database.vendor import Vendor diff --git a/tests/fixtures/marketplace_import_job_fixtures.py b/tests/fixtures/marketplace_import_job_fixtures.py index a6e49c4e..cae4b4a9 100644 --- a/tests/fixtures/marketplace_import_job_fixtures.py +++ b/tests/fixtures/marketplace_import_job_fixtures.py @@ -8,7 +8,7 @@ See tests/conftest.py for details on fixture best practices. import pytest -from models.database.marketplace_import_job import MarketplaceImportJob +from app.modules.marketplace.models import MarketplaceImportJob @pytest.fixture diff --git a/tests/fixtures/marketplace_product_fixtures.py b/tests/fixtures/marketplace_product_fixtures.py index 1e3d74cf..2958b654 100644 --- a/tests/fixtures/marketplace_product_fixtures.py +++ b/tests/fixtures/marketplace_product_fixtures.py @@ -13,8 +13,8 @@ import uuid import pytest -from models.database.marketplace_product import MarketplaceProduct -from models.database.marketplace_product_translation import ( +from app.modules.marketplace.models import ( + MarketplaceProduct, MarketplaceProductTranslation, ) diff --git a/tests/fixtures/vendor_fixtures.py b/tests/fixtures/vendor_fixtures.py index 8e1072d8..b1f7a5f7 100644 --- a/tests/fixtures/vendor_fixtures.py +++ b/tests/fixtures/vendor_fixtures.py @@ -12,7 +12,7 @@ import pytest from models.database.company import Company from app.modules.inventory.models import Inventory -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.vendor import Vendor diff --git a/tests/integration/api/v1/admin/test_letzshop.py b/tests/integration/api/v1/admin/test_letzshop.py index 42f64cf1..805354ad 100644 --- a/tests/integration/api/v1/admin/test_letzshop.py +++ b/tests/integration/api/v1/admin/test_letzshop.py @@ -41,7 +41,7 @@ class TestAdminLetzshopVendorsAPI: def test_list_vendors_configured_only(self, client, db, admin_headers, test_vendor): """Test listing only configured vendors.""" from app.utils.encryption import encrypt_value - from models.database.letzshop import VendorLetzshopCredentials + from app.modules.marketplace.models import VendorLetzshopCredentials # Configure credentials for test vendor credentials = VendorLetzshopCredentials( @@ -384,11 +384,9 @@ class TestAdminLetzshopExportAPI: self, client, db, admin_headers, test_vendor ): """Test exporting products with actual data.""" - from models.database.marketplace_product import MarketplaceProduct - from models.database.marketplace_product_translation import ( - MarketplaceProductTranslation, - ) - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProductTranslation + from app.modules.catalog.models import Product # Create marketplace product mp = MarketplaceProduct( @@ -438,11 +436,9 @@ class TestAdminLetzshopExportAPI: self, client, db, admin_headers, test_vendor ): """Test exporting products in French.""" - from models.database.marketplace_product import MarketplaceProduct - from models.database.marketplace_product_translation import ( - MarketplaceProductTranslation, - ) - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProductTranslation + from app.modules.catalog.models import Product mp = MarketplaceProduct( marketplace_product_id="EXPORT-FR-001", @@ -484,11 +480,9 @@ class TestAdminLetzshopExportAPI: self, client, db, admin_headers, test_vendor ): """Test exporting including inactive products.""" - from models.database.marketplace_product import MarketplaceProduct - from models.database.marketplace_product_translation import ( - MarketplaceProductTranslation, - ) - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProductTranslation + from app.modules.catalog.models import Product # Create inactive product mp = MarketplaceProduct( diff --git a/tests/integration/api/v1/vendor/test_dashboard.py b/tests/integration/api/v1/vendor/test_dashboard.py index c930b4f0..537fb825 100644 --- a/tests/integration/api/v1/vendor/test_dashboard.py +++ b/tests/integration/api/v1/vendor/test_dashboard.py @@ -67,8 +67,8 @@ class TestVendorDashboardAPI: """Test that dashboard stats only show data for the authenticated vendor""" import uuid - from models.database.marketplace_product import MarketplaceProduct - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.catalog.models import Product # Create products for the test vendor for i in range(3): @@ -195,8 +195,8 @@ class TestVendorDashboardAPI: """Test dashboard stats accuracy with actual products""" import uuid - from models.database.marketplace_product import MarketplaceProduct - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.catalog.models import Product # Create 5 different marketplace products marketplace_products = [] diff --git a/tests/integration/api/v1/vendor/test_inventory.py b/tests/integration/api/v1/vendor/test_inventory.py index a32a53ae..78e04a78 100644 --- a/tests/integration/api/v1/vendor/test_inventory.py +++ b/tests/integration/api/v1/vendor/test_inventory.py @@ -24,7 +24,7 @@ class TestVendorInventoryAPI: ): """Test setting inventory for a product.""" # Ensure test_product belongs to the vendor - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -56,7 +56,7 @@ class TestVendorInventoryAPI: db, ): """Test adjusting inventory quantity.""" - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -123,7 +123,7 @@ class TestVendorInventoryAPI: db, ): """Test getting inventory for a specific product.""" - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -155,7 +155,7 @@ class TestVendorInventoryAPI: db, ): """Test reserving inventory for an order.""" - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -198,7 +198,7 @@ class TestVendorInventoryAPI: db, ): """Test updating inventory record.""" - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -240,7 +240,7 @@ class TestVendorInventoryAPI: db, ): """Test deleting inventory record.""" - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id diff --git a/tests/integration/api/v1/vendor/test_letzshop.py b/tests/integration/api/v1/vendor/test_letzshop.py index 58da14fd..4ee4855a 100644 --- a/tests/integration/api/v1/vendor/test_letzshop.py +++ b/tests/integration/api/v1/vendor/test_letzshop.py @@ -642,11 +642,9 @@ class TestVendorLetzshopExportAPI: self, client, db, vendor_user_headers, test_vendor_with_vendor_user ): """Test exporting products with actual data.""" - from models.database.marketplace_product import MarketplaceProduct - from models.database.marketplace_product_translation import ( - MarketplaceProductTranslation, - ) - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProductTranslation + from app.modules.catalog.models import Product # Create marketplace product mp = MarketplaceProduct( @@ -695,11 +693,9 @@ class TestVendorLetzshopExportAPI: self, client, db, vendor_user_headers, test_vendor_with_vendor_user ): """Test exporting products in French.""" - from models.database.marketplace_product import MarketplaceProduct - from models.database.marketplace_product_translation import ( - MarketplaceProductTranslation, - ) - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProductTranslation + from app.modules.catalog.models import Product mp = MarketplaceProduct( marketplace_product_id="VENDOR-FR-001", @@ -741,11 +737,9 @@ class TestVendorLetzshopExportAPI: self, client, db, vendor_user_headers, test_vendor_with_vendor_user ): """Test exporting products in German.""" - from models.database.marketplace_product import MarketplaceProduct - from models.database.marketplace_product_translation import ( - MarketplaceProductTranslation, - ) - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProductTranslation + from app.modules.catalog.models import Product mp = MarketplaceProduct( marketplace_product_id="VENDOR-DE-001", @@ -785,11 +779,9 @@ class TestVendorLetzshopExportAPI: self, client, db, vendor_user_headers, test_vendor_with_vendor_user ): """Test exporting including inactive products.""" - from models.database.marketplace_product import MarketplaceProduct - from models.database.marketplace_product_translation import ( - MarketplaceProductTranslation, - ) - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProductTranslation + from app.modules.catalog.models import Product mp = MarketplaceProduct( marketplace_product_id="VENDOR-INACTIVE-001", diff --git a/tests/integration/api/v1/vendor/test_onboarding.py b/tests/integration/api/v1/vendor/test_onboarding.py index 5068a3c0..c7fde08f 100644 --- a/tests/integration/api/v1/vendor/test_onboarding.py +++ b/tests/integration/api/v1/vendor/test_onboarding.py @@ -14,7 +14,7 @@ Tests cover: import pytest -from models.database.onboarding import OnboardingStatus, OnboardingStep, VendorOnboarding +from app.modules.marketplace.models import OnboardingStatus, OnboardingStep, VendorOnboarding @pytest.mark.integration diff --git a/tests/integration/api/v1/vendor/test_products.py b/tests/integration/api/v1/vendor/test_products.py index e4856815..960e842c 100644 --- a/tests/integration/api/v1/vendor/test_products.py +++ b/tests/integration/api/v1/vendor/test_products.py @@ -50,7 +50,7 @@ class TestVendorProductsAPI: ): """Test adding product that already exists returns error.""" # Ensure test_product belongs to the vendor - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -140,7 +140,7 @@ class TestVendorProductsAPI: ): """Test getting product details.""" # Ensure test_product belongs to the vendor - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -174,7 +174,7 @@ class TestVendorProductsAPI: ): """Test updating product details.""" # Ensure test_product belongs to the vendor - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -206,7 +206,7 @@ class TestVendorProductsAPI: ): """Test toggling product active status.""" # Ensure test_product belongs to the vendor - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -232,7 +232,7 @@ class TestVendorProductsAPI: ): """Test toggling product featured status.""" # Ensure test_product belongs to the vendor - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id @@ -258,7 +258,7 @@ class TestVendorProductsAPI: ): """Test removing product from catalog.""" # Ensure test_product belongs to the vendor - from models.database.product import Product + from app.modules.catalog.models import Product product = db.query(Product).filter(Product.id == test_product.id).first() product.vendor_id = test_vendor_with_vendor_user.id diff --git a/tests/integration/tasks/test_background_tasks.py b/tests/integration/tasks/test_background_tasks.py index ee7a4b9b..90b8b07e 100644 --- a/tests/integration/tasks/test_background_tasks.py +++ b/tests/integration/tasks/test_background_tasks.py @@ -4,7 +4,7 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest from app.tasks.background_tasks import process_marketplace_import -from models.database.marketplace_import_job import MarketplaceImportJob +from app.modules.marketplace.models import MarketplaceImportJob @pytest.mark.integration diff --git a/tests/integration/tasks/test_letzshop_tasks.py b/tests/integration/tasks/test_letzshop_tasks.py index 5aba23c2..f87fdbb8 100644 --- a/tests/integration/tasks/test_letzshop_tasks.py +++ b/tests/integration/tasks/test_letzshop_tasks.py @@ -8,7 +8,7 @@ import pytest from app.services.letzshop import LetzshopClientError from app.tasks.letzshop_tasks import process_historical_import -from models.database.letzshop import LetzshopHistoricalImportJob +from app.modules.marketplace.models import LetzshopHistoricalImportJob @pytest.fixture diff --git a/tests/performance/test_api_performance.py b/tests/performance/test_api_performance.py index 4e0dd7ef..5c5af94c 100644 --- a/tests/performance/test_api_performance.py +++ b/tests/performance/test_api_performance.py @@ -9,8 +9,8 @@ import time import pytest -from models.database.marketplace_product import MarketplaceProduct -from models.database.marketplace_product_translation import ( +from app.modules.marketplace.models import ( + MarketplaceProduct, MarketplaceProductTranslation, ) diff --git a/tests/unit/models/database/test_marketplace_import_job.py b/tests/unit/models/database/test_marketplace_import_job.py index b718bd09..7cc4281f 100644 --- a/tests/unit/models/database/test_marketplace_import_job.py +++ b/tests/unit/models/database/test_marketplace_import_job.py @@ -3,7 +3,7 @@ import pytest -from models.database.marketplace_import_job import MarketplaceImportJob +from app.modules.marketplace.models import MarketplaceImportJob @pytest.mark.unit diff --git a/tests/unit/models/database/test_marketplace_product.py b/tests/unit/models/database/test_marketplace_product.py index 26275cf9..6d29b44b 100644 --- a/tests/unit/models/database/test_marketplace_product.py +++ b/tests/unit/models/database/test_marketplace_product.py @@ -4,8 +4,8 @@ import pytest from sqlalchemy.exc import IntegrityError -from models.database.marketplace_product import MarketplaceProduct -from models.database.marketplace_product_translation import ( +from app.modules.marketplace.models import ( + MarketplaceProduct, MarketplaceProductTranslation, ) diff --git a/tests/unit/models/database/test_product.py b/tests/unit/models/database/test_product.py index 09f260df..cf0a66c8 100644 --- a/tests/unit/models/database/test_product.py +++ b/tests/unit/models/database/test_product.py @@ -4,7 +4,7 @@ import pytest from sqlalchemy.exc import IntegrityError -from models.database.product import Product +from app.modules.catalog.models import Product @pytest.mark.unit diff --git a/tests/unit/services/test_inventory_service.py b/tests/unit/services/test_inventory_service.py index 8d2d9fab..a6669168 100644 --- a/tests/unit/services/test_inventory_service.py +++ b/tests/unit/services/test_inventory_service.py @@ -363,11 +363,9 @@ class TestInventoryService: def test_get_product_inventory_no_inventory(self, db, test_product, test_vendor): """Test getting inventory for product with no inventory entries.""" # Create a new product without inventory - from models.database.marketplace_product import MarketplaceProduct - from models.database.marketplace_product_translation import ( - MarketplaceProductTranslation, - ) - from models.database.product import Product + from app.modules.marketplace.models import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProductTranslation + from app.modules.catalog.models import Product unique_id = str(uuid.uuid4())[:8] mp = MarketplaceProduct( diff --git a/tests/unit/services/test_marketplace_product_service.py b/tests/unit/services/test_marketplace_product_service.py index 4d49404d..5d602c4a 100644 --- a/tests/unit/services/test_marketplace_product_service.py +++ b/tests/unit/services/test_marketplace_product_service.py @@ -26,8 +26,8 @@ from app.services.marketplace_product_service import ( MarketplaceProductService, marketplace_product_service, ) -from models.database.marketplace_product import MarketplaceProduct -from models.database.marketplace_product_translation import ( +from app.modules.marketplace.models import ( + MarketplaceProduct, MarketplaceProductTranslation, ) from models.schema.marketplace_product import ( diff --git a/tests/unit/services/test_marketplace_service.py b/tests/unit/services/test_marketplace_service.py index 902e872b..ed7730ee 100644 --- a/tests/unit/services/test_marketplace_service.py +++ b/tests/unit/services/test_marketplace_service.py @@ -12,7 +12,7 @@ from app.exceptions.marketplace_import_job import ( ) from app.exceptions.vendor import UnauthorizedVendorAccessException from app.services.marketplace_import_job_service import MarketplaceImportJobService -from models.database.marketplace_import_job import MarketplaceImportJob +from app.modules.marketplace.models import MarketplaceImportJob from models.schema.marketplace_import_job import MarketplaceImportJobRequest @@ -283,7 +283,7 @@ class TestMarketplaceImportJobService: self, db, test_marketplace_import_job, test_vendor ): """Test converting database model to response model.""" - from models.database.marketplace_import_job import MarketplaceImportJob as MIJ + from app.modules.marketplace.models import MarketplaceImportJob as MIJ # Re-query to get fresh instance with relationships job = db.query(MIJ).filter(MIJ.id == test_marketplace_import_job.id).first() diff --git a/tests/unit/services/test_onboarding_service.py b/tests/unit/services/test_onboarding_service.py index 3ea62eed..8dc05502 100644 --- a/tests/unit/services/test_onboarding_service.py +++ b/tests/unit/services/test_onboarding_service.py @@ -16,7 +16,7 @@ from unittest.mock import MagicMock, patch import pytest from app.services.onboarding_service import OnboardingService -from models.database.onboarding import OnboardingStatus, OnboardingStep, VendorOnboarding +from app.modules.marketplace.models import OnboardingStatus, OnboardingStep, VendorOnboarding @pytest.mark.unit diff --git a/tests/unit/services/test_stats_service.py b/tests/unit/services/test_stats_service.py index 59d31487..881f82cf 100644 --- a/tests/unit/services/test_stats_service.py +++ b/tests/unit/services/test_stats_service.py @@ -10,8 +10,8 @@ from sqlalchemy.exc import SQLAlchemyError from app.exceptions import AdminOperationException, VendorNotFoundException from app.services.stats_service import StatsService from app.modules.inventory.models import Inventory -from models.database.marketplace_product import MarketplaceProduct -from models.database.marketplace_product_translation import ( +from app.modules.marketplace.models import ( + MarketplaceProduct, MarketplaceProductTranslation, ) diff --git a/tests/unit/services/test_usage_service.py b/tests/unit/services/test_usage_service.py index 754765d9..cf20eee1 100644 --- a/tests/unit/services/test_usage_service.py +++ b/tests/unit/services/test_usage_service.py @@ -4,7 +4,7 @@ import pytest from app.services.usage_service import UsageService, usage_service -from models.database.product import Product +from app.modules.catalog.models import Product from models.database.subscription import SubscriptionTier, VendorSubscription from models.database.vendor import VendorUser diff --git a/tests/unit/services/test_vendor_service.py b/tests/unit/services/test_vendor_service.py index eff85b5a..738482ef 100644 --- a/tests/unit/services/test_vendor_service.py +++ b/tests/unit/services/test_vendor_service.py @@ -358,7 +358,7 @@ class TestVendorService: def test_add_product_to_vendor_success(self, db, test_vendor, unique_product): """Test successfully adding product to vendor.""" - from models.database.marketplace_product import MarketplaceProduct + from app.modules.marketplace.models import MarketplaceProduct # Re-query objects to avoid session issues vendor = db.query(Vendor).filter(Vendor.id == test_vendor.id).first() @@ -398,7 +398,7 @@ class TestVendorService: def test_add_product_to_vendor_already_exists(self, db, test_vendor, test_product): """Test adding product that's already in vendor fails.""" # Re-query to get fresh instances - from models.database.product import Product + from app.modules.catalog.models import Product vendor = db.query(Vendor).filter(Vendor.id == test_vendor.id).first() product = db.query(Product).filter(Product.id == test_product.id).first() diff --git a/tests/unit/utils/test_csv_processor.py b/tests/unit/utils/test_csv_processor.py index e51d87a6..296acf13 100644 --- a/tests/unit/utils/test_csv_processor.py +++ b/tests/unit/utils/test_csv_processor.py @@ -9,7 +9,7 @@ import requests import requests.exceptions from app.utils.csv_processor import CSVProcessor -from models.database.marketplace_product import MarketplaceProduct +from app.modules.marketplace.models import MarketplaceProduct @pytest.mark.unit