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, "نامشخص")