Templates Migration: - Migrate admin templates to modules (tenancy, billing, monitoring, marketplace, etc.) - Migrate vendor templates to modules (tenancy, billing, orders, messaging, etc.) - Migrate storefront templates to modules (catalog, customers, orders, cart, checkout, cms) - Migrate public templates to modules (billing, marketplace, cms) - Keep shared templates in app/templates/ (base.html, errors/, partials/, macros/) - Migrate letzshop partials to marketplace module Static Files Migration: - Migrate admin JS to modules: tenancy (23 files), core (5 files), monitoring (1 file) - Migrate vendor JS to modules: tenancy (4 files), core (2 files) - Migrate shared JS: vendor-selector.js to core, media-picker.js to cms - Migrate storefront JS: storefront-layout.js to core - Keep framework JS in static/ (api-client, utils, money, icons, log-config, lib/) - Update all template references to use module_static paths Naming Consistency: - Rename static/platform/ to static/public/ - Rename app/templates/platform/ to app/templates/public/ - Update all extends and static references Documentation: - Update module-system.md with shared templates documentation - Update frontend-structure.md with new module JS organization Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
21 KiB
Module Migration Plan
Status: In Progress Started: 2026-01-25 Last Updated: 2026-01-28 Target: v1.0.0
This is the unified migration plan for transforming Wizamart into a fully modular architecture.
Executive Summary
Transform the platform from a monolithic structure to self-contained modules where each module owns its:
- Services (business logic)
- Models (database entities)
- Schemas (Pydantic DTOs)
- Tasks (Celery background jobs)
- Templates (UI if applicable)
- Migrations (database changes)
Current State Assessment
Module Migration Status
| Module | Classification | Current State | Services | Models | Tasks | Target |
|---|---|---|---|---|---|---|
cms |
Core | ✅ Complete | ✅ | ✅ | - | Done |
payments |
Optional | 🟡 Partial | ✅ | ✅ | - | Done |
billing |
Optional | ✅ Complete | ✅ | ✅ | ✅ | Done |
marketplace |
Optional | ✅ Complete | ✅ | ✅ | ✅ | Done |
orders |
Optional | ✅ Complete | ✅ | ✅ | - | Done |
inventory |
Optional | ✅ Complete | ✅ | ✅ | - | Done |
customers |
Core | ✅ Complete | ✅ | ✅ | - | Done |
analytics |
Optional | ✅ Complete | ✅ | - | - | Done |
messaging |
Optional | ✅ Complete | ✅ | ✅ | - | Done |
monitoring |
Internal | ✅ Complete | ✅ | ✅ | - | Done |
dev-tools |
Internal | ✅ Complete | ✅ | ✅ | ✅ | Done |
tenancy |
Core | 🔴 Shell | ❌ | ❌ | - | Full |
core |
Core | 🔴 Shell | ❌ | ❌ | - | Minimal |
Current Code Locations (To Be Migrated)
app/services/ # → Move to respective modules
├── subscription_service.py # → billing/services/
├── stripe_service.py # → billing/services/ (or payments)
├── customer_service.py # → customers/services/
├── order_service.py # → orders/services/
├── inventory_service.py # → inventory/services/
├── letzshop_service.py # → marketplace/services/
├── marketplace_import_service.py # → marketplace/services/
├── messaging_service.py # → messaging/services/
└── ...
models/database/ # → Move to respective modules
├── subscription.py # → billing/models/
├── customer.py # → customers/models/
├── order.py # → orders/models/
├── inventory.py # → inventory/models/
├── letzshop_*.py # → marketplace/models/
└── ...
app/tasks/celery_tasks/ # → Move to respective modules
├── subscription.py # → billing/tasks/
├── marketplace.py # → marketplace/tasks/
├── letzshop.py # → marketplace/tasks/
├── export.py # → marketplace/tasks/
├── code_quality.py # → dev_tools/tasks/
└── test_runner.py # → dev_tools/tasks/
Celery Task Mapping
| Current Task | Current Location | Target Module |
|---|---|---|
reset_period_counters |
subscription.py | billing |
check_trial_expirations |
subscription.py | billing |
sync_stripe_status |
subscription.py | billing |
cleanup_stale_subscriptions |
subscription.py | billing |
capture_capacity_snapshot |
subscription.py | monitoring |
process_marketplace_import |
marketplace.py | marketplace |
process_historical_import |
letzshop.py | marketplace |
sync_vendor_directory |
letzshop.py | marketplace |
export_vendor_products_to_folder |
export.py | marketplace |
export_marketplace_products |
export.py | marketplace |
execute_code_quality_scan |
code_quality.py | dev-tools |
execute_test_run |
test_runner.py | dev-tools |
Infrastructure Work (Completed)
✅ Phase 1: Module Classification
- Three-tier system: Core, Optional, Internal
- Renamed
platform-admin→tenancy - Module registry with CORE_MODULES, OPTIONAL_MODULES, INTERNAL_MODULES
✅ Phase 2: Module Infrastructure
ModuleDefinitionwith lifecycle hooks- Module events system (
events.py) - Module migration discovery (
migrations.py) - Observability framework (
observability.py)
✅ Phase 3: Documentation
- Module system architecture docs
- Menu management docs
- Observability docs
- Creating modules developer guide
✅ Phase 4: Celery Task Infrastructure
- Added
ScheduledTaskdataclass toModuleDefinition - Added
tasks_pathandscheduled_tasksfields - Created
app/modules/task_base.pywithModuleTaskbase class - Created
app/modules/tasks.pywith discovery utilities - Updated
celery_config.pyto use module discovery
✅ Phase 5: Billing Module Migration
- Created
app/modules/billing/services/with subscription, stripe, admin services - Created
app/modules/billing/models/re-exporting from central location - Created
app/modules/billing/schemas/re-exporting from central location - Created
app/modules/billing/tasks/with 4 scheduled tasks - Created
app/modules/billing/exceptions.py - Updated
definition.pywith self-contained configuration - Created backward-compatible re-exports in
app/services/ - Updated legacy celery_config.py to not duplicate scheduled tasks
✅ Phase 6: Marketplace Module Migration
- Created
app/modules/marketplace/services/re-exporting from existing locations - Created
app/modules/marketplace/models/re-exporting marketplace & letzshop models - Created
app/modules/marketplace/schemas/re-exporting marketplace schemas - Created
app/modules/marketplace/tasks/with:import_tasks.py- process_marketplace_import, process_historical_importsync_tasks.py- sync_vendor_directory (scheduled daily)export_tasks.py- export_vendor_products_to_folder, export_marketplace_products
- Created
app/modules/marketplace/exceptions.py - Updated
definition.pywith self-contained configuration - Updated legacy task files to re-export from new location
- Removed marketplace/letzshop/export from LEGACY_TASK_MODULES
✅ Phase 7: Dev-Tools Module Migration
- Created
app/modules/dev_tools/models/with:architecture_scan.py- ArchitectureScan, ArchitectureViolation, ArchitectureRule, etc.test_run.py- TestRun, TestResult, TestCollection
- Created
app/modules/dev_tools/services/re-exporting code_quality_service, test_runner_service - Created
app/modules/dev_tools/schemas/(placeholder for future schemas) - Created
app/modules/dev_tools/tasks/with:code_quality.py- execute_code_quality_scantest_runner.py- execute_test_run
- Created
app/modules/dev_tools/exceptions.pywith test runner exceptions - Created
app/modules/dev_tools/routes/api/with admin router - Updated
definition.pywith self-contained configuration - Updated legacy model files to re-export from module location
- Updated legacy task files to re-export from module location
- Used lazy imports in
__init__.pyto avoid circular import issues
✅ Phase 8: Monitoring Module Migration
- Created
app/modules/monitoring/models/re-exporting CapacitySnapshot, AdminNotification - Created
app/modules/monitoring/services/re-exporting BackgroundTasksService - Created
app/modules/monitoring/schemas/(placeholder) - Created
app/modules/monitoring/exceptions.pywith monitoring-specific exceptions - Updated
definition.pywith self-contained configuration - Used lazy imports in
__init__.pyto avoid circular import issues
✅ Phase 9: Customers Module Migration
- Created
app/modules/customers/models/re-exporting Customer, CustomerAddress, PasswordResetToken - Created
app/modules/customers/services/re-exporting customer services - Created
app/modules/customers/schemas/re-exporting customer schemas - Created
app/modules/customers/exceptions.pyre-exporting customer exceptions - Updated
definition.pywith self-contained configuration - Used lazy imports in
__init__.pyto avoid circular import issues
✅ Phase 10: Orders Module Migration
- Created
app/modules/orders/models/re-exporting Order, OrderItem, Invoice, etc. - Created
app/modules/orders/services/re-exporting order and invoice services - Created
app/modules/orders/schemas/re-exporting order and invoice schemas - Created
app/modules/orders/exceptions.pyre-exporting order exceptions - Updated
definition.pywith self-contained configuration - Used lazy imports in
__init__.pyto avoid circular import issues
✅ Phase 11: Inventory Module Migration
- Created
app/modules/inventory/models/re-exporting Inventory, InventoryTransaction - Created
app/modules/inventory/services/re-exporting inventory services - Created
app/modules/inventory/schemas/re-exporting inventory schemas - Created
app/modules/inventory/exceptions.pyre-exporting inventory exceptions - Updated
definition.pywith self-contained configuration - Used lazy imports in
__init__.pyto avoid circular import issues
✅ Phase 12: Analytics & Messaging Module Migration
-
Analytics Module:
- Created
app/modules/analytics/models/(empty - uses data from other modules) - Created
app/modules/analytics/services/re-exporting StatsService, UsageService - Created
app/modules/analytics/schemas/re-exporting stats schemas - Created
app/modules/analytics/exceptions.pywith reporting exceptions - Updated
definition.pywith self-contained configuration
- Created
-
Messaging Module:
- Created
app/modules/messaging/models/re-exporting Conversation, Message, etc. - Created
app/modules/messaging/services/re-exporting messaging services - Created
app/modules/messaging/schemas/re-exporting messaging schemas - Created
app/modules/messaging/exceptions.pyre-exporting message exceptions - Updated
definition.pywith self-contained configuration
- Created
Module Migration Phases
Each module migration includes: services, models, schemas, tasks, templates (if any).
Phase 5: Billing Module (High Priority)
Why first: Has most Celery tasks, critical business logic.
Components to Move
| From | To | Type |
|---|---|---|
app/services/subscription_service.py |
app/modules/billing/services/ |
Service |
app/services/stripe_service.py |
app/modules/billing/services/ |
Service |
models/database/subscription.py |
app/modules/billing/models/ |
Model |
models/database/subscription_tier.py |
app/modules/billing/models/ |
Model |
models/schema/subscription.py |
app/modules/billing/schemas/ |
Schema |
app/tasks/celery_tasks/subscription.py |
app/modules/billing/tasks/ |
Tasks |
Target Structure
app/modules/billing/
├── __init__.py
├── definition.py # Update with tasks_path, scheduled_tasks
├── config.py # BillingConfig schema
├── exceptions.py # BillingException, SubscriptionError, etc.
├── services/
│ ├── __init__.py
│ ├── subscription_service.py
│ └── stripe_service.py
├── models/
│ ├── __init__.py
│ ├── subscription.py
│ └── subscription_tier.py
├── schemas/
│ ├── __init__.py
│ └── subscription.py
├── tasks/
│ ├── __init__.py
│ └── subscription.py # 4 scheduled tasks
├── routes/
│ ├── admin.py
│ └── vendor.py
└── migrations/
└── versions/
Tasks
| Task | Schedule | Queue |
|---|---|---|
reset_period_counters |
Daily 00:05 | scheduled |
check_trial_expirations |
Daily 01:00 | scheduled |
sync_stripe_status |
Hourly :30 | scheduled |
cleanup_stale_subscriptions |
Weekly Sun 03:00 | scheduled |
Migration Checklist
- Create
billing/services/directory - Move
subscription_service.py→ update imports - Move
stripe_service.py→ update imports - Create
billing/models/directory - Move subscription models → update imports
- Create
billing/schemas/directory - Move subscription schemas → update imports
- Create
billing/tasks/directory - Move subscription tasks → update task paths
- Create
billing/exceptions.py - Update
definition.pywithtasks_path,scheduled_tasks - Create module migrations
- Update all imports across codebase
- Test subscription flows
- Test scheduled tasks
Phase 6: Marketplace Module (High Priority)
Why second: Has most tasks, complex import logic.
Components to Move
| From | To | Type |
|---|---|---|
app/services/letzshop_service.py |
app/modules/marketplace/services/ |
Service |
app/services/marketplace_import_service.py |
app/modules/marketplace/services/ |
Service |
app/services/letzshop_credentials_service.py |
app/modules/marketplace/services/ |
Service |
models/database/letzshop_*.py |
app/modules/marketplace/models/ |
Models |
models/database/marketplace_import_job.py |
app/modules/marketplace/models/ |
Model |
app/tasks/celery_tasks/marketplace.py |
app/modules/marketplace/tasks/ |
Tasks |
app/tasks/celery_tasks/letzshop.py |
app/modules/marketplace/tasks/ |
Tasks |
app/tasks/celery_tasks/export.py |
app/modules/marketplace/tasks/ |
Tasks |
Target Structure
app/modules/marketplace/
├── __init__.py
├── definition.py
├── exceptions.py
├── services/
│ ├── __init__.py
│ ├── letzshop_service.py
│ ├── letzshop_credentials_service.py
│ ├── import_service.py
│ └── export_service.py
├── models/
│ ├── __init__.py
│ ├── letzshop_order.py
│ ├── letzshop_credentials.py
│ └── import_job.py
├── schemas/
│ └── ...
├── tasks/
│ ├── __init__.py
│ ├── import_tasks.py # process_marketplace_import
│ ├── letzshop.py # process_historical_import, sync_vendor_directory
│ └── export.py # export tasks
└── routes/
Tasks
| Task | Type | Queue |
|---|---|---|
process_marketplace_import |
On-demand | long_running |
process_historical_import |
On-demand | long_running |
sync_vendor_directory |
Scheduled (optional) | long_running |
export_vendor_products_to_folder |
On-demand | default |
export_marketplace_products |
On-demand | default |
Phase 7: Dev-Tools Module (Medium Priority)
Why: Internal module with code quality and test runner tasks.
Components to Move
| From | To | Type |
|---|---|---|
app/services/code_quality_service.py |
app/modules/dev_tools/services/ |
Service |
app/services/test_runner_service.py |
app/modules/dev_tools/services/ |
Service |
models/database/architecture_scan.py |
app/modules/dev_tools/models/ |
Model |
models/database/test_run.py |
app/modules/dev_tools/models/ |
Model |
app/tasks/celery_tasks/code_quality.py |
app/modules/dev_tools/tasks/ |
Tasks |
app/tasks/celery_tasks/test_runner.py |
app/modules/dev_tools/tasks/ |
Tasks |
Target Structure
app/modules/dev_tools/
├── __init__.py
├── definition.py
├── services/
│ ├── code_quality_service.py
│ └── test_runner_service.py
├── models/
│ ├── architecture_scan.py
│ ├── architecture_violation.py
│ └── test_run.py
├── tasks/
│ ├── code_quality.py
│ └── test_runner.py
└── routes/
Phase 8: Monitoring Module (Medium Priority)
Components to Move
| From | To | Type |
|---|---|---|
app/services/background_tasks_service.py |
app/modules/monitoring/services/ |
Service |
capture_capacity_snapshot task |
app/modules/monitoring/tasks/ |
Task |
models/database/capacity_snapshot.py |
app/modules/monitoring/models/ |
Model |
Target Structure
app/modules/monitoring/
├── __init__.py
├── definition.py
├── services/
│ └── background_tasks_service.py
├── models/
│ └── capacity_snapshot.py
├── tasks/
│ └── capacity.py # capture_capacity_snapshot
└── routes/
Phase 9: Customers Module (Core)
Components to Move
| From | To |
|---|---|
app/services/customer_service.py |
app/modules/customers/services/ |
models/database/customer.py |
app/modules/customers/models/ |
| Customer-related schemas | app/modules/customers/schemas/ |
Phase 10: Orders Module
Components to Move
| From | To |
|---|---|
app/services/order_service.py |
app/modules/orders/services/ |
models/database/order.py |
app/modules/orders/models/ |
| Order-related schemas | app/modules/orders/schemas/ |
Phase 11: Inventory Module
Components to Move
| From | To |
|---|---|
app/services/inventory_service.py |
app/modules/inventory/services/ |
models/database/inventory*.py |
app/modules/inventory/models/ |
Phase 12: Remaining Modules
- Analytics - Move analytics services
- Messaging - Move messaging service, notification models
- Tenancy - Move platform, company, vendor services
Phase 13: Cleanup & Full Celery Migration
After all modules are migrated:
13.1 Remove Fallback Tasks
Delete:
app/tasks/background_tasks.py
app/tasks/letzshop_tasks.py
app/tasks/subscription_tasks.py
app/tasks/code_quality_tasks.py
app/tasks/test_runner_tasks.py
13.2 Remove USE_CELERY Flag
# app/core/config.py
# DELETE: USE_CELERY: bool = False
13.3 Simplify Dispatcher
Rewrite app/tasks/dispatcher.py to Celery-only.
13.4 Delete Old Task Directory
app/tasks/celery_tasks/ # DELETE - moved to modules
13.5 Clean Up Old Services/Models
Remove files from:
app/services/(moved to modules)models/database/(moved to modules)
Leave re-exports for backward compatibility if needed.
Queue Configuration
Final Queue Structure
| Queue | Purpose | Modules |
|---|---|---|
default |
Fast tasks | marketplace (exports) |
long_running |
CPU-intensive | marketplace (imports), dev-tools |
scheduled |
Celery Beat | billing, monitoring |
Task Routing
task_routes = {
"app.modules.billing.tasks.*": {"queue": "scheduled"},
"app.modules.marketplace.tasks.import_tasks.*": {"queue": "long_running"},
"app.modules.marketplace.tasks.letzshop.*": {"queue": "long_running"},
"app.modules.marketplace.tasks.export.*": {"queue": "default"},
"app.modules.monitoring.tasks.*": {"queue": "scheduled"},
"app.modules.dev_tools.tasks.*": {"queue": "long_running"},
}
Migration Strategy
For Each Module
- Create directory structure
- Move models first (fewest dependencies)
- Move services (depend on models)
- Move schemas (depend on models)
- Move tasks (depend on services)
- Update all imports across codebase
- Create re-exports in old locations (temporary)
- Test thoroughly
- Remove re-exports in next phase
Import Update Strategy
Use IDE refactoring or script:
# Example: Update subscription_service imports
find . -name "*.py" -exec sed -i 's/from app.services.subscription_service/from app.modules.billing.services.subscription_service/g' {} \;
Verification Checklist
Per-Module Verification
- Module directory has all components
- All imports updated
- Services work
- API routes work
- Tasks execute correctly
- Scheduled tasks run (Celery Beat)
- No circular imports
- Tests pass
Final Verification
- All 12 tasks in modules
USE_CELERYflag removed- Fallback tasks deleted
- Old service files removed
- Old model files removed
- All tests pass
- Production smoke test
Priority Order
| Priority | Phase | Module | Reason |
|---|---|---|---|
| 1 | 4 | Infrastructure | Required for task migration |
| 2 | 5 | billing |
Most tasks, critical business logic |
| 3 | 6 | marketplace |
Most complex, many tasks |
| 4 | 7 | dev-tools |
Internal, low risk |
| 5 | 8 | monitoring |
Internal, low risk |
| 6 | 9-12 | Others | Lower complexity |
| 7 | 13 | Cleanup | Final step |
Estimated Effort
| Phase | Sessions | Notes |
|---|---|---|
| 4 (Infrastructure) | 1 | Task base class, discovery |
| 5 (Billing) | 2-3 | Complex, many components |
| 6 (Marketplace) | 3-4 | Most complex module |
| 7-8 (Internal) | 1-2 | Simpler modules |
| 9-12 (Others) | 4-6 | Medium complexity each |
| 13 (Cleanup) | 1 | Removing old code |
Total: ~12-17 sessions
Rollback Plan
Each phase can be rolled back independently:
- Restore moved files to original locations
- Revert import changes
- Restore celery_config.py
No database schema changes during code migration = no DB rollback needed.