root 656f596d7e feat: implement AI legal assistant system MVP
Core modules:
- Laws: CRUD, search, AI-powered QA
- Analysis: legal research and case management
- Contracts: lifecycle management with templates
- Signatures: electronic signature workflow

Infrastructure:
- FastAPI + SQLite + async SQLAlchemy
- Docker deployment support
- 54 unit tests passing

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-01 03:34:44 +08:00

113 lines
2.9 KiB
Python

"""Schemas for Contract module."""
from datetime import date, datetime
from typing import Optional
from enum import Enum
from pydantic import BaseModel, Field
class ContractStatusEnum(str, Enum):
DRAFT = "draft"
PENDING_APPROVAL = "pending_approval"
APPROVED = "approved"
PENDING_SIGNATURE = "pending_signature"
SIGNED = "signed"
ARCHIVED = "archived"
REJECTED = "rejected"
class ContractBase(BaseModel):
"""Base schema for Contract."""
title: str = Field(..., max_length=200)
party_a: str = Field(..., max_length=100)
party_b: str = Field(..., max_length=100)
content: str
contract_number: Optional[str] = Field(None, max_length=50)
effective_date: Optional[date] = None
expiry_date: Optional[date] = None
class ContractCreate(ContractBase):
"""Schema for creating a contract."""
template_id: Optional[int] = None
class ContractUpdate(BaseModel):
"""Schema for updating a contract."""
title: Optional[str] = Field(None, max_length=200)
party_a: Optional[str] = Field(None, max_length=100)
party_b: Optional[str] = Field(None, max_length=100)
content: Optional[str] = None
contract_number: Optional[str] = Field(None, max_length=50)
effective_date: Optional[date] = None
expiry_date: Optional[date] = None
status: Optional[ContractStatusEnum] = None
class ContractResponse(ContractBase):
"""Schema for contract response."""
id: int
template_id: Optional[int] = None
status: ContractStatusEnum
file_path: Optional[str] = None
created_by: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class ContractTemplateBase(BaseModel):
"""Base schema for ContractTemplate."""
name: str = Field(..., max_length=100)
content: str
contract_type: Optional[str] = Field(None, max_length=50)
class ContractTemplateCreate(ContractTemplateBase):
"""Schema for creating a contract template."""
pass
class ContractTemplateResponse(ContractTemplateBase):
"""Schema for contract template response."""
id: int
created_by: int
created_at: datetime
class Config:
from_attributes = True
class ApprovalRequest(BaseModel):
"""Schema for approval request."""
comment: Optional[str] = None
class ApprovalResponse(BaseModel):
"""Schema for approval response."""
id: int
contract_id: int
approver_id: int
status: ContractStatusEnum
comment: Optional[str] = None
created_at: datetime
approved_at: Optional[datetime] = None
class Config:
from_attributes = True
class ContractReviewRequest(BaseModel):
"""Schema for AI contract review request."""
contract_content: str
contract_type: Optional[str] = None
class ContractReviewResponse(BaseModel):
"""Schema for AI contract review response."""
review_result: str
risks: list = []
suggestions: list = []