82 lines
2.2 KiB
Python
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, "نامشخص")
|
|
|