| """
|
| Database Models & Schemas for Climate-Resilient Agricultural Platform
|
| ======================================================================
|
| Handles user profiles, alert configurations, and historical data
|
| """
|
|
|
| from pydantic import BaseModel, Field
|
| from typing import Optional, List, Dict
|
| from datetime import datetime
|
| from enum import Enum
|
|
|
|
|
|
|
|
|
|
|
| class AlertSeverity(str, Enum):
|
| CRITICAL = "CRITICAL"
|
| HIGH = "HIGH"
|
| MEDIUM = "MEDIUM"
|
| LOW = "LOW"
|
| INFO = "INFO"
|
|
|
| class CropType(str, Enum):
|
| RICE = "RICE"
|
| WHEAT = "WHEAT"
|
| CORN = "CORN"
|
| COTTON = "COTTON"
|
| SUGARCANE = "SUGARCANE"
|
| POTATO = "POTATO"
|
| TOMATO = "TOMATO"
|
| ONION = "ONION"
|
| SOYBEAN = "SOYBEAN"
|
| BANANA = "BANANA"
|
| CITRUS = "CITRUS"
|
| OTHER = "OTHER"
|
|
|
| class Season(str, Enum):
|
| RABI = "RABI"
|
| KHARIF = "KHARIF"
|
| ANNUAL = "ANNUAL"
|
|
|
| class IrrigationType(str, Enum):
|
| DRIP = "DRIP"
|
| FLOOD = "FLOOD"
|
| SPRINKLER = "SPRINKLER"
|
| FURROW = "FURROW"
|
|
|
|
|
|
|
|
|
|
|
| class FarmerProfile(BaseModel):
|
| farmer_id: str
|
| name: str
|
| phone: str
|
| telegram_chat_id: Optional[str] = None
|
| email: Optional[str] = None
|
| village: str
|
| latitude: float
|
| longitude: float
|
| crop_type: CropType
|
| soil_type: str
|
| motor_capacity: float = 10.0
|
| irrigation_type: IrrigationType = IrrigationType.DRIP
|
| season: Season = Season.ANNUAL
|
| crop_age: int = 0
|
| farm_size_hectares: float = 1.0
|
| alert_preferences: Dict[str, bool] = Field(default_factory=lambda: {
|
| "weather": True,
|
| "pest": True,
|
| "irrigation": True,
|
| "sustainability": True,
|
| "climate_warning": True
|
| })
|
| contact_preference: str = "telegram"
|
| threshold_settings: Dict[str, float] = Field(default_factory=lambda: {
|
| "temp_high": 40,
|
| "temp_low": 5,
|
| "wind_speed": 30,
|
| "wind_alert": 15,
|
| "rain_threshold": 10
|
| })
|
| registered_at: datetime = Field(default_factory=datetime.now)
|
|
|
|
|
|
|
|
|
|
|
| class WeatherAlert(BaseModel):
|
| alert_type: str
|
| temperature: float
|
| humidity: float
|
| wind_speed: float
|
| condition: str
|
| action: str
|
| severity: AlertSeverity
|
| lead_time: str
|
|
|
| class PestAlert(BaseModel):
|
| pest_name: str
|
| risk_level: AlertSeverity
|
| confidence: float
|
| recommended_action: str
|
| spray_timing: str
|
| product_suggestion: Optional[str] = None
|
|
|
| class IrrigationAlert(BaseModel):
|
| water_needed_m3_per_sqm: float
|
| irrigation_duration_minutes: int
|
| best_time_window: str
|
| urgency: AlertSeverity
|
| reason: str
|
|
|
| class SustainabilityAlert(BaseModel):
|
| tip_category: str
|
| action: str
|
| impact: str
|
| implementation_time: str
|
| expected_benefit: str
|
|
|
| class ClimateResilienceScore(BaseModel):
|
| total_score: float
|
| weather_risk: float
|
| pest_risk: float
|
| water_risk: float
|
| resilience_level: str
|
| critical_factors: List[str]
|
| improvement_suggestions: List[str]
|
|
|
| class FarmAlert(BaseModel):
|
| alert_id: str
|
| farmer_id: str
|
| timestamp: datetime
|
| severity: AlertSeverity
|
| category: str
|
| title: str
|
| message: str
|
| detailed_data: Dict
|
| action_required: bool
|
| suggested_action: str
|
| sent: bool = False
|
| sent_via: Optional[List[str]] = None
|
|
|
| class AlertHistory(BaseModel):
|
| farmer_id: str
|
| total_alerts_today: int
|
| critical_alerts: int
|
| high_alerts: int
|
| medium_alerts: int
|
| actions_taken: int
|
| last_alert_time: Optional[datetime] = None
|
|
|
|
|
|
|
|
|
|
|
| class DashboardResponse(BaseModel):
|
| farmer_id: str
|
| farmer_profile: FarmerProfile
|
| current_conditions: Dict
|
| climate_resilience_score: ClimateResilienceScore
|
| active_alerts: List[FarmAlert]
|
| weather_forecast: List[Dict]
|
| pest_predictions: List[PestAlert]
|
| irrigation_recommendations: IrrigationAlert
|
| sustainability_tips: List[SustainabilityAlert]
|
| generated_at: datetime = Field(default_factory=datetime.now)
|
| next_critical_window: Optional[str] = None
|
|
|
|
|
|
|
|
|
|
|
| class HealthResponse(BaseModel):
|
| status: str
|
| timestamp: datetime
|
| services: Dict[str, str]
|
| message: str
|
|
|
| class WebSocketAlert(BaseModel):
|
| event_type: str
|
| farmer_id: str
|
| data: Dict
|
| timestamp: datetime = Field(default_factory=datetime.now)
|
|
|