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:
64
app/modules/prospecting/models/performance_profile.py
Normal file
64
app/modules/prospecting/models/performance_profile.py
Normal file
@@ -0,0 +1,64 @@
|
||||
# app/modules/prospecting/models/performance_profile.py
|
||||
"""
|
||||
Performance profile for a prospect's website.
|
||||
|
||||
Stores Lighthouse audit results including Core Web Vitals,
|
||||
mobile-friendliness, and asset size analysis.
|
||||
"""
|
||||
|
||||
from sqlalchemy import Boolean, Column, Float, ForeignKey, Integer, String, Text
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from app.core.database import Base
|
||||
from models.database.base import TimestampMixin
|
||||
|
||||
|
||||
class ProspectPerformanceProfile(Base, TimestampMixin):
|
||||
"""Performance audit results from PageSpeed Insights / Lighthouse."""
|
||||
|
||||
__tablename__ = "prospect_performance_profiles"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
prospect_id = Column(Integer, ForeignKey("prospects.id", ondelete="CASCADE"), nullable=False, unique=True)
|
||||
|
||||
# Lighthouse Scores (0-100)
|
||||
performance_score = Column(Integer, nullable=True)
|
||||
accessibility_score = Column(Integer, nullable=True)
|
||||
best_practices_score = Column(Integer, nullable=True)
|
||||
seo_score = Column(Integer, nullable=True)
|
||||
|
||||
# Core Web Vitals
|
||||
first_contentful_paint_ms = Column(Integer, nullable=True)
|
||||
largest_contentful_paint_ms = Column(Integer, nullable=True)
|
||||
total_blocking_time_ms = Column(Integer, nullable=True)
|
||||
cumulative_layout_shift = Column(Float, nullable=True)
|
||||
speed_index = Column(Integer, nullable=True)
|
||||
time_to_interactive_ms = Column(Integer, nullable=True)
|
||||
|
||||
# Mobile
|
||||
is_mobile_friendly = Column(Boolean, nullable=True)
|
||||
viewport_configured = Column(Boolean, nullable=True)
|
||||
font_size_ok = Column(Boolean, nullable=True)
|
||||
tap_targets_ok = Column(Boolean, nullable=True)
|
||||
|
||||
# Asset Sizes (bytes)
|
||||
total_bytes = Column(Integer, nullable=True)
|
||||
html_bytes = Column(Integer, nullable=True)
|
||||
css_bytes = Column(Integer, nullable=True)
|
||||
js_bytes = Column(Integer, nullable=True)
|
||||
image_bytes = Column(Integer, nullable=True)
|
||||
font_bytes = Column(Integer, nullable=True)
|
||||
|
||||
# Request Counts
|
||||
total_requests = Column(Integer, nullable=True)
|
||||
js_requests = Column(Integer, nullable=True)
|
||||
css_requests = Column(Integer, nullable=True)
|
||||
image_requests = Column(Integer, nullable=True)
|
||||
|
||||
# Raw data
|
||||
lighthouse_json = Column(Text, nullable=True) # JSON string
|
||||
scan_strategy = Column(String(20), nullable=True) # mobile or desktop
|
||||
scan_error = Column(Text, nullable=True)
|
||||
|
||||
# Relationships
|
||||
prospect = relationship("Prospect", back_populates="performance_profile")
|
||||
Reference in New Issue
Block a user