feat(prospecting): add complete prospecting module for lead discovery and scoring
Some checks failed
Some checks failed
Migrates scanning pipeline from marketing-.lu-domains app into Orion module. Supports digital (domain scan) and offline (manual capture) lead channels with enrichment, scoring, campaign management, and interaction tracking. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1
app/modules/prospecting/routes/pages/__init__.py
Normal file
1
app/modules/prospecting/routes/pages/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# app/modules/prospecting/routes/pages/__init__.py
|
||||
123
app/modules/prospecting/routes/pages/admin.py
Normal file
123
app/modules/prospecting/routes/pages/admin.py
Normal file
@@ -0,0 +1,123 @@
|
||||
# app/modules/prospecting/routes/pages/admin.py
|
||||
"""
|
||||
Prospecting Admin Page Routes (HTML rendering).
|
||||
|
||||
Admin pages for lead discovery and campaign management:
|
||||
- Dashboard - Overview with stats and charts
|
||||
- Prospects - Prospect list with filters
|
||||
- Prospect Detail - Single prospect view with tabs
|
||||
- Leads - Scored lead list
|
||||
- Quick Capture - Mobile-friendly lead capture form
|
||||
- Scan Jobs - Scan job monitoring
|
||||
- Campaigns - Campaign template management
|
||||
"""
|
||||
|
||||
from fastapi import APIRouter, Depends, Path, Request
|
||||
from fastapi.responses import HTMLResponse
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.api.deps import get_db, require_menu_access
|
||||
from app.modules.core.utils.page_context import get_admin_context
|
||||
from app.modules.enums import FrontendType
|
||||
from app.modules.tenancy.models import User
|
||||
from app.templates_config import templates
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/prospecting", response_class=HTMLResponse, include_in_schema=False)
|
||||
async def admin_prospecting_dashboard(
|
||||
request: Request,
|
||||
current_user: User = Depends(require_menu_access("prospecting-dashboard", FrontendType.ADMIN)),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""Render prospecting dashboard page."""
|
||||
return templates.TemplateResponse(
|
||||
"prospecting/admin/dashboard.html",
|
||||
get_admin_context(request, db, current_user),
|
||||
)
|
||||
|
||||
|
||||
@router.get("/prospecting/prospects", response_class=HTMLResponse, include_in_schema=False)
|
||||
async def admin_prospects_list(
|
||||
request: Request,
|
||||
current_user: User = Depends(require_menu_access("prospects", FrontendType.ADMIN)),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""Render prospects list page."""
|
||||
return templates.TemplateResponse(
|
||||
"prospecting/admin/prospects.html",
|
||||
get_admin_context(request, db, current_user),
|
||||
)
|
||||
|
||||
|
||||
@router.get(
|
||||
"/prospecting/prospects/{prospect_id}",
|
||||
response_class=HTMLResponse,
|
||||
include_in_schema=False,
|
||||
)
|
||||
async def admin_prospect_detail(
|
||||
request: Request,
|
||||
prospect_id: int = Path(..., description="Prospect ID"),
|
||||
current_user: User = Depends(require_menu_access("prospects", FrontendType.ADMIN)),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""Render single prospect detail page."""
|
||||
context = get_admin_context(request, db, current_user)
|
||||
context["prospect_id"] = prospect_id
|
||||
return templates.TemplateResponse(
|
||||
"prospecting/admin/prospect-detail.html",
|
||||
context,
|
||||
)
|
||||
|
||||
|
||||
@router.get("/prospecting/leads", response_class=HTMLResponse, include_in_schema=False)
|
||||
async def admin_leads_list(
|
||||
request: Request,
|
||||
current_user: User = Depends(require_menu_access("leads", FrontendType.ADMIN)),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""Render leads list page."""
|
||||
return templates.TemplateResponse(
|
||||
"prospecting/admin/leads.html",
|
||||
get_admin_context(request, db, current_user),
|
||||
)
|
||||
|
||||
|
||||
@router.get("/prospecting/capture", response_class=HTMLResponse, include_in_schema=False)
|
||||
async def admin_quick_capture(
|
||||
request: Request,
|
||||
current_user: User = Depends(require_menu_access("capture", FrontendType.ADMIN)),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""Render mobile-friendly quick capture form."""
|
||||
return templates.TemplateResponse(
|
||||
"prospecting/admin/capture.html",
|
||||
get_admin_context(request, db, current_user),
|
||||
)
|
||||
|
||||
|
||||
@router.get("/prospecting/scan-jobs", response_class=HTMLResponse, include_in_schema=False)
|
||||
async def admin_scan_jobs(
|
||||
request: Request,
|
||||
current_user: User = Depends(require_menu_access("scan-jobs", FrontendType.ADMIN)),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""Render scan jobs monitoring page."""
|
||||
return templates.TemplateResponse(
|
||||
"prospecting/admin/scan-jobs.html",
|
||||
get_admin_context(request, db, current_user),
|
||||
)
|
||||
|
||||
|
||||
@router.get("/prospecting/campaigns", response_class=HTMLResponse, include_in_schema=False)
|
||||
async def admin_campaigns(
|
||||
request: Request,
|
||||
current_user: User = Depends(require_menu_access("campaigns", FrontendType.ADMIN)),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""Render campaign management page."""
|
||||
return templates.TemplateResponse(
|
||||
"prospecting/admin/campaigns.html",
|
||||
get_admin_context(request, db, current_user),
|
||||
)
|
||||
Reference in New Issue
Block a user