# app/modules/cms/definition.py """ CMS module definition. Defines the CMS module including its features, menu items, route configurations, and self-contained component paths. This is a self-contained module with: - Services: app.modules.cms.services - Models: app.modules.cms.models - Exceptions: app.modules.cms.exceptions - Templates: app.modules.cms.templates (namespaced as cms/) """ from app.modules.base import MenuItemDefinition, MenuSectionDefinition, ModuleDefinition, PermissionDefinition from app.modules.enums import FrontendType def _get_admin_router(): """Lazy import of admin router to avoid circular imports.""" from app.modules.cms.routes.admin import admin_router return admin_router def _get_vendor_router(): """Lazy import of vendor router to avoid circular imports.""" from app.modules.cms.routes.vendor import vendor_router return vendor_router # CMS module definition - Self-contained module (pilot) cms_module = ModuleDefinition( code="cms", name="Content Management", description="Content pages, media library, and vendor themes.", version="1.0.0", features=[ "cms_basic", # Basic page editing "cms_custom_pages", # Custom page creation "cms_unlimited_pages", # No page limit "cms_templates", # Page templates "cms_seo", # SEO tools "media_library", # Media file management ], # Module-driven permissions permissions=[ PermissionDefinition( id="cms.view_pages", label_key="cms.permissions.view_pages", description_key="cms.permissions.view_pages_desc", category="cms", ), PermissionDefinition( id="cms.manage_pages", label_key="cms.permissions.manage_pages", description_key="cms.permissions.manage_pages_desc", category="cms", ), PermissionDefinition( id="cms.view_media", label_key="cms.permissions.view_media", description_key="cms.permissions.view_media_desc", category="cms", ), PermissionDefinition( id="cms.manage_media", label_key="cms.permissions.manage_media", description_key="cms.permissions.manage_media_desc", category="cms", ), PermissionDefinition( id="cms.manage_themes", label_key="cms.permissions.manage_themes", description_key="cms.permissions.manage_themes_desc", category="cms", ), ], menu_items={ FrontendType.ADMIN: [ "content-pages", # Platform content pages "vendor-themes", # Theme management ], FrontendType.VENDOR: [ "content-pages", # Vendor content pages "media", # Media library ], }, # New module-driven menu definitions menus={ FrontendType.ADMIN: [ MenuSectionDefinition( id="contentMgmt", label_key="cms.menu.content_management", icon="document-text", order=70, items=[ MenuItemDefinition( id="content-pages", label_key="cms.menu.content_pages", icon="document-text", route="/admin/content-pages", order=20, ), MenuItemDefinition( id="vendor-themes", label_key="cms.menu.vendor_themes", icon="color-swatch", route="/admin/vendor-themes", order=30, ), ], ), ], FrontendType.VENDOR: [ MenuSectionDefinition( id="shop", label_key="cms.menu.shop_content", icon="document-text", order=40, items=[ MenuItemDefinition( id="content-pages", label_key="cms.menu.content_pages", icon="document-text", route="/vendor/{vendor_code}/content-pages", order=10, ), MenuItemDefinition( id="media", label_key="cms.menu.media_library", icon="photograph", route="/vendor/{vendor_code}/media", order=20, ), ], ), ], }, is_core=True, # CMS is a core module - content management is fundamental # Self-contained module configuration is_self_contained=True, services_path="app.modules.cms.services", models_path="app.modules.cms.models", exceptions_path="app.modules.cms.exceptions", # Module templates (namespaced as cms/admin/*.html and cms/vendor/*.html) templates_path="templates", # Module-specific translations (accessible via cms.* keys) locales_path="locales", ) def get_cms_module_with_routers() -> ModuleDefinition: """ Get CMS module with routers attached. This function attaches the routers lazily to avoid circular imports during module initialization. """ cms_module.admin_router = _get_admin_router() cms_module.vendor_router = _get_vendor_router() return cms_module __all__ = ["cms_module", "get_cms_module_with_routers"]