12 KiB
12 KiB
Farm Dashboard API Reference
این سند، API های dashboard را بهصورت کامل توضیح میدهد و برای هر بخش مشخص میکند داده از کجا دریافت میشود.
Endpoint ها
1) دریافت کارتهای داشبورد
- Method:
GET - Path:
/api/farm-dashboard/ - View:
dashboard/views.py:118 - URL config:
dashboard/urls.py:5 - Query param الزامی:
farm_uuid - Auth:
IsAuthenticated
2) دریافت تنظیمات داشبورد
- Method:
GET - Path:
/api/farm-dashboard-config/ - View:
dashboard/views.py:67 - URL config:
dashboard/urls_config.py:5 - Query param الزامی:
farm_uuid - Auth:
IsAuthenticated
3) ویرایش تنظیمات داشبورد
- Method:
PATCH - Path:
/api/farm-dashboard-config/ - View:
dashboard/views.py:67 - Body:
farm_uuid+ هرکدام ازdisabled_card_ids،row_order،enable_drag_reorder - Auth:
IsAuthenticated
نحوه شناسایی مزرعه
- مزرعه از طریق
farm_uuidو مالک کاربر لاگینشده پیدا میشود. - پیادهسازی در
dashboard/views.py:20وdashboard/views.py:22است. - اگر
farm_uuidارسال نشود یا مزرعه برای آن کاربر پیدا نشود، خطای validation برمیگردد.
تنظیمات داشبورد
تنظیمات داشبورد per-farm در دیتابیس ذخیره میشود.
فیلدها
disabled_card_ids: لیست کارتهای غیرفعالrow_order: ترتیب ردیفهاenable_drag_reorder: فعال/غیرفعال بودن drag reorder
مدل ذخیرهسازی
- مدل:
FarmDashboardConfig - فایل:
dashboard/models.py:6 - جدول:
farm_dashboard_configs
مقادیر پیشفرض
- از
dashboard/defaults.py:4وdashboard/defaults.py:30میآید. - کارتهای معتبر در
dashboard/defaults.py:16 - ردیفهای معتبر در
dashboard/defaults.py:4
اعتبارسنجی
- serializer اصلی:
dashboard/serializers.py:6 - serializer patch:
dashboard/serializers.py:43 disabled_card_idsفقط باید ازVALID_CARD_IDSباشد.row_orderباید تمامVALID_ROW_IDSرا دقیقاً یکبار داشته باشد.
نقطه تجمیع اصلی دادهها
تمام کارتها در تابع زیر assemble میشوند:
dashboard/services.py:85
این تابع خروجی چند app مختلف را جمع میکند و response نهایی dashboard را میسازد.
منبع داده هر کارت
farmOverviewKpis
- از کجا ساخته میشود:
dashboard/services.py:41 - نوع: aggregator
- منابع ورودی:
farmHealthScoreازcrop_health.services.get_crop_health_summary_datawaterStressIndexازwater.services.get_water_stress_index_dataavgSoilMoistureازdevice_hub.services.get_sensor_7_in_1_summary_datadisease_riskوpest_riskازpest_detection.services.get_risk_summary_datayield_prediction_cardازyield_harvest.services.get_yield_harvest_summary_data
- نکته مهم: این کارت جدول یا مدل مستقل ندارد؛ از چند سرویس ترکیب میشود.
farmWeatherCard
- از کجا پر میشود:
water/services.py:9 - مدل اصلی:
WeatherForecastLog - فایل مدل:
water/models.py:8 - جدول:
weather_forecast_logs - منطق: جدیدترین رکورد هواشناسی برای همان
farmخوانده میشود.
farmAlertsTracker
- از کجا پر میشود:
farm_alerts/services.py:379 - مدل اصلی:
FarmAlert - فایل مدل:
farm_alerts/models.py:16 - جدول:
farm_alerts - منطق: هشدارهای active مزرعه خوانده میشوند و از روی آنها summary ساخته میشود.
- نکته: با اینکه مدل
FarmAlertTrackerSnapshotهم وجود دارد درfarm_alerts/models.py:76، endpoint فعلی کارت tracker مستقیم ازFarmAlertمیسازد، نه از snapshot.
sensorValuesList
- از کجا پر میشود:
device_hub/services.py:495 - جزء داخلی:
device_hub/services.py:334 - مدلها:
FarmDeviceدرdevice_hub/models.py:45SensorExternalRequestLogدرdevice_hub/models.py:94
- جداول:
farm_sensorssensor_external_request_logs
- منطق:
- اول سنسور اصلی خاک مزرعه پیدا میشود.
- بعد history لاگهای همان device خوانده میشود.
- از payload لاگها، مقادیر سنسورها استخراج میشود.
sensorRadarChart
- از کجا پر میشود:
device_hub/services.py:389 - منبع داده: همان
SensorExternalRequestLogوFarmDevice - منطق: آخرین reading سنسور 7-in-1 گرفته میشود و بر اساس ideal range برای هر فیلد score ساخته میشود.
sensorComparisonChart
- از کجا پر میشود:
device_hub/services.py:412 - منبع داده:
SensorExternalRequestLog - منطق: history چند reading آخر برای رطوبت خاک گرفته میشود و series نمودار ساخته میشود.
anomalyDetectionCard
- از کجا پر میشود:
device_hub/services.py:451 - منبع داده:
SensorExternalRequestLog - منطق: آخرین reading با بازههای ideal مقایسه میشود و anomaly های out-of-range ساخته میشود.
- نکته: در app
farm_alertsیک مدلAnomalyDetectionدرfarm_alerts/models.py:41هم وجود دارد، اما dashboard فعلی این کارت را از آن مدل نمیخواند.
farmAlertsTimeline
- از کجا پر میشود:
farm_alerts/services.py:410 - مدل اصلی:
FarmAlert - فایل مدل:
farm_alerts/models.py:16 - جدول:
farm_alerts - منطق: حداکثر 10 alert آخر مزرعه خوانده میشود.
waterNeedPrediction
- از کجا پر میشود:
water/services.py:58 - مدل اصلی:
IrrigationRecommendationRequest - فایل مدل:
irrigation/models.py:9 - جدول:
irrigation_requests - منطق:
- از
response_payloadآخرین درخواست آبیاری، بخشwater_balance.dailyاستخراج میشود. - سپس
gross_irrigation_mmها تبدیل به series نمودار میشوند.
- از
- نکته: این کارت در app
waterassemble میشود ولی source واقعیاش دادهی persisted آبیاری است.
harvestPredictionCard
- از کجا پر میشود:
yield_harvest/services.py:7 - مدل اصلی:
YieldHarvestPredictionLog - فایل مدل:
yield_harvest/models.py:8 - جدول:
yield_harvest_prediction_logs - منطق: جدیدترین لاگ برداشت/عملکرد مزرعه خوانده میشود.
yieldPredictionChart
- از کجا پر میشود:
yield_harvest/services.py:7 - مدل اصلی:
YieldHarvestPredictionLog - فایل مدل:
yield_harvest/models.py:8 - جدول:
yield_harvest_prediction_logs - منطق:
chart_dataاز همان لاگ برداشت/عملکرد برگردانده میشود.
soilMoistureHeatmap
- از کجا پر میشود:
device_hub/services.py:469 - منبع داده:
SensorExternalRequestLog - مدل کمکی device:
FarmDevice - منطق: چند reading آخر رطوبت خاک به فرمت heatmap/chart تبدیل میشود.
ndviHealthCard
- از کجا پر میشود:
crop_health/services.py:6 - منبع داده فعلی: mock data
- فایل:
crop_health/mock_data.pyاز طریقcrop_health/services.py:3 - منطق: فعلاً از دیتابیس یا external log خوانده نمیشود؛ مستقیم از mock برمیگردد.
recommendationsList
- از کجا ساخته میشود:
dashboard/services.py:54 - نوع: aggregator
- منابع ورودی:
- recommendationهای ذخیرهشده در
Recommendationازfarm_alerts/services.py:459 - پیشنهاد آبیاری از
irrigation/services.py:289 - پیشنهاد کوددهی از
fertilization/services.py:79 - بازه برداشت از
yield_harvest.services.get_yield_harvest_summary_data
- recommendationهای ذخیرهشده در
- مدلهای اصلی:
Recommendationدرfarm_alerts/models.py:59IrrigationRecommendationRequestدرirrigation/models.py:9FertilizationRecommendationRequestدرfertilization/models.py:9YieldHarvestPredictionLogدرyield_harvest/models.py:8
- نکته: این کارت داده چند domain مختلف را یکی میکند و duplicate titleها را حذف میکند.
economicOverview
- از کجا پر میشود:
economic_overview/services.py:7 - مدل اصلی:
EconomicOverviewLog - فایل مدل:
economic_overview/models.py:8 - جدول:
economic_overview_logs - منطق: آخرین لاگ اقتصادی مزرعه خوانده میشود.
منابعی که فعلاً mock هستند
این بخش مهم است، چون user خواسته بداند اطلاعات از کجا میآید:
ndviHealthCardاز mock میآید:crop_health/services.py:6farmHealthScoreکه داخلfarmOverviewKpisاستفاده میشود هم از mock میآید:crop_health/services.py:6disease_riskوpest_riskکه داخلfarmOverviewKpisاستفاده میشوند از mock میآیند:pest_detection/services.py:6
منابعی که از دیتابیس میآیند
- تنظیمات dashboard از
FarmDashboardConfig - weather از
WeatherForecastLog - alerts/timeline از
FarmAlert - recommendationهای ذخیرهشده از
Recommendation - داده آبیاری از
IrrigationRecommendationRequest - داده کوددهی برای recommendation card از
FertilizationRecommendationRequest - برداشت/عملکرد از
YieldHarvestPredictionLog - overview اقتصادی از
EconomicOverviewLog - سنسورها از
FarmDeviceوSensorExternalRequestLog
وابستگی بین app ها در dashboard
تجمیع dashboard در dashboard/services.py:85 به این app ها وابسته است:
watercrop_healtheconomic_overviewfarm_alertsfertilizationirrigationpest_detectiondevice_hubyield_harvest
نمونه flow برای GET /api/farm-dashboard/
- کاربر
farm_uuidرا میفرستد. - در
dashboard/views.py:127مزرعه متعلق به user پیدا میشود. dashboard/services.py:85صدا زده میشود.- این تابع به سرویسهای appهای مختلف call میزند.
- هر سرویس یا از DB میخواند یا از mock/template.
- پاسخ نهایی بهصورت یک object شامل تمام cardها برمیگردد.
نکات مهم عملی
- endpoint کارتها فقط config را برنمیگرداند؛ payload کامل تمام cardها را یکجا برمیگرداند.
- config dashboard از خود کارتها جداست و در endpoint جداگانه مدیریت میشود.
- بعضی کارتها production data دارند، بعضی transitional هستند، و بعضی هنوز mock دارند.
- اگر برای مزرعه دادهای در بعضی جدولها نباشد، معمولاً fallback/template خالی برمیگردد.
فایلهای مرجع مهم
dashboard/views.py:67dashboard/views.py:118dashboard/services.py:85dashboard/defaults.py:4dashboard/serializers.py:6dashboard/models.py:6docs/dashboard_card_service_map.md:1