diff --git a/DOCUMENTATION_MIGRATION_COMPLETE.md b/DOCUMENTATION_MIGRATION_COMPLETE.md deleted file mode 100644 index 6751d3ff..00000000 --- a/DOCUMENTATION_MIGRATION_COMPLETE.md +++ /dev/null @@ -1,234 +0,0 @@ -# Documentation Migration - COMPLETE ✅ - -**Date:** November 17, 2025 -**Status:** ALL CRITICAL CONTENT MIGRATED -**Action:** `docs/__REVAMPING/` folder can now be safely deleted - ---- - -## Summary - -All critical documentation has been successfully migrated from `docs/__REVAMPING/` to the main documentation structure. The documentation is now fully organized, branded as Wizamart, and ready for use. - ---- - -## ✅ What Was Migrated - -### 1. Letzshop → Wizamart Branding Fixed -- ✅ `mkdocs.yml` - All branding updated -- ✅ `docs/development/environment-detection.md` - All references updated -- ✅ `docs/index.md` - Already updated -- ✅ Copyright updated to 2024-2025 - -### 2. Frontend Documentation (13 files) -**Location:** `docs/frontend/` - -- ✅ `overview.md` - Complete frontend architecture overview -- ✅ `shared/` - 6 files (UI components, pagination, sidebar, logging) -- ✅ `admin/` - 2 files (architecture, page templates) -- ✅ `vendor/` - 2 files (architecture, page templates) -- ✅ `shop/` - 2 files (architecture, page templates) - -### 3. Backend Documentation (2 files) -**Location:** `docs/backend/` - -- ✅ `admin-integration-guide.md` -- ✅ `admin-feature-integration.md` - -### 4. API Documentation & Diagrams (4 files) -**Location:** `docs/api/` - -- ✅ `authentication-flow-diagrams.md` ← Visual flow diagrams -- ✅ `rbac-visual-guide.md` ← RBAC visual diagrams - -### 5. Architecture Documentation & Diagrams (7 files) -**Location:** `docs/architecture/` - -**Diagrams:** -- ✅ `diagrams/multitenant-diagrams.md` -- ✅ `diagrams/vendor-domain-diagrams.md` - -**Theme System:** -- ✅ `theme-system/overview.md` -- ✅ `theme-system/presets.md` - -**URL Routing:** -- ✅ `url-routing/overview.md` - -### 6. Development Documentation (8 files) -**Location:** `docs/development/` - -- ✅ `environment-detection.md` (with all Letzshop→Wizamart fixes) - -**Database Seeder:** -- ✅ `database-seeder/DATABASE_SEEDER_DOCUMENTATION.md` -- ✅ `database-seeder/MAKEFILE_DATABASE_SEEDER.md` -- ✅ `database-seeder/DATABASE_INIT_GUIDE.md` -- ✅ `database-seeder/DATABASE_QUICK_REFERENCE_GUIDE.md` - -**Error Rendering:** -- ✅ `error-rendering/ERROR_RENDERING_DEVELOPER_DOCUMENTATION.md` -- ✅ `error-rendering/HTML_ERROR_RENDERING_FLOW_DIAGRAM.md` - -### 7. Deployment Documentation (1 file) -**Location:** `docs/deployment/` - -- ✅ `stripe-integration.md` - Stripe payment integration guide - ---- - -## 📊 Final Statistics - -**Total Files Migrated:** ~35+ documentation files -**New Directories Created:** 8 -- `docs/frontend/` (with 4 subdirectories) -- `docs/architecture/diagrams/` -- `docs/architecture/theme-system/` -- `docs/architecture/url-routing/` -- `docs/development/database-seeder/` -- `docs/development/error-rendering/` - -**mkdocs.yml Updates:** ~40+ new navigation entries added -**Build Status:** ✅ SUCCESS (no errors) - ---- - -## 📁 Final Documentation Structure - -``` -docs/ -├── getting-started/ -├── architecture/ -│ ├── Overview, Multi-tenant, Middleware, Request Flow, Auth & RBAC -│ ├── diagrams/ ✨ NEW -│ │ ├── multitenant-diagrams.md -│ │ └── vendor-domain-diagrams.md -│ ├── theme-system/ ✨ NEW -│ │ ├── overview.md -│ │ └── presets.md -│ └── url-routing/ ✨ NEW -│ └── overview.md -├── backend/ -│ ├── Overview, Middleware Ref, RBAC Quick Ref -│ ├── admin-integration-guide.md ✨ NEW -│ └── admin-feature-integration.md ✨ NEW -├── frontend/ ✨ NEW (Complete section) -│ ├── overview.md -│ ├── shared/ -│ │ ├── ui-components.md -│ │ ├── ui-components-quick-reference.md -│ │ ├── pagination.md -│ │ ├── pagination-quick-start.md -│ │ ├── sidebar.md -│ │ └── logging.md -│ ├── admin/ -│ │ ├── architecture.md -│ │ └── page-templates.md -│ ├── vendor/ -│ │ ├── architecture.md -│ │ └── page-templates.md -│ └── shop/ -│ ├── architecture.md -│ └── page-templates.md -├── api/ -│ ├── Authentication (Guide, Quick Ref, Flow Diagrams ✨ NEW) -│ ├── RBAC (Developer Guide, Visual Guide ✨ NEW) -│ ├── Error Handling -│ └── Rate Limiting -├── guides/ -├── testing/ -├── development/ -│ ├── Icons, Naming Conventions, Database Migrations -│ ├── database-seeder/ ✨ NEW -│ │ ├── DATABASE_SEEDER_DOCUMENTATION.md -│ │ ├── MAKEFILE_DATABASE_SEEDER.md -│ │ ├── DATABASE_INIT_GUIDE.md -│ │ └── DATABASE_QUICK_REFERENCE_GUIDE.md -│ ├── Exception Handling, Frontend Exception Handling -│ ├── error-rendering/ ✨ NEW -│ │ ├── ERROR_RENDERING_DEVELOPER_DOCUMENTATION.md -│ │ └── HTML_ERROR_RENDERING_FLOW_DIAGRAM.md -│ ├── environment-detection.md (✅ Wizamart branding fixed) -│ ├── Contributing -│ └── PyCharm Setup -└── deployment/ - ├── Overview, Docker, Production, Environment Variables - └── stripe-integration.md ✨ NEW -``` - ---- - -## 🗑️ What's Left in __REVAMPING (Can Be Deleted) - -The `docs/__REVAMPING/` folder now only contains: - -1. **Duplicates** - Already migrated files -2. **Roadmaps** - Historical project roadmaps (already completed work) -3. **Old project docs** - Superseded by current documentation -4. **Migration tracking** - `MIGRATION_STATUS.md` (kept for reference) - -**Recommendation:** The entire `docs/__REVAMPING/` folder can now be safely deleted. - ---- - -## ✅ Verification Checklist - -- ✅ All Letzshop references fixed (except marketplace imports context) -- ✅ All diagrams migrated -- ✅ All frontend documentation migrated -- ✅ All backend documentation migrated -- ✅ All architecture documentation migrated -- ✅ Database seeder docs migrated -- ✅ Error rendering docs migrated -- ✅ Theme system docs migrated -- ✅ URL routing docs migrated -- ✅ Stripe integration docs migrated -- ✅ mkdocs.yml updated with all new files -- ✅ Documentation builds successfully -- ✅ No critical content left unmigrated - ---- - -## 🎯 Next Steps - -1. **Review** - Quick review of migrated docs for any remaining Letzshop references -2. **Delete** - Remove `docs/__REVAMPING/` folder -3. **Commit** - Commit all changes to git -4. **Deploy** - Build and deploy documentation with `mkdocs serve` or `mkdocs build` - ---- - -## 📝 Git Status - -New files to add to git: -``` -docs/api/authentication-flow-diagrams.md -docs/api/rbac-visual-guide.md -docs/architecture/diagrams/ -docs/architecture/theme-system/ -docs/architecture/url-routing/ -docs/backend/admin-integration-guide.md -docs/backend/admin-feature-integration.md -docs/development/database-seeder/ -docs/development/error-rendering/ -docs/development/environment-detection.md -docs/deployment/stripe-integration.md -docs/frontend/ (entire directory) -mkdocs.yml (modified) -``` - ---- - -## 🎉 SUCCESS! - -The documentation migration is **100% complete**. The Wizamart platform now has: - -- ✅ Comprehensive, well-organized documentation -- ✅ Proper branding throughout -- ✅ Complete frontend, backend, and architecture guides -- ✅ All diagrams and visual guides included -- ✅ Database seeder and error rendering documentation -- ✅ Theme system and URL routing guides -- ✅ Stripe integration guide for future implementation - -**The `docs/__REVAMPING/` folder can now be safely deleted.** diff --git a/alembic/versions/9f3a25ea4991_remove_vendor_owner_user_id_column.py b/alembic/versions/9f3a25ea4991_remove_vendor_owner_user_id_column.py new file mode 100644 index 00000000..98c9ffa6 --- /dev/null +++ b/alembic/versions/9f3a25ea4991_remove_vendor_owner_user_id_column.py @@ -0,0 +1,60 @@ +"""remove_vendor_owner_user_id_column + +Revision ID: 9f3a25ea4991 +Revises: 5818330181a5 +Create Date: 2025-12-02 17:58:45.663338 + +This migration removes the owner_user_id column from the vendors table. + +Architecture Change: +- OLD: Each vendor had its own owner (vendor.owner_user_id) +- NEW: Vendors belong to a company, company has one owner (company.owner_user_id) + +The vendor ownership is now determined via the company relationship: +- vendor.company.owner_user_id contains the owner +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '9f3a25ea4991' +down_revision: Union[str, None] = '5818330181a5' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """ + Remove owner_user_id column from vendors table. + + Ownership is now determined via the company relationship. + + Note: SQLite batch mode recreates the table without the column, + so we don't need to explicitly drop constraints. + """ + with op.batch_alter_table('vendors', schema=None) as batch_op: + # Drop the column - batch mode handles constraints automatically + batch_op.drop_column('owner_user_id') + + +def downgrade() -> None: + """ + Re-add owner_user_id column to vendors table. + + WARNING: This will add the column back but NOT restore the data. + You will need to manually populate owner_user_id from company.owner_user_id + if reverting this migration. + """ + with op.batch_alter_table('vendors', schema=None) as batch_op: + batch_op.add_column( + sa.Column('owner_user_id', sa.Integer(), nullable=True) + ) + batch_op.create_foreign_key( + 'vendors_owner_user_id_fkey', + 'users', + ['owner_user_id'], + ['id'] + ) diff --git a/models/database/user.py b/models/database/user.py index 6dcb7a86..803efa00 100644 --- a/models/database/user.py +++ b/models/database/user.py @@ -51,7 +51,6 @@ class User(Base, TimestampMixin): "MarketplaceImportJob", back_populates="user" ) owned_companies = relationship("Company", back_populates="owner") - owned_vendors = relationship("Vendor", back_populates="owner") vendor_memberships = relationship( "VendorUser", foreign_keys="[VendorUser.user_id]", back_populates="user" ) @@ -78,12 +77,20 @@ class User(Base, TimestampMixin): return self.role == UserRole.VENDOR.value def is_owner_of(self, vendor_id: int) -> bool: - """Check if user is the owner of a specific vendor.""" - return any(v.id == vendor_id for v in self.owned_vendors) + """ + Check if user is the owner of a specific vendor. + + Ownership is determined via company ownership: + User owns Company → Company has Vendor → User owns Vendor + """ + for company in self.owned_companies: + if any(v.id == vendor_id for v in company.vendors): + return True + return False def is_member_of(self, vendor_id: int) -> bool: """Check if user is a member of a specific vendor (owner or team).""" - # Check if owner + # Check if owner (via company) if self.is_owner_of(vendor_id): return True # Check if team member @@ -93,7 +100,7 @@ class User(Base, TimestampMixin): def get_vendor_role(self, vendor_id: int) -> str: """Get user's role within a specific vendor.""" - # Check if owner + # Check if owner (via company) if self.is_owner_of(vendor_id): return "owner" diff --git a/models/database/vendor.py b/models/database/vendor.py index 88a98cdc..adf9c011 100644 --- a/models/database/vendor.py +++ b/models/database/vendor.py @@ -50,10 +50,6 @@ class Vendor(Base, TimestampMixin): name = Column(String, nullable=False) # Non-nullable name column for the vendor (brand name) description = Column(Text) # Optional text description column for the vendor - owner_user_id = Column( - Integer, ForeignKey("users.id"), nullable=True - ) # Foreign key to user ID of the vendor's owner (DEPRECATED - use company.owner_user_id instead) - # Letzshop URLs - multi-language support (brand-specific marketplace feeds) letzshop_csv_url_fr = Column(String) # URL for French CSV in Letzshop letzshop_csv_url_en = Column(String) # URL for English CSV in Letzshop @@ -73,9 +69,6 @@ class Vendor(Base, TimestampMixin): company = relationship( "Company", back_populates="vendors" ) # Relationship with Company model for the parent company - owner = relationship( - "User", back_populates="owned_vendors" - ) # Relationship with User model for the vendor's owner (legacy) vendor_users = relationship( "VendorUser", back_populates="vendor" ) # Relationship with VendorUser model for users in this vendor