Sami Marreed
feat: docker-v1 with optimized frontend
0646b18
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