requests.py•2.05 kB
"""Request data models."""
from pydantic import BaseModel, Field, field_validator
class PANVerificationRequest(BaseModel):
"""Request model for PAN verification."""
pan: str = Field(
...,
pattern=r"^[A-Z]{5}[0-9]{4}[A-Z]$",
description="10-character PAN number",
examples=["XXXPX1234A"],
)
name_as_per_pan: str = Field(
...,
min_length=1,
max_length=100,
description="Full name as per PAN card",
)
date_of_birth: str = Field(
...,
pattern=r"^\d{2}/\d{2}/\d{4}$",
description="Date of birth in DD/MM/YYYY format",
examples=["01/01/1990"],
)
consent: str = Field(
..., description="User consent (must be 'Y' or 'y')", pattern=r"^[Yy]$"
)
reason: str = Field(..., min_length=1, description="Reason for verification")
@field_validator("pan")
@classmethod
def validate_pan(cls, v: str) -> str:
"""Validate PAN format."""
if not v.isupper():
raise ValueError("PAN must be in uppercase")
return v
class PANAadhaarLinkRequest(BaseModel):
"""Request model for PAN-Aadhaar link status check."""
pan: str = Field(
...,
pattern=r"^[A-Z]{3}P[A-Z][0-9]{4}[A-Z]$",
description="Individual PAN number (4th character must be 'P')",
examples=["XXXPX1234A"],
)
aadhaar_number: str = Field(
...,
pattern=r"^[0-9]{12}$",
description="12-digit Aadhaar number",
examples=["123456789012"],
)
consent: str = Field(
..., description="User consent (must be 'Y' or 'y')", pattern=r"^[Yy]$"
)
reason: str = Field(
..., min_length=1, description="Reason for checking link status"
)
@field_validator("pan")
@classmethod
def validate_individual_pan(cls, v: str) -> str:
"""Validate that PAN is for an individual."""
if v[3] != "P":
raise ValueError("Only individual PAN cards (4th character 'P') are allowed")
return v