Spaces:
Running
Running
| from pydantic import BaseModel, EmailStr | |
| from typing import Optional, List, Generic, TypeVar | |
| from datetime import datetime | |
| # Generic type for pagination | |
| T = TypeVar('T') | |
| # Base schemas | |
| class PaginatedResponse(BaseModel, Generic[T]): | |
| items: List[T] | |
| total: int | |
| page: int | |
| pages: int | |
| per_page: int | |
| # Account schemas | |
| class AccountBase(BaseModel): | |
| name: str | |
| industry: Optional[str] = None | |
| website: Optional[str] = None | |
| phone: Optional[str] = None | |
| # email: Optional[EmailStr] = None | |
| address: Optional[str] = None | |
| city: Optional[str] = None | |
| state: Optional[str] = None | |
| country: Optional[str] = None | |
| region: Optional[str] = None | |
| annual_revenue: Optional[float] = None | |
| employee_count: Optional[int] = None | |
| class AccountCreate(AccountBase): | |
| pass | |
| class AccountUpdate(BaseModel): | |
| name: Optional[str] = None | |
| industry: Optional[str] = None | |
| website: Optional[str] = None | |
| phone: Optional[str] = None | |
| email: Optional[EmailStr] = None | |
| address: Optional[str] = None | |
| city: Optional[str] = None | |
| state: Optional[str] = None | |
| country: Optional[str] = None | |
| region: Optional[str] = None | |
| annual_revenue: Optional[float] = None | |
| employee_count: Optional[int] = None | |
| class AccountResponse(AccountBase): | |
| id: int | |
| created_at: datetime | |
| updated_at: Optional[datetime] = None | |
| class Config: | |
| from_attributes = True | |
| # Lead schemas | |
| class LeadBase(BaseModel): | |
| first_name: str | |
| last_name: str | |
| email: EmailStr | |
| phone: Optional[str] = None | |
| company: Optional[str] = None | |
| job_title: Optional[str] = None | |
| industry: Optional[str] = None | |
| source: Optional[str] = None | |
| status: Optional[str] = "new" | |
| score: Optional[int] = 0 | |
| notes: Optional[str] = None | |
| class LeadCreate(LeadBase): | |
| pass | |
| class LeadUpdate(BaseModel): | |
| first_name: Optional[str] = None | |
| last_name: Optional[str] = None | |
| email: Optional[EmailStr] = None | |
| phone: Optional[str] = None | |
| company: Optional[str] = None | |
| job_title: Optional[str] = None | |
| industry: Optional[str] = None | |
| source: Optional[str] = None | |
| status: Optional[str] = None | |
| score: Optional[int] = None | |
| notes: Optional[str] = None | |
| class LeadResponse(LeadBase): | |
| id: int | |
| created_at: datetime | |
| updated_at: Optional[datetime] = None | |
| class Config: | |
| from_attributes = True | |
| # Contact schemas | |
| class ContactBase(BaseModel): | |
| first_name: str | |
| last_name: str | |
| email: EmailStr | |
| phone: Optional[str] = None | |
| job_title: Optional[str] = None | |
| department: Optional[str] = None | |
| is_primary: Optional[bool] = False | |
| account_id: int | |
| class ContactCreate(ContactBase): | |
| pass | |
| class ContactUpdate(BaseModel): | |
| first_name: Optional[str] = None | |
| last_name: Optional[str] = None | |
| email: Optional[EmailStr] = None | |
| phone: Optional[str] = None | |
| job_title: Optional[str] = None | |
| department: Optional[str] = None | |
| is_primary: Optional[bool] = None | |
| account_id: Optional[int] = None | |
| class ContactResponse(ContactBase): | |
| id: int | |
| created_at: datetime | |
| updated_at: Optional[datetime] = None | |
| class Config: | |
| from_attributes = True | |
| # Opportunity schemas | |
| class OpportunityBase(BaseModel): | |
| name: str | |
| description: Optional[str] = None | |
| value: float | |
| currency: Optional[str] = "USD" | |
| stage: Optional[str] = "prospecting" | |
| probability: Optional[float] = 0.0 | |
| close_date: Optional[datetime] = None | |
| account_id: int | |
| class OpportunityCreate(OpportunityBase): | |
| pass | |
| class OpportunityUpdate(BaseModel): | |
| name: Optional[str] = None | |
| description: Optional[str] = None | |
| value: Optional[float] = None | |
| currency: Optional[str] = None | |
| stage: Optional[str] = None | |
| probability: Optional[float] = None | |
| close_date: Optional[datetime] = None | |
| account_id: Optional[int] = None | |
| class OpportunityResponse(OpportunityBase): | |
| id: int | |
| created_at: datetime | |
| updated_at: Optional[datetime] = None | |
| class Config: | |
| from_attributes = True | |