"""Shared Pydantic models for all domains."""
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, Field
# ============================================================================
# Career Domain Models
# ============================================================================
class JobListing(BaseModel):
"""Basic job listing information."""
title: str = Field(..., description="Job title")
url: str = Field(..., description="URL to job posting")
company: str = Field(..., description="Company name")
location: Optional[str] = Field(None, description="Job location")
posted_date: Optional[datetime] = Field(None, description="Date job was posted")
source: str = Field(..., description="Source of listing (greenhouse, lever, custom)")
class JobDetails(JobListing):
"""Detailed job information including description and requirements."""
description: str = Field(..., description="Full job description")
requirements: list[str] = Field(default_factory=list, description="Job requirements")
qualifications: list[str] = Field(default_factory=list, description="Qualifications")
salary_range: Optional[str] = Field(None, description="Salary range if available")
class Application(BaseModel):
"""Job application tracking."""
id: str = Field(..., description="Unique application ID")
job: JobListing = Field(..., description="Associated job listing")
applied_date: datetime = Field(..., description="Date application was submitted")
status: str = Field(
...,
description="Application status: interested, applied, interviewing, offered, rejected"
)
notes: str = Field(default="", description="Application notes")
next_action: Optional[str] = Field(None, description="Next action to take")
class Company(BaseModel):
"""Target company for job search."""
id: str = Field(..., description="Unique company ID")
name: str = Field(..., description="Company name")
careers_url: str = Field(..., description="URL to careers page")
priority: int = Field(default=5, ge=1, le=10, description="Priority 1-10")
notes: str = Field(default="", description="Notes about the company")
last_checked: Optional[datetime] = Field(None, description="Last time jobs were checked")
class FitAnalysis(BaseModel):
"""Analysis of job fit based on resume."""
overall_score: float = Field(..., ge=0, le=100, description="Overall fit score 0-100")
matching_skills: list[str] = Field(default_factory=list, description="Skills that match")
missing_skills: list[str] = Field(default_factory=list, description="Required skills missing")
recommendations: list[str] = Field(
default_factory=list,
description="Recommendations for improving fit"
)
key_points: list[str] = Field(
default_factory=list,
description="Key points to emphasize in application"
)
class PipelineStats(BaseModel):
"""Statistics about the application pipeline."""
total_applications: int = Field(..., description="Total applications tracked")
by_status: dict[str, int] = Field(..., description="Breakdown by status")
avg_response_time_days: Optional[float] = Field(
None,
description="Average response time in days"
)
success_rate: Optional[float] = Field(
None,
ge=0,
le=100,
description="Success rate percentage"
)
# ============================================================================
# Fitness Domain Models (Phase 3)
# ============================================================================
# class HealthMetrics(BaseModel):
# """Health metrics from Health Auto Export."""
# pass
# class Workout(BaseModel):
# """Workout session data."""
# pass
# ============================================================================
# Family Domain Models (Phase 4)
# ============================================================================
# class Transaction(BaseModel):
# """Financial transaction record."""
# pass
# class Balance(BaseModel):
# """Current balance for a person."""
# pass