from django.db import models class WeatherParameter(models.Model): """ تعریف پارامترهای هواشناسی (مثلاً دما، بارش، تبخیر-تعرق، ...). """ code = models.CharField( max_length=64, unique=True, db_index=True, help_text="کد یکتا (مثلاً temperature_max)", ) name_fa = models.CharField(max_length=128, help_text="نام فارسی") unit = models.CharField(max_length=32, blank=True, help_text="واحد اندازه‌گیری") created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ["code"] verbose_name = "پارامتر هواشناسی" verbose_name_plural = "پارامترهای هواشناسی" def __str__(self): return f"{self.code} ({self.name_fa})" class WeatherForecast(models.Model): """ پیش‌بینی هواشناسی روزانه (تا ۷ روز آینده) برای یک SoilLocation. داده‌ها شامل دما، بارش، رطوبت، باد و تبخیر-تعرق مرجع (ET0) هستند. """ location = models.ForeignKey( "location_data.SoilLocation", on_delete=models.CASCADE, related_name="weather_forecasts", help_text="موقعیت مکانی مرتبط از جدول SoilLocation", ) forecast_date = models.DateField( db_index=True, help_text="تاریخ پیش‌بینی", ) temperature_min = models.FloatField( null=True, blank=True, help_text="حداقل دمای هوا (°C)" ) temperature_max = models.FloatField( null=True, blank=True, help_text="حداکثر دمای هوا (°C)" ) temperature_mean = models.FloatField( null=True, blank=True, help_text="میانگین دمای هوا (°C)" ) precipitation = models.FloatField( null=True, blank=True, help_text="مجموع بارش (mm)" ) precipitation_probability = models.FloatField( null=True, blank=True, help_text="احتمال بارش (%)" ) humidity_mean = models.FloatField( null=True, blank=True, help_text="میانگین رطوبت نسبی (%)" ) wind_speed_max = models.FloatField( null=True, blank=True, help_text="حداکثر سرعت باد (km/h)" ) et0 = models.FloatField( null=True, blank=True, help_text="تبخیر-تعرق مرجع (ET₀) — mm/day", ) weather_code = models.IntegerField( null=True, blank=True, help_text="کد وضعیت آب‌وهوا (WMO code)", ) fetched_at = models.DateTimeField( auto_now=True, help_text="آخرین زمان واکشی از API", ) created_at = models.DateTimeField(auto_now_add=True) class Meta: constraints = [ models.UniqueConstraint( fields=["location", "forecast_date"], name="weather_unique_location_date", ) ] ordering = ["location", "forecast_date"] verbose_name = "پیش‌بینی هواشناسی" verbose_name_plural = "پیش‌بینی‌های هواشناسی" def __str__(self): return f"WeatherForecast({self.location_id}, {self.forecast_date})" @property def will_rain(self): """آیا بارندگی پیش‌بینی شده است؟""" if self.precipitation is not None: return self.precipitation > 0.0 return None