map-pin→location-marker, target→cursor-click, device-mobile→phone, radar→globe-alt Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
166 lines
5.5 KiB
Python
166 lines
5.5 KiB
Python
# app/modules/prospecting/definition.py
|
|
"""
|
|
Prospecting module definition.
|
|
|
|
Lead discovery, scoring, and campaign management for Luxembourg businesses.
|
|
Supports digital (domain scanning) and offline (street/networking) lead channels.
|
|
Admin-only module for superadmin and platform admin users.
|
|
"""
|
|
|
|
from app.modules.base import (
|
|
MenuItemDefinition,
|
|
MenuSectionDefinition,
|
|
ModuleDefinition,
|
|
PermissionDefinition,
|
|
)
|
|
from app.modules.enums import FrontendType
|
|
|
|
|
|
def _get_admin_api_router():
|
|
"""Lazy import of admin API router to avoid circular imports."""
|
|
from app.modules.prospecting.routes.api.admin import router
|
|
|
|
return router
|
|
|
|
|
|
def _get_admin_page_router():
|
|
"""Lazy import of admin page router to avoid circular imports."""
|
|
from app.modules.prospecting.routes.pages.admin import router
|
|
|
|
return router
|
|
|
|
|
|
prospecting_module = ModuleDefinition(
|
|
code="prospecting",
|
|
name="Prospecting",
|
|
description="Lead discovery, scoring, and campaign management for Luxembourg businesses.",
|
|
version="1.0.0",
|
|
is_core=False,
|
|
is_self_contained=True,
|
|
permissions=[
|
|
PermissionDefinition(
|
|
id="prospecting.view",
|
|
label_key="prospecting.permissions.view",
|
|
description_key="prospecting.permissions.view_desc",
|
|
category="prospecting",
|
|
),
|
|
PermissionDefinition(
|
|
id="prospecting.manage",
|
|
label_key="prospecting.permissions.manage",
|
|
description_key="prospecting.permissions.manage_desc",
|
|
category="prospecting",
|
|
),
|
|
PermissionDefinition(
|
|
id="prospecting.scan",
|
|
label_key="prospecting.permissions.scan",
|
|
description_key="prospecting.permissions.scan_desc",
|
|
category="prospecting",
|
|
),
|
|
PermissionDefinition(
|
|
id="prospecting.campaigns",
|
|
label_key="prospecting.permissions.campaigns",
|
|
description_key="prospecting.permissions.campaigns_desc",
|
|
category="prospecting",
|
|
),
|
|
PermissionDefinition(
|
|
id="prospecting.export",
|
|
label_key="prospecting.permissions.export",
|
|
description_key="prospecting.permissions.export_desc",
|
|
category="prospecting",
|
|
),
|
|
],
|
|
features=[
|
|
"domain_scanning",
|
|
"offline_capture",
|
|
"opportunity_scoring",
|
|
"campaign_management",
|
|
"lead_export",
|
|
],
|
|
menu_items={
|
|
FrontendType.ADMIN: [
|
|
"prospecting-dashboard",
|
|
"prospects",
|
|
"leads",
|
|
"capture",
|
|
"scan-jobs",
|
|
"campaigns",
|
|
],
|
|
},
|
|
menus={
|
|
FrontendType.ADMIN: [
|
|
MenuSectionDefinition(
|
|
id="prospecting",
|
|
label_key="prospecting.menu.prospecting",
|
|
icon="cursor-click",
|
|
order=60,
|
|
items=[
|
|
MenuItemDefinition(
|
|
id="prospecting-dashboard",
|
|
label_key="prospecting.menu.dashboard",
|
|
icon="chart-bar",
|
|
route="/admin/prospecting",
|
|
order=1,
|
|
),
|
|
MenuItemDefinition(
|
|
id="prospects",
|
|
label_key="prospecting.menu.prospects",
|
|
icon="globe",
|
|
route="/admin/prospecting/prospects",
|
|
order=5,
|
|
),
|
|
MenuItemDefinition(
|
|
id="leads",
|
|
label_key="prospecting.menu.leads",
|
|
icon="cursor-click",
|
|
route="/admin/prospecting/leads",
|
|
order=10,
|
|
),
|
|
MenuItemDefinition(
|
|
id="capture",
|
|
label_key="prospecting.menu.capture",
|
|
icon="phone",
|
|
route="/admin/prospecting/capture",
|
|
order=15,
|
|
),
|
|
MenuItemDefinition(
|
|
id="scan-jobs",
|
|
label_key="prospecting.menu.scan_jobs",
|
|
icon="globe-alt",
|
|
route="/admin/prospecting/scan-jobs",
|
|
order=20,
|
|
),
|
|
MenuItemDefinition(
|
|
id="campaigns",
|
|
label_key="prospecting.menu.campaigns",
|
|
icon="mail",
|
|
route="/admin/prospecting/campaigns",
|
|
order=25,
|
|
),
|
|
],
|
|
),
|
|
],
|
|
},
|
|
migrations_path="migrations",
|
|
services_path="app.modules.prospecting.services",
|
|
models_path="app.modules.prospecting.models",
|
|
schemas_path="app.modules.prospecting.schemas",
|
|
exceptions_path="app.modules.prospecting.exceptions",
|
|
templates_path="templates",
|
|
locales_path="locales",
|
|
tasks_path="app.modules.prospecting.tasks",
|
|
)
|
|
|
|
|
|
def get_prospecting_module_with_routers() -> ModuleDefinition:
|
|
"""
|
|
Get prospecting module with routers attached.
|
|
|
|
Attaches routers lazily to avoid circular imports during module initialization.
|
|
"""
|
|
prospecting_module.admin_api_router = _get_admin_api_router()
|
|
prospecting_module.admin_page_router = _get_admin_page_router()
|
|
return prospecting_module
|
|
|
|
|
|
__all__ = ["prospecting_module", "get_prospecting_module_with_routers"]
|