Files
Ai/dashboard_data/card_utils.py
T
2026-03-22 01:09:09 +03:30

82 lines
2.2 KiB
Python

from datetime import timedelta
from django.utils import timezone
CARD_TTLS = {
"farmOverviewKpis": timedelta(days=3),
"farmWeatherCard": timedelta(days=1),
"farmAlertsTracker": timedelta(days=1),
"sensorValuesList": timedelta(days=1),
"sensorRadarChart": timedelta(days=1),
"sensorComparisonChart": timedelta(days=1),
"anomalyDetectionCard": timedelta(days=1),
"farmAlertsTimeline": timedelta(days=1),
"waterNeedPrediction": timedelta(days=1),
"harvestPredictionCard": timedelta(days=1),
"yieldPredictionChart": timedelta(days=1),
"soilMoistureHeatmap": timedelta(days=1),
"ndviHealthCard": timedelta(days=1),
"recommendationsList": timedelta(days=1),
"economicOverview": timedelta(days=1),
}
WMO_CONDITIONS = {
0: "صاف",
1: "عمدتاً صاف",
2: "نیمه‌ابری",
3: "ابری",
45: "مه",
48: "مه یخ‌زده",
51: "نم‌نم باران",
61: "بارش خفیف",
63: "بارش متوسط",
65: "بارش شدید",
71: "برف خفیف",
80: "رگبار",
95: "رعد و برق",
}
PERSIAN_WEEKDAYS = ["دوشنبه", "سه‌شنبه", "چهارشنبه", "پنج‌شنبه", "جمعه", "شنبه", "یکشنبه"]
def ttl_for_card(card_name: str):
return CARD_TTLS[card_name]
def is_fresh(snapshot) -> bool:
return snapshot and snapshot.expires_at > timezone.now()
def safe_number(value, default=0):
return default if value is None else value
def average(values, default=0):
clean_values = [value for value in values if value is not None]
if not clean_values:
return default
return sum(clean_values) / len(clean_values)
def latest_history_value(history, field_name, default=None):
if not history:
return default
return getattr(history[0], field_name, default)
def compute_trend(current, previous):
current_value = safe_number(current, 0)
previous_value = safe_number(previous, current_value)
diff = round(current_value - previous_value, 1)
return {
"trendNumber": diff,
"trend": "positive" if diff >= 0 else "negative",
}
def weather_condition(weather_code):
return WMO_CONDITIONS.get(weather_code, "نامشخص")