UPDATE
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("farm_hub", "0008_product_plant_selector_fields"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="farmhub",
|
||||
name="irrigation_method_id",
|
||||
field=models.IntegerField(blank=True, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="farmhub",
|
||||
name="irrigation_method_name",
|
||||
field=models.CharField(blank=True, default="", max_length=255),
|
||||
),
|
||||
]
|
||||
@@ -103,6 +103,8 @@ class FarmHub(models.Model):
|
||||
)
|
||||
name = models.CharField(max_length=255)
|
||||
is_active = models.BooleanField(default=True)
|
||||
irrigation_method_id = models.IntegerField(null=True, blank=True)
|
||||
irrigation_method_name = models.CharField(max_length=255, blank=True, default="")
|
||||
current_crop_area = models.ForeignKey(
|
||||
"crop_zoning.CropArea",
|
||||
on_delete=models.SET_NULL,
|
||||
|
||||
@@ -15,6 +15,8 @@ ADMIN_FARM_UUID = uuid.UUID("11111111-1111-1111-1111-111111111111")
|
||||
ADMIN_FARM_DATA = {
|
||||
"name": "Admin Smart Farm",
|
||||
"is_active": True,
|
||||
"irrigation_method_id": 1,
|
||||
"irrigation_method_name": "آبیاری قطره ای",
|
||||
"sensors": [
|
||||
{
|
||||
"sensor_catalog_code": "sensor_7_soil_moisture_sensor_v1_2",
|
||||
@@ -81,6 +83,8 @@ def seed_admin_farm():
|
||||
"farm_type": farm_type,
|
||||
"name": ADMIN_FARM_DATA["name"],
|
||||
"is_active": ADMIN_FARM_DATA["is_active"],
|
||||
"irrigation_method_id": ADMIN_FARM_DATA["irrigation_method_id"],
|
||||
"irrigation_method_name": ADMIN_FARM_DATA["irrigation_method_name"],
|
||||
},
|
||||
)
|
||||
farm.products.set(products)
|
||||
|
||||
+13
-3
@@ -72,6 +72,8 @@ class FarmHubSerializer(serializers.ModelSerializer):
|
||||
"area_uuid",
|
||||
"name",
|
||||
"is_active",
|
||||
"irrigation_method_id",
|
||||
"irrigation_method_name",
|
||||
"farm_type",
|
||||
"subscription_plan",
|
||||
"products",
|
||||
@@ -128,7 +130,8 @@ class FarmHubCreateSerializer(serializers.ModelSerializer):
|
||||
sensors = FarmSensorWriteSerializer(many=True, required=False)
|
||||
sensor_key = serializers.CharField(write_only=True, required=False, allow_blank=True, default="sensor-7-1")
|
||||
sensor_payload = serializers.JSONField(write_only=True, required=False)
|
||||
irrigation_method_id = serializers.IntegerField(write_only=True, required=False, allow_null=True)
|
||||
irrigation_method_id = serializers.IntegerField(required=False, allow_null=True)
|
||||
irrigation_method_name = serializers.CharField(required=False, allow_blank=True)
|
||||
|
||||
class Meta:
|
||||
model = FarmHub
|
||||
@@ -144,6 +147,7 @@ class FarmHubCreateSerializer(serializers.ModelSerializer):
|
||||
"sensor_key",
|
||||
"sensor_payload",
|
||||
"irrigation_method_id",
|
||||
"irrigation_method_name",
|
||||
]
|
||||
|
||||
def to_internal_value(self, data):
|
||||
@@ -217,13 +221,20 @@ class FarmHubCreateSerializer(serializers.ModelSerializer):
|
||||
attrs["farm_type"] = farm_type
|
||||
attrs["subscription_plan"] = subscription_plan
|
||||
attrs["products"] = products
|
||||
|
||||
irrigation_method_id = attrs.get("irrigation_method_id", serializers.empty)
|
||||
irrigation_method_name = attrs.get("irrigation_method_name", serializers.empty)
|
||||
if irrigation_method_id is None:
|
||||
attrs["irrigation_method_name"] = ""
|
||||
elif irrigation_method_name is serializers.empty and self.instance is not None:
|
||||
attrs["irrigation_method_name"] = self.instance.irrigation_method_name
|
||||
|
||||
return attrs
|
||||
|
||||
def create(self, validated_data):
|
||||
validated_data.pop("area_geojson", None)
|
||||
validated_data.pop("sensor_key", None)
|
||||
validated_data.pop("sensor_payload", None)
|
||||
validated_data.pop("irrigation_method_id", None)
|
||||
sensors_data = validated_data.pop("sensors", [])
|
||||
products = validated_data.pop("products", [])
|
||||
validated_data["farm_type"] = validated_data.pop("farm_type")
|
||||
@@ -243,7 +254,6 @@ class FarmHubCreateSerializer(serializers.ModelSerializer):
|
||||
validated_data.pop("area_geojson", None)
|
||||
validated_data.pop("sensor_key", None)
|
||||
validated_data.pop("sensor_payload", None)
|
||||
validated_data.pop("irrigation_method_id", None)
|
||||
sensors_data = validated_data.pop("sensors", None)
|
||||
products = validated_data.pop("products", None)
|
||||
farm_type = validated_data.pop("farm_type", None)
|
||||
|
||||
@@ -73,8 +73,11 @@ def sync_farm_data(
|
||||
if plant_ids:
|
||||
request_payload["plant_ids"] = [int(plant_id) for plant_id in plant_ids]
|
||||
|
||||
if irrigation_method_id is not None:
|
||||
request_payload["irrigation_method_id"] = int(irrigation_method_id)
|
||||
resolved_irrigation_method_id = irrigation_method_id
|
||||
if resolved_irrigation_method_id is None:
|
||||
resolved_irrigation_method_id = farm.irrigation_method_id
|
||||
if resolved_irrigation_method_id is not None:
|
||||
request_payload["irrigation_method_id"] = int(resolved_irrigation_method_id)
|
||||
|
||||
if not any(key in request_payload for key in ("sensor_payload", "plant_ids", "irrigation_method_id")):
|
||||
raise FarmDataSyncError(
|
||||
@@ -112,7 +115,7 @@ def create_farm_with_zoning(serializer, owner):
|
||||
area_feature = serializer.validated_data.pop("area_geojson", None) or get_default_area_feature()
|
||||
sensor_key = serializer.validated_data.pop("sensor_key", "sensor-7-1")
|
||||
sensor_payload = serializer.validated_data.pop("sensor_payload", None)
|
||||
irrigation_method_id = serializer.validated_data.pop("irrigation_method_id", None)
|
||||
irrigation_method_id = serializer.validated_data.get("irrigation_method_id", None)
|
||||
|
||||
with transaction.atomic():
|
||||
farm = serializer.save(owner=owner)
|
||||
|
||||
@@ -66,6 +66,8 @@ class FarmListCreateViewTests(TestCase):
|
||||
"farm_type_uuid": str(self.farm_type.uuid),
|
||||
"subscription_plan_uuid": str(self.plan.uuid),
|
||||
"product_uuids": [str(self.wheat.uuid)],
|
||||
"irrigation_method_id": 3,
|
||||
"irrigation_method_name": "Drip",
|
||||
"sensors": [
|
||||
{
|
||||
"sensor_catalog_uuid": str(self.weather_station.uuid),
|
||||
@@ -88,6 +90,8 @@ class FarmListCreateViewTests(TestCase):
|
||||
self.assertEqual(response.data["code"], 201)
|
||||
self.assertEqual(response.data["data"]["name"], "farm-1")
|
||||
self.assertEqual(response.data["data"]["subscription_plan"]["code"], self.plan.code)
|
||||
self.assertEqual(response.data["data"]["irrigation_method_id"], 3)
|
||||
self.assertEqual(response.data["data"]["irrigation_method_name"], "Drip")
|
||||
self.assertIn("zoning", response.data["data"])
|
||||
self.assertIsNotNone(response.data["data"]["area_uuid"])
|
||||
self.assertEqual(len(response.data["data"]["sensors"]), 1)
|
||||
@@ -107,6 +111,7 @@ class FarmListCreateViewTests(TestCase):
|
||||
"farm_uuid": response.data["data"]["farm_uuid"],
|
||||
"farm_boundary": AREA_GEOJSON["geometry"],
|
||||
"plant_ids": [self.wheat.id],
|
||||
"irrigation_method_id": 3,
|
||||
},
|
||||
headers={
|
||||
"Accept": "application/json",
|
||||
@@ -223,6 +228,7 @@ class FarmListCreateViewTests(TestCase):
|
||||
},
|
||||
"sensor_payload": {"soil_moisture": 45.2},
|
||||
"irrigation_method_id": 3,
|
||||
"irrigation_method_name": "Drip",
|
||||
},
|
||||
format="json",
|
||||
)
|
||||
@@ -233,6 +239,8 @@ class FarmListCreateViewTests(TestCase):
|
||||
self.assertEqual(response.status_code, 200)
|
||||
farm.refresh_from_db()
|
||||
self.assertIsNotNone(farm.current_crop_area)
|
||||
self.assertEqual(farm.irrigation_method_id, 3)
|
||||
self.assertEqual(farm.irrigation_method_name, "Drip")
|
||||
mock_external_api_request.assert_called_once_with(
|
||||
"ai",
|
||||
"/api/farm-data/",
|
||||
@@ -279,6 +287,8 @@ class FarmSeedTests(TestCase):
|
||||
self.assertEqual(farm.farm_uuid.hex, "11111111111111111111111111111111")
|
||||
self.assertEqual(CropArea.objects.count(), 1)
|
||||
self.assertEqual(farm.sensors.count(), 1)
|
||||
self.assertEqual(farm.irrigation_method_id, 1)
|
||||
self.assertEqual(farm.irrigation_method_name, "آبیاری قطره ای")
|
||||
self.assertIsNotNone(farm.sensors.first().physical_device_uuid)
|
||||
self.assertTrue(SensorCatalog.objects.filter(code="sensor_7_soil_moisture_sensor_v1_2").exists())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user