Refactor database models and schemas to allow nullable fields; update init_database function for improved initialization.
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
+173
-44
@@ -1,7 +1,7 @@
|
||||
from enum import Enum
|
||||
from typing import List, Optional
|
||||
|
||||
from pydantic import BaseModel, field_validator
|
||||
from pydantic import BaseModel, Field, field_validator
|
||||
|
||||
|
||||
class InvestmentStage(str, Enum):
|
||||
@@ -14,98 +14,227 @@ class InvestmentStage(str, Enum):
|
||||
|
||||
|
||||
class SectorSchema(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
"""
|
||||
Expert parser: Only extract sector information if clearly identifiable.
|
||||
Leave name empty if uncertain about the sector classification.
|
||||
"""
|
||||
|
||||
id: int = Field(
|
||||
ge=0, description="Sector ID, must be 0 or greater. Use 0 if uncertain."
|
||||
)
|
||||
name: str = Field(
|
||||
description="Sector name. Leave empty string if not clearly identifiable from the data."
|
||||
)
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class InvestorMemberSchema(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
role: str
|
||||
email: str
|
||||
investor_id: int
|
||||
"""
|
||||
Expert parser: Only extract team member information if clearly identifiable.
|
||||
Leave fields empty if uncertain about the member details.
|
||||
"""
|
||||
|
||||
id: int = Field(
|
||||
ge=0, description="Member ID, must be 0 or greater. Use 0 if uncertain."
|
||||
)
|
||||
name: str = Field(
|
||||
description="Team member name. Leave empty string if not clearly identifiable."
|
||||
)
|
||||
role: str = Field(
|
||||
description="Team member role/title. Leave empty string if not clearly identifiable."
|
||||
)
|
||||
email: str = Field(
|
||||
description="Team member email. Leave empty string if not clearly identifiable or not provided."
|
||||
)
|
||||
investor_id: int = Field(
|
||||
ge=0, description="Investor ID, must be 0 or greater. Use 0 if uncertain."
|
||||
)
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class CompanyMemberSchema(BaseModel):
|
||||
id: int
|
||||
name: Optional[str] = None
|
||||
linkedin: Optional[str] = None
|
||||
role: Optional[str] = None
|
||||
company_id: int
|
||||
"""
|
||||
Expert parser: Only extract company member information if clearly identifiable.
|
||||
Leave fields empty if uncertain about the member details.
|
||||
"""
|
||||
|
||||
id: int = Field(
|
||||
ge=0, description="Member ID, must be 0 or greater. Use 0 if uncertain."
|
||||
)
|
||||
name: Optional[str] = Field(
|
||||
default="",
|
||||
description="Company member name. Leave empty if not clearly identifiable.",
|
||||
)
|
||||
linkedin: Optional[str] = Field(
|
||||
default="",
|
||||
description="LinkedIn profile URL. Leave empty if not provided or uncertain.",
|
||||
)
|
||||
role: Optional[str] = Field(
|
||||
default="",
|
||||
description="Company member role/title. Leave empty if not clearly identifiable.",
|
||||
)
|
||||
company_id: int = Field(
|
||||
ge=0, description="Company ID, must be 0 or greater. Use 0 if uncertain."
|
||||
)
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class CompanySchema(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
industry: str
|
||||
location: str
|
||||
description: Optional[str] = None # Fixed typo from 'nullabel'
|
||||
founded_year: Optional[int] = None # Changed from str to int to match model
|
||||
website: Optional[str] = None
|
||||
"""
|
||||
Expert parser: Only extract company information if clearly identifiable.
|
||||
Leave optional fields empty if uncertain. Integer values must be 0 or greater.
|
||||
"""
|
||||
|
||||
id: int = Field(
|
||||
ge=0, description="Company ID, must be 0 or greater. Use 0 if uncertain."
|
||||
)
|
||||
name: str = Field(
|
||||
description="Company name. Leave empty string if not clearly identifiable."
|
||||
)
|
||||
industry: str = Field(
|
||||
description="Company industry/sector. Leave empty string if not clearly identifiable."
|
||||
)
|
||||
location: str = Field(
|
||||
description="Company location/address. Leave empty string if not clearly identifiable."
|
||||
)
|
||||
description: Optional[str] = Field(
|
||||
default="",
|
||||
description="Company description. Leave empty if not clearly available or uncertain.",
|
||||
)
|
||||
founded_year: Optional[int] = Field(
|
||||
default=None,
|
||||
ge=0,
|
||||
description="Year company was founded, must be 0 or greater. Leave None if not clearly identifiable or uncertain.",
|
||||
)
|
||||
website: Optional[str] = Field(
|
||||
default="",
|
||||
description="Company website URL. Leave empty if not provided or uncertain.",
|
||||
)
|
||||
|
||||
@field_validator("founded_year", mode="before")
|
||||
@classmethod
|
||||
def validate_founded_year(cls, v):
|
||||
if v is None or v == "Not Available" or v == "":
|
||||
"""Expert parser: Only accept clearly identifiable founding years"""
|
||||
if v is None or v == "Not Available" or v == "" or v == "Unknown":
|
||||
return None
|
||||
if isinstance(v, str):
|
||||
try:
|
||||
return int(v)
|
||||
year = int(v)
|
||||
return year if year >= 0 else None
|
||||
except ValueError:
|
||||
return None
|
||||
return v
|
||||
return v if isinstance(v, int) and v >= 0 else None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class InvestorSchema(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
description: Optional[str] = None
|
||||
aum: int
|
||||
check_size_lower: int
|
||||
check_size_upper: int
|
||||
geographic_focus: str
|
||||
stage_focus: InvestmentStage
|
||||
number_of_investments: int = 0
|
||||
|
||||
"""
|
||||
Expert parser: Only extract investor information if clearly identifiable.
|
||||
Leave optional fields empty if uncertain. All numeric values must be 0 or greater.
|
||||
"""
|
||||
|
||||
id: int = Field(
|
||||
ge=0, description="Investor ID, must be 0 or greater. Use 0 if uncertain."
|
||||
)
|
||||
name: str = Field(
|
||||
description="Investor name. Leave empty string if not clearly identifiable."
|
||||
)
|
||||
description: Optional[str] = Field(
|
||||
default="",
|
||||
description="Investor description. Leave empty if not clearly available or uncertain.",
|
||||
)
|
||||
aum: int = Field(
|
||||
ge=0,
|
||||
description="Assets Under Management in USD, must be 0 or greater. Use 0 if not clearly identifiable or uncertain.",
|
||||
)
|
||||
check_size_lower: int = Field(
|
||||
ge=0,
|
||||
description="Lower bound of typical investment check size in USD, must be 0 or greater. Use 0 if not clearly identifiable.",
|
||||
)
|
||||
check_size_upper: int = Field(
|
||||
ge=0,
|
||||
description="Upper bound of typical investment check size in USD, must be 0 or greater. Use 0 if not clearly identifiable.",
|
||||
)
|
||||
geographic_focus: str = Field(
|
||||
description="Geographic investment focus. Leave empty string if not clearly identifiable."
|
||||
)
|
||||
stage_focus: InvestmentStage = Field(
|
||||
description="Investment stage focus. Use SEED as default if uncertain."
|
||||
)
|
||||
number_of_investments: int = Field(
|
||||
ge=0,
|
||||
default=0,
|
||||
description="Total number of investments made, must be 0 or greater. Use 0 if not clearly identifiable.",
|
||||
)
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class InvestorData(BaseModel):
|
||||
"""Comprehensive investor data schema for LLM processing"""
|
||||
"""
|
||||
Expert parser: Comprehensive investor data schema for LLM processing.
|
||||
Only populate fields with clearly identifiable information. Leave lists empty if uncertain.
|
||||
"""
|
||||
|
||||
investor: InvestorSchema
|
||||
portfolio_companies: List[CompanySchema] = []
|
||||
team_members: List[InvestorMemberSchema] = [] # Changed from TeamMember
|
||||
sectors: List[SectorSchema] = []
|
||||
investor: InvestorSchema = Field(
|
||||
description="Core investor information. Only populate with clearly identifiable data."
|
||||
)
|
||||
portfolio_companies: List[CompanySchema] = Field(
|
||||
default=[],
|
||||
description="List of portfolio companies. Leave empty if not clearly identifiable.",
|
||||
)
|
||||
team_members: List[InvestorMemberSchema] = Field(
|
||||
default=[],
|
||||
description="List of team members. Leave empty if not clearly identifiable.",
|
||||
)
|
||||
sectors: List[SectorSchema] = Field(
|
||||
default=[],
|
||||
description="List of investment sectors. Leave empty if not clearly identifiable.",
|
||||
)
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class CompanyData(BaseModel): # Renamed from CompaniesData for consistency
|
||||
company: CompanySchema
|
||||
sectors: List[SectorSchema] = []
|
||||
members: List[CompanyMemberSchema] = [] # Changed to match model relationship name
|
||||
investors: List[InvestorSchema] = []
|
||||
class CompanyData(BaseModel):
|
||||
"""
|
||||
Expert parser: Comprehensive company data schema for LLM processing.
|
||||
Only populate fields with clearly identifiable information. Leave lists empty if uncertain.
|
||||
"""
|
||||
|
||||
company: CompanySchema = Field(
|
||||
description="Core company information. Only populate with clearly identifiable data."
|
||||
)
|
||||
sectors: List[SectorSchema] = Field(
|
||||
default=[],
|
||||
description="List of company sectors. Leave empty if not clearly identifiable.",
|
||||
)
|
||||
members: List[CompanyMemberSchema] = Field(
|
||||
default=[],
|
||||
description="List of company members. Leave empty if not clearly identifiable.",
|
||||
)
|
||||
investors: List[InvestorSchema] = Field(
|
||||
default=[],
|
||||
description="List of investors. Leave empty if not clearly identifiable.",
|
||||
)
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class InvestorList(BaseModel):
|
||||
investors: List[InvestorData] = []
|
||||
"""Expert parser: List of investors with clearly identifiable information only."""
|
||||
|
||||
investors: List[InvestorData] = Field(
|
||||
default=[],
|
||||
description="List of investors. Leave empty if no clearly identifiable investors.",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user