From f34d5dd198d412ca89879c10cd163203492726ce Mon Sep 17 00:00:00 2001 From: Mohammad Sajad Pourajam Date: Sat, 2 May 2026 06:16:36 +0330 Subject: [PATCH] UPDATE --- AI_ROUTE_CONNECTION_AUDIT.md | 10 ++++---- API_USAGE_AUDIT_REQUESTED_ENDPOINTS.md | 18 ++++++------- api_changes_last_6_commits_combined.md | 24 +++++++++--------- celerybeat-schedule | Bin 16384 -> 16384 bytes config/feature.json | 4 +-- config/settings.py | 4 +-- config/urls.py | 4 +-- dashboard/services.py | 4 +-- docs/dashboard_card_service_map.md | 12 ++++----- .../recommend_task_status_frontend_backend.md | 2 +- .../__init__.py | 0 .../apps.py | 5 ++-- .../migrations/0001_initial.py | 4 +-- .../0002_recommendation_status_lifecycle.py | 4 +-- .../migrations/__init__.py | 0 .../mock_data.py | 0 .../models.py | 4 +-- .../postman/fertilization_recommendation.json | 0 .../serializers.py | 0 .../services.py | 0 .../tests.py | 6 ++--- .../urls.py | 0 .../views.py | 2 +- .../API_REFERENCE_FA.md | 2 +- .../__init__.py | 0 .../apps.py | 5 ++-- .../migrations/0001_initial.py | 4 +-- ..._recommendation_status_and_growth_stage.py | 2 +- .../migrations/__init__.py | 0 .../mock_data.py | 0 .../models.py | 4 +-- .../postman/irrigation_recommendation.json | 0 .../serializers.py | 0 .../services.py | 0 .../tests.py | 12 ++++----- .../urls.py | 0 .../views.py | 2 +- water/services.py | 2 +- 38 files changed, 71 insertions(+), 69 deletions(-) rename {fertilization_recommendation => fertilization}/__init__.py (100%) rename {fertilization_recommendation => fertilization}/apps.py (59%) rename {fertilization_recommendation => fertilization}/migrations/0001_initial.py (92%) rename {fertilization_recommendation => fertilization}/migrations/0002_recommendation_status_lifecycle.py (87%) rename {fertilization_recommendation => fertilization}/migrations/__init__.py (100%) rename {fertilization_recommendation => fertilization}/mock_data.py (100%) rename {fertilization_recommendation => fertilization}/models.py (92%) rename {fertilization_recommendation => fertilization}/postman/fertilization_recommendation.json (100%) rename {fertilization_recommendation => fertilization}/serializers.py (100%) rename {fertilization_recommendation => fertilization}/services.py (100%) rename {fertilization_recommendation => fertilization}/tests.py (98%) rename {fertilization_recommendation => fertilization}/urls.py (100%) rename {fertilization_recommendation => fertilization}/views.py (99%) rename {irrigation_recommendation => irrigation}/API_REFERENCE_FA.md (99%) rename {irrigation_recommendation => irrigation}/__init__.py (100%) rename {irrigation_recommendation => irrigation}/apps.py (60%) rename {irrigation_recommendation => irrigation}/migrations/0001_initial.py (91%) rename {irrigation_recommendation => irrigation}/migrations/0002_recommendation_status_and_growth_stage.py (94%) rename {irrigation_recommendation => irrigation}/migrations/__init__.py (100%) rename {irrigation_recommendation => irrigation}/mock_data.py (100%) rename {irrigation_recommendation => irrigation}/models.py (93%) rename {irrigation_recommendation => irrigation}/postman/irrigation_recommendation.json (100%) rename {irrigation_recommendation => irrigation}/serializers.py (100%) rename {irrigation_recommendation => irrigation}/services.py (100%) rename {irrigation_recommendation => irrigation}/tests.py (97%) rename {irrigation_recommendation => irrigation}/urls.py (100%) rename {irrigation_recommendation => irrigation}/views.py (99%) diff --git a/AI_ROUTE_CONNECTION_AUDIT.md b/AI_ROUTE_CONNECTION_AUDIT.md index 2784191..eb79070 100644 --- a/AI_ROUTE_CONNECTION_AUDIT.md +++ b/AI_ROUTE_CONNECTION_AUDIT.md @@ -17,9 +17,9 @@ | `POST /api/farm-data/` | بله | `farm_hub/services.py:166`, `farm_hub/services.py:89`, `sensor_external_api/services.py:165`, `sensor_external_api/services.py:125` | | `POST /api/weather/water-need-prediction/` | بله | `water/views.py:136` | | `POST /api/economy/overview/` | بله | `economic_overview/views.py:73` | -| `GET /api/irrigation/` | بله | `irrigation_recommendation/views.py:78` | -| `POST /api/irrigation/recommend/` | بله | `irrigation_recommendation/views.py:165` | -| `POST /api/fertilization/recommend/` | بله | `fertilization_recommendation/views.py:122` | +| `GET /api/irrigation/` | بله | `irrigation/views.py:78` | +| `POST /api/irrigation/recommend/` | بله | `irrigation/views.py:165` | +| `POST /api/fertilization/recommend/` | بله | `fertilization/views.py:122` | | `POST /api/crop-simulation/growth/` | بله | `yield_harvest/views.py:247` | | `GET /api/crop-simulation/growth//status/` | بله | `yield_harvest/views.py:293` | | `POST /api/crop-simulation/current-farm-chart/` | بله | `yield_harvest/views.py:145`, `yield_harvest/views.py:162` | @@ -31,12 +31,12 @@ | API درخواستی | وضعیت | route واقعی AI در کد | شواهد | |---|---|---|---| | `POST /api/weather/farm-card/` | با همین route به AI وصل نیست | `GET /weather-forecast/card` | `water/views.py:49` | -| `POST /api/irrigation/water-stress/` | با همین route به AI وصل نیست | `GET /api/water/stress-index/` | `irrigation_recommendation/views.py:246` | +| `POST /api/irrigation/water-stress/` | با همین route به AI وصل نیست | `GET /api/water/stress-index/` | `irrigation/views.py:246` | | `POST /api/pest-disease/detect/` | با همین route به AI وصل نیست | `POST /api/pest-detection/analyze/` | `pest_detection/views.py:161` | | `POST /api/pest-disease/risk/` | با همین route به AI وصل نیست | `POST /api/pest-detection/risk/` | `pest_detection/views.py:202` | | `POST /api/pest-disease/risk-summary/` | با همین route به AI وصل نیست | `GET /api/pest-detection/risk-summary/` | `pest_detection/views.py:235` | | `POST /api/soil-data/ndvi-health/` | با همین route به AI وصل نیست | برای این path اتصال AI پیدا نشد؛ endpoint محلی پروژه با path دیگری ارائه شده | `crop_health/urls.py:6`, `crop_health/tests.py:82` | -| `POST /api/irrigation/` | route به AI با همین method پیدا نشد | فقط `GET /api/irrigation/` در کد استفاده می‌شود | `irrigation_recommendation/views.py:78` | +| `POST /api/irrigation/` | route به AI با همین method پیدا نشد | فقط `GET /api/irrigation/` در کد استفاده می‌شود | `irrigation/views.py:78` | ## متصل نیستند diff --git a/API_USAGE_AUDIT_REQUESTED_ENDPOINTS.md b/API_USAGE_AUDIT_REQUESTED_ENDPOINTS.md index 6bf529b..3966cc2 100644 --- a/API_USAGE_AUDIT_REQUESTED_ENDPOINTS.md +++ b/API_USAGE_AUDIT_REQUESTED_ENDPOINTS.md @@ -14,10 +14,10 @@ |---|---|---| | `POST /api/weather/farm-card/` | فعال و استفاده‌شده | `water/weather_urls.py`, `water/views.py`, `water/tests.py` | | `POST /api/economy/overview/` | فعال و استفاده‌شده | `economic_overview/urls.py`, `economic_overview/views.py`, `FRONTEND_PAGES_APIS_GUIDE.md` | -| `GET /api/irrigation/` | فعال و استفاده‌شده | `irrigation_recommendation/urls.py`, `irrigation_recommendation/views.py`, `API_DATA_SOURCE_AUDIT_FA.md` | -| `POST /api/irrigation/recommend/` | فعال و استفاده‌شده | `irrigation_recommendation/urls.py`, `irrigation_recommendation/views.py`, `irrigation_recommendation/tests.py` | -| `POST /api/irrigation/water-stress/` | فعال و استفاده‌شده | `irrigation_recommendation/urls.py`, `irrigation_recommendation/tests.py` | -| `POST /api/fertilization/recommend/` | فعال و استفاده‌شده | `fertilization_recommendation/urls.py`, `fertilization_recommendation/views.py`, `API_DATA_SOURCE_AUDIT_FA.md` | +| `GET /api/irrigation/` | فعال و استفاده‌شده | `irrigation/urls.py`, `irrigation/views.py`, `API_DATA_SOURCE_AUDIT_FA.md` | +| `POST /api/irrigation/recommend/` | فعال و استفاده‌شده | `irrigation/urls.py`, `irrigation/views.py`, `irrigation/tests.py` | +| `POST /api/irrigation/water-stress/` | فعال و استفاده‌شده | `irrigation/urls.py`, `irrigation/tests.py` | +| `POST /api/fertilization/recommend/` | فعال و استفاده‌شده | `fertilization/urls.py`, `fertilization/views.py`, `API_DATA_SOURCE_AUDIT_FA.md` | ## 2) در پروژه استفاده شده‌اند، اما به عنوان endpoint مستقیم backend اکسپوز نیستند @@ -61,11 +61,11 @@ | `POST /api/pest-disease/detect/` | استفاده نمی‌شود | endpoint واقعی پروژه `POST /api/pest-detection/analyze/` است | `pest_detection/urls.py`, `pest_detection/views.py` | | `POST /api/pest-disease/risk/` | استفاده نمی‌شود | endpoint واقعی پروژه `POST /api/pest-detection/risk/` است | `pest_detection/urls.py`, `pest_detection/views.py` | | `POST /api/pest-disease/risk-summary/` | استفاده نمی‌شود | path و method هر دو متفاوت‌اند؛ endpoint واقعی `GET /api/pest-detection/risk-summary/` است | `pest_detection/urls.py`, `pest_detection/views.py`, `pest_detection/tests.py` | -| `POST /api/irrigation/` | استفاده نمی‌شود | path وجود دارد ولی فقط `GET` list پیاده‌سازی شده | `irrigation_recommendation/urls.py`, `irrigation_recommendation/views.py` | -| `GET /api/irrigation//` | استفاده نمی‌شود | route detail پیدا نشد | `irrigation_recommendation/urls.py` | -| `PUT /api/irrigation//` | استفاده نمی‌شود | route detail/update پیدا نشد | `irrigation_recommendation/urls.py` | -| `PATCH /api/irrigation//` | استفاده نمی‌شود | route detail/update پیدا نشد | `irrigation_recommendation/urls.py` | -| `DELETE /api/irrigation//` | استفاده نمی‌شود | route detail/delete پیدا نشد | `irrigation_recommendation/urls.py` | +| `POST /api/irrigation/` | استفاده نمی‌شود | path وجود دارد ولی فقط `GET` list پیاده‌سازی شده | `irrigation/urls.py`, `irrigation/views.py` | +| `GET /api/irrigation//` | استفاده نمی‌شود | route detail پیدا نشد | `irrigation/urls.py` | +| `PUT /api/irrigation//` | استفاده نمی‌شود | route detail/update پیدا نشد | `irrigation/urls.py` | +| `PATCH /api/irrigation//` | استفاده نمی‌شود | route detail/update پیدا نشد | `irrigation/urls.py` | +| `DELETE /api/irrigation//` | استفاده نمی‌شود | route detail/delete پیدا نشد | `irrigation/urls.py` | ## 4) جمع‌بندی سریع diff --git a/api_changes_last_6_commits_combined.md b/api_changes_last_6_commits_combined.md index 8c68f76..bf03911 100644 --- a/api_changes_last_6_commits_combined.md +++ b/api_changes_last_6_commits_combined.md @@ -2,8 +2,8 @@ این فایل تغییرات مربوط به سه فایل زیر را نسبت به **۶ کامیت قبل** (`HEAD~6`) مستند می‌کند: -- `irrigation_recommendation/urls.py` -- `fertilization_recommendation/apps.py` +- `irrigation/urls.py` +- `fertilization/apps.py` - `farm_ai_assistant/views.py` ## بازه مقایسه @@ -11,11 +11,11 @@ - مقصد: `HEAD` ## نتیجه سریع -- در `irrigation_recommendation/urls.py`، API آبیاری از مدل دارای endpoint بررسی وضعیت task فاصله گرفته و دو endpoint جدید برای لیست روش‌های آبیاری و water stress اضافه شده است. -- در `fertilization_recommendation/apps.py`، در این بازه **هیچ تغییری** ثبت نشده است. +- در `irrigation/urls.py`، API آبیاری از مدل دارای endpoint بررسی وضعیت task فاصله گرفته و دو endpoint جدید برای لیست روش‌های آبیاری و water stress اضافه شده است. +- در `fertilization/apps.py`، در این بازه **هیچ تغییری** ثبت نشده است. - در `farm_ai_assistant/views.py`، API چت از flow مبتنی بر task/polling به flow مستقیم request/response تغییر کرده و پشتیبانی از `history`، `image_urls` و ورودی‌های multipart/JSON بهتر شده است. -## 1) تغییرات `irrigation_recommendation/urls.py` +## 1) تغییرات `irrigation/urls.py` ### وضعیت قبلی مسیرهای زیر وجود داشتند: @@ -33,7 +33,7 @@ ### تغییرات دقیق #### الف) اضافه شدن endpoint ریشه برای لیست روش‌های آبیاری مسیر جدید: -- `GET irrigation_recommendation/` +- `GET irrigation/` - view: `IrrigationMethodListView` - name: `irrigation-method-list` @@ -52,7 +52,7 @@ #### ج) اضافه شدن endpoint جدید water stress مسیر جدید: -- `POST irrigation_recommendation/water-stress/` +- `POST irrigation/water-stress/` - view: `WaterStressView` - name: `irrigation-water-stress` @@ -63,18 +63,18 @@ - `config/` - `recommend/` -## 2) تغییرات `fertilization_recommendation/apps.py` +## 2) تغییرات `fertilization/apps.py` در بازه `HEAD~6..HEAD` برای این فایل **هیچ diffای وجود ندارد**. ### وضعیت فعلی و قبلی یکسان است مقدارهای مهم بدون تغییر مانده‌اند: - `default_auto_field = "django.db.models.BigAutoField"` -- `name = "fertilization_recommendation"` +- `name = "fertilization"` - `verbose_name = "Fertilization Recommendation"` ### نتیجه -- از نظر ثبت app در Django، در این ۶ کامیت اخیر تغییری در `fertilization_recommendation/apps.py` اعمال نشده است. +- از نظر ثبت app در Django، در این ۶ کامیت اخیر تغییری در `fertilization/apps.py` اعمال نشده است. - اگر منظورت بررسی APIهای recommendation بوده، این فایل خودش route یا view API ندارد و فقط تنظیمات app را نگه می‌دارد. ## 3) تغییرات `farm_ai_assistant/views.py` @@ -215,12 +215,12 @@ API چت از این مدل: ## جمع‌بندی نهایی در این ۶ کامیت اخیر: -- `irrigation_recommendation/urls.py` +- `irrigation/urls.py` - endpoint بررسی وضعیت task حذف شده - endpoint ریشه برای لیست روش‌های آبیاری اضافه شده - endpoint جدید `water-stress/` اضافه شده -- `fertilization_recommendation/apps.py` +- `fertilization/apps.py` - هیچ تغییری نداشته است - `farm_ai_assistant/views.py` diff --git a/celerybeat-schedule b/celerybeat-schedule index ab42b15d2f50f83aed694d4bed505cb9867da4d2..c271c6a8c075ce030d4ae6248fcc762a00242185 100644 GIT binary patch delta 27 icmZo@U~Fh$+|X{!#>BwDz{oWDqd_2}-RAqoiaY>q5(lmT delta 27 icmZo@U~Fh$+|X{!#>l|HsD5wqM}t5{+s*fl6?p)8M+mO~ diff --git a/config/feature.json b/config/feature.json index d8bffa1..dbb8f4a 100644 --- a/config/feature.json +++ b/config/feature.json @@ -9,8 +9,8 @@ "plant_simulator": "plant_simulator", "pest_detection": "pest_detection", "sensor_7_in_1": "sensor-7-in-1", - "irrigation_recommendation": "irrigation_recommendation", - "fertilization_recommendation": "fertilization_recommendation", + "irrigation": "irrigation", + "fertilization": "fertilization", "farm_ai_assistant": "farm_ai_assistant", "notifications": "notifications", "external_api_adapter": "external_api_adapter", diff --git a/config/settings.py b/config/settings.py index 4ae7048..bffa67e 100644 --- a/config/settings.py +++ b/config/settings.py @@ -49,11 +49,11 @@ INSTALLED_APPS = [ "pest_detection", "sensor_7_in_1.apps.Sensor7In1Config", "water.apps.WaterConfig", - "irrigation_recommendation", + "irrigation", "yield_harvest.apps.YieldHarvestConfig", "economic_overview.apps.EconomicOverviewConfig", "farm_alerts.apps.FarmAlertsConfig", - "fertilization_recommendation", + "fertilization", "farm_ai_assistant", "notifications.apps.NotificationsConfig", "plants.apps.PlantsConfig", diff --git a/config/urls.py b/config/urls.py index 5ae6c85..d885039 100644 --- a/config/urls.py +++ b/config/urls.py @@ -25,13 +25,13 @@ urlpatterns = [ path("api/pest-disease/", include("pest_detection.pest_disease_urls")), path("api/sensor-7-in-1/", include("sensor_7_in_1.urls")), path("api/sensors/", include("sensor_7_in_1.comparison_urls")), - path("api/irrigation/", include("irrigation_recommendation.urls")), + path("api/irrigation/", include("irrigation.urls")), path("api/weather/", include("water.weather_urls")), path("api/water/", include("water.urls")), path("api/economy/", include("economic_overview.urls")), - path("api/fertilization/", include("fertilization_recommendation.urls")), + path("api/fertilization/", include("fertilization.urls")), path("api/farm-ai-assistant/", include("farm_ai_assistant.urls")), path("api/notifications/", include("notifications.urls")), path("api/farm-alerts/", include("farm_alerts.urls")), diff --git a/dashboard/services.py b/dashboard/services.py index 26ce700..4167961 100644 --- a/dashboard/services.py +++ b/dashboard/services.py @@ -12,8 +12,8 @@ from farm_alerts.services import ( get_alert_tracker_data, get_recommendations_list_data, ) -from fertilization_recommendation.services import get_fertilization_dashboard_recommendation -from irrigation_recommendation.services import get_irrigation_dashboard_recommendation +from fertilization.services import get_fertilization_dashboard_recommendation +from irrigation.services import get_irrigation_dashboard_recommendation from pest_detection.services import get_risk_summary_data from sensor_7_in_1.services import ( get_sensor_7_in_1_summary_data, diff --git a/docs/dashboard_card_service_map.md b/docs/dashboard_card_service_map.md index 6be2b88..3ca8c35 100644 --- a/docs/dashboard_card_service_map.md +++ b/docs/dashboard_card_service_map.md @@ -109,10 +109,10 @@ - app aggregator call: `water` - service: `water/services.py` -> `get_water_need_prediction_data` -- source واقعی داده: `irrigation_recommendation.models.IrrigationRecommendationRequest` +- source واقعی داده: `irrigation.models.IrrigationRecommendationRequest` - منطق: از `response_payload` آخرین recommendation آبیاری، `water_balance.daily` را می خواند. -نکته مهم: تابعی با همین نام در `irrigation_recommendation/services.py` هم وجود دارد، اما داشبورد فعلی نسخه `water` را صدا می زند. پس منبع business data عملا app آبیاری است، ولی facade فعلی داخل app `water` قرار دارد. +نکته مهم: تابعی با همین نام در `irrigation/services.py` هم وجود دارد، اما داشبورد فعلی نسخه `water` را صدا می زند. پس منبع business data عملا app آبیاری است، ولی facade فعلی داخل app `water` قرار دارد. ### 10) `harvestPredictionCard` @@ -150,10 +150,10 @@ - `farm_alerts.services.get_recommendations_list_data` - model/source: `farm_alerts.models.Recommendation` -- `irrigation_recommendation.services.get_irrigation_dashboard_recommendation` - - model/source: `irrigation_recommendation.models.IrrigationRecommendationRequest` -- `fertilization_recommendation.services.get_fertilization_dashboard_recommendation` - - model/source: `fertilization_recommendation.models.FertilizationRecommendationRequest` +- `irrigation.services.get_irrigation_dashboard_recommendation` + - model/source: `irrigation.models.IrrigationRecommendationRequest` +- `fertilization.services.get_fertilization_dashboard_recommendation` + - model/source: `fertilization.models.FertilizationRecommendationRequest` - `yield_harvest.services.get_yield_harvest_summary_data` - برای ساخت recommendation مرتبط با بازه برداشت diff --git a/docs/recommend_task_status_frontend_backend.md b/docs/recommend_task_status_frontend_backend.md index 6d9d98e..148f08e 100644 --- a/docs/recommend_task_status_frontend_backend.md +++ b/docs/recommend_task_status_frontend_backend.md @@ -1,6 +1,6 @@ # Recommend Task Status API Guide -این فایل برای تیم فرانت‌اند توضیح می‌دهد که برای ماژول‌های `fertilization_recommendation` و `irrigation_recommendation` چه درخواست‌هایی باید به بک‌اند ارسال شود و چه پاسخ‌هایی باید دریافت شود. +این فایل برای تیم فرانت‌اند توضیح می‌دهد که برای ماژول‌های `fertilization` و `irrigation` چه درخواست‌هایی باید به بک‌اند ارسال شود و چه پاسخ‌هایی باید دریافت شود. ## Fertilization Recommendation diff --git a/fertilization_recommendation/__init__.py b/fertilization/__init__.py similarity index 100% rename from fertilization_recommendation/__init__.py rename to fertilization/__init__.py diff --git a/fertilization_recommendation/apps.py b/fertilization/apps.py similarity index 59% rename from fertilization_recommendation/apps.py rename to fertilization/apps.py index d2bed93..4245dc8 100644 --- a/fertilization_recommendation/apps.py +++ b/fertilization/apps.py @@ -1,7 +1,8 @@ from django.apps import AppConfig -class FertilizationRecommendationConfig(AppConfig): +class FertilizationConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" - name = "fertilization_recommendation" + name = "fertilization" + label = "fertilization_recommendation" verbose_name = "Fertilization Recommendation & Plan Parser" diff --git a/fertilization_recommendation/migrations/0001_initial.py b/fertilization/migrations/0001_initial.py similarity index 92% rename from fertilization_recommendation/migrations/0001_initial.py rename to fertilization/migrations/0001_initial.py index d8408b9..6cfc396 100644 --- a/fertilization_recommendation/migrations/0001_initial.py +++ b/fertilization/migrations/0001_initial.py @@ -28,13 +28,13 @@ class Migration(migrations.Migration): "farm", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, - related_name="fertilization_recommendations", + related_name="fertilizations", to="farm_hub.farmhub", ), ), ], options={ - "db_table": "fertilization_recommendation_requests", + "db_table": "fertilization_requests", "ordering": ["-created_at", "-id"], }, ), diff --git a/fertilization_recommendation/migrations/0002_recommendation_status_lifecycle.py b/fertilization/migrations/0002_recommendation_status_lifecycle.py similarity index 87% rename from fertilization_recommendation/migrations/0002_recommendation_status_lifecycle.py rename to fertilization/migrations/0002_recommendation_status_lifecycle.py index e23b588..b8cba2f 100644 --- a/fertilization_recommendation/migrations/0002_recommendation_status_lifecycle.py +++ b/fertilization/migrations/0002_recommendation_status_lifecycle.py @@ -6,7 +6,7 @@ OLD_STATUSES = {"", "success", "error", None} def migrate_existing_statuses(apps, schema_editor): - Recommendation = apps.get_model("fertilization_recommendation", "FertilizationRecommendationRequest") + Recommendation = apps.get_model("fertilization", "FertilizationRecommendationRequest") Recommendation.objects.filter(status__in=[status for status in OLD_STATUSES if status is not None]).update( status=PENDING_STATUS ) @@ -15,7 +15,7 @@ def migrate_existing_statuses(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ("fertilization_recommendation", "0001_initial"), + ("fertilization", "0001_initial"), ] operations = [ diff --git a/fertilization_recommendation/migrations/__init__.py b/fertilization/migrations/__init__.py similarity index 100% rename from fertilization_recommendation/migrations/__init__.py rename to fertilization/migrations/__init__.py diff --git a/fertilization_recommendation/mock_data.py b/fertilization/mock_data.py similarity index 100% rename from fertilization_recommendation/mock_data.py rename to fertilization/mock_data.py diff --git a/fertilization_recommendation/models.py b/fertilization/models.py similarity index 92% rename from fertilization_recommendation/models.py rename to fertilization/models.py index 4154238..908834c 100644 --- a/fertilization_recommendation/models.py +++ b/fertilization/models.py @@ -19,7 +19,7 @@ class FertilizationRecommendationRequest(models.Model): farm = models.ForeignKey( FarmHub, on_delete=models.CASCADE, - related_name="fertilization_recommendations", + related_name="fertilizations", ) crop_id = models.CharField(max_length=255, blank=True, default="") growth_stage = models.CharField(max_length=255, blank=True, default="") @@ -36,7 +36,7 @@ class FertilizationRecommendationRequest(models.Model): updated_at = models.DateTimeField(auto_now=True) class Meta: - db_table = "fertilization_recommendation_requests" + db_table = "fertilization_requests" ordering = ["-created_at", "-id"] def __str__(self): diff --git a/fertilization_recommendation/postman/fertilization_recommendation.json b/fertilization/postman/fertilization_recommendation.json similarity index 100% rename from fertilization_recommendation/postman/fertilization_recommendation.json rename to fertilization/postman/fertilization_recommendation.json diff --git a/fertilization_recommendation/serializers.py b/fertilization/serializers.py similarity index 100% rename from fertilization_recommendation/serializers.py rename to fertilization/serializers.py diff --git a/fertilization_recommendation/services.py b/fertilization/services.py similarity index 100% rename from fertilization_recommendation/services.py rename to fertilization/services.py diff --git a/fertilization_recommendation/tests.py b/fertilization/tests.py similarity index 98% rename from fertilization_recommendation/tests.py rename to fertilization/tests.py index 634be6c..5525512 100644 --- a/fertilization_recommendation/tests.py +++ b/fertilization/tests.py @@ -21,7 +21,7 @@ class FertilizationRecommendViewTests(TestCase): self.farm_type = FarmType.objects.create(name="زراعی") self.farm = FarmHub.objects.create(owner=self.user, farm_type=self.farm_type, name="fert-farm") - @patch("fertilization_recommendation.views.external_api_request") + @patch("fertilization.views.external_api_request") def test_plan_from_text_proxies_to_ai_service(self, mock_external_api_request): mock_external_api_request.return_value = AdapterResponse( status_code=200, @@ -67,7 +67,7 @@ class FertilizationRecommendViewTests(TestCase): self.assertEqual(response.status_code, 400) self.assertIn("non_field_errors", response.data) - @patch("fertilization_recommendation.views.external_api_request") + @patch("fertilization.views.external_api_request") def test_recommend_returns_updated_response_shape(self, mock_external_api_request): mock_external_api_request.return_value = AdapterResponse( status_code=200, @@ -166,7 +166,7 @@ class FertilizationRecommendViewTests(TestCase): }, ) - @patch("fertilization_recommendation.views.external_api_request") + @patch("fertilization.views.external_api_request") def test_recommend_accepts_plant_name_and_passes_it_directly_to_ai(self, mock_external_api_request): mock_external_api_request.return_value = AdapterResponse(status_code=200, data={"data": {}}) diff --git a/fertilization_recommendation/urls.py b/fertilization/urls.py similarity index 100% rename from fertilization_recommendation/urls.py rename to fertilization/urls.py diff --git a/fertilization_recommendation/views.py b/fertilization/views.py similarity index 99% rename from fertilization_recommendation/views.py rename to fertilization/views.py index 76fa876..9568829 100644 --- a/fertilization_recommendation/views.py +++ b/fertilization/views.py @@ -436,7 +436,7 @@ class RecommendationListView(FarmAccessMixin, APIView): serializer.is_valid(raise_exception=True) farm = self._get_farm(request, serializer.validated_data["farm_uuid"]) - recommendations = farm.fertilization_recommendations.all().order_by("-created_at", "-id") + recommendations = farm.fertilizations.all().order_by("-created_at", "-id") paginator = self.pagination_class() page = paginator.paginate_queryset(recommendations, request, view=self) diff --git a/irrigation_recommendation/API_REFERENCE_FA.md b/irrigation/API_REFERENCE_FA.md similarity index 99% rename from irrigation_recommendation/API_REFERENCE_FA.md rename to irrigation/API_REFERENCE_FA.md index 29e72d6..37b4ac0 100644 --- a/irrigation_recommendation/API_REFERENCE_FA.md +++ b/irrigation/API_REFERENCE_FA.md @@ -3,7 +3,7 @@ این فایل برای تحویل به فرانت نوشته شده و endpointهای مرتبط با آبیاری را به‌صورت کامل توضیح می‌دهد. محدوده این مستند: -- همه endpointهای `irrigation_recommendation/urls.py` +- همه endpointهای `irrigation/urls.py` - endpoint دریافت محصولات انتخاب‌شده مزرعه: `GET /api/plants/selected/` ## نکات عمومی diff --git a/irrigation_recommendation/__init__.py b/irrigation/__init__.py similarity index 100% rename from irrigation_recommendation/__init__.py rename to irrigation/__init__.py diff --git a/irrigation_recommendation/apps.py b/irrigation/apps.py similarity index 60% rename from irrigation_recommendation/apps.py rename to irrigation/apps.py index 6be1dcd..3033639 100644 --- a/irrigation_recommendation/apps.py +++ b/irrigation/apps.py @@ -1,7 +1,8 @@ from django.apps import AppConfig -class IrrigationRecommendationConfig(AppConfig): +class IrrigationConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" - name = "irrigation_recommendation" + name = "irrigation" + label = "irrigation_recommendation" verbose_name = "Irrigation Recommendation & Plan Parser" diff --git a/irrigation_recommendation/migrations/0001_initial.py b/irrigation/migrations/0001_initial.py similarity index 91% rename from irrigation_recommendation/migrations/0001_initial.py rename to irrigation/migrations/0001_initial.py index dbcedf7..1ec2175 100644 --- a/irrigation_recommendation/migrations/0001_initial.py +++ b/irrigation/migrations/0001_initial.py @@ -27,13 +27,13 @@ class Migration(migrations.Migration): "farm", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, - related_name="irrigation_recommendations", + related_name="irrigations", to="farm_hub.farmhub", ), ), ], options={ - "db_table": "irrigation_recommendation_requests", + "db_table": "irrigation_requests", "ordering": ["-created_at", "-id"], }, ), diff --git a/irrigation_recommendation/migrations/0002_recommendation_status_and_growth_stage.py b/irrigation/migrations/0002_recommendation_status_and_growth_stage.py similarity index 94% rename from irrigation_recommendation/migrations/0002_recommendation_status_and_growth_stage.py rename to irrigation/migrations/0002_recommendation_status_and_growth_stage.py index 7f93df4..7ef10a4 100644 --- a/irrigation_recommendation/migrations/0002_recommendation_status_and_growth_stage.py +++ b/irrigation/migrations/0002_recommendation_status_and_growth_stage.py @@ -3,7 +3,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ("irrigation_recommendation", "0001_initial"), + ("irrigation", "0001_initial"), ] operations = [ diff --git a/irrigation_recommendation/migrations/__init__.py b/irrigation/migrations/__init__.py similarity index 100% rename from irrigation_recommendation/migrations/__init__.py rename to irrigation/migrations/__init__.py diff --git a/irrigation_recommendation/mock_data.py b/irrigation/mock_data.py similarity index 100% rename from irrigation_recommendation/mock_data.py rename to irrigation/mock_data.py diff --git a/irrigation_recommendation/models.py b/irrigation/models.py similarity index 93% rename from irrigation_recommendation/models.py rename to irrigation/models.py index 3c442f7..6532ffa 100644 --- a/irrigation_recommendation/models.py +++ b/irrigation/models.py @@ -21,7 +21,7 @@ class IrrigationRecommendationRequest(models.Model): farm = models.ForeignKey( FarmHub, on_delete=models.CASCADE, - related_name="irrigation_recommendations", + related_name="irrigations", ) crop_id = models.CharField(max_length=255, blank=True, default="") growth_stage = models.CharField(max_length=255, blank=True, default="") @@ -38,7 +38,7 @@ class IrrigationRecommendationRequest(models.Model): updated_at = models.DateTimeField(auto_now=True) class Meta: - db_table = "irrigation_recommendation_requests" + db_table = "irrigation_requests" ordering = ["-created_at", "-id"] def __str__(self): diff --git a/irrigation_recommendation/postman/irrigation_recommendation.json b/irrigation/postman/irrigation_recommendation.json similarity index 100% rename from irrigation_recommendation/postman/irrigation_recommendation.json rename to irrigation/postman/irrigation_recommendation.json diff --git a/irrigation_recommendation/serializers.py b/irrigation/serializers.py similarity index 100% rename from irrigation_recommendation/serializers.py rename to irrigation/serializers.py diff --git a/irrigation_recommendation/services.py b/irrigation/services.py similarity index 100% rename from irrigation_recommendation/services.py rename to irrigation/services.py diff --git a/irrigation_recommendation/tests.py b/irrigation/tests.py similarity index 97% rename from irrigation_recommendation/tests.py rename to irrigation/tests.py index f90d5be..49ae3af 100644 --- a/irrigation_recommendation/tests.py +++ b/irrigation/tests.py @@ -37,7 +37,7 @@ class WaterStressViewTests(TestCase): self.farm = FarmHub.objects.create(owner=self.user, farm_type=self.farm_type, name="Farm 1") self.other_farm = FarmHub.objects.create(owner=self.other_user, farm_type=self.farm_type, name="Farm 2") - @patch("irrigation_recommendation.views.external_api_request") + @patch("irrigation.views.external_api_request") def test_post_proxies_request_to_ai_service(self, mock_external_api_request): mock_external_api_request.return_value = AdapterResponse( status_code=200, @@ -102,7 +102,7 @@ class IrrigationPlanFromTextViewTests(TestCase): self.farm_type = FarmType.objects.create(name="گلخانه ای") self.farm = FarmHub.objects.create(owner=self.user, farm_type=self.farm_type, name="Plan Parser Farm") - @patch("irrigation_recommendation.views.external_api_request") + @patch("irrigation.views.external_api_request") def test_plan_from_text_proxies_to_ai_service(self, mock_external_api_request): mock_external_api_request.return_value = AdapterResponse( status_code=200, @@ -153,7 +153,7 @@ class IrrigationMethodListViewTests(TestCase): def setUp(self): self.factory = APIRequestFactory() - @patch("irrigation_recommendation.views.external_api_request") + @patch("irrigation.views.external_api_request") def test_get_proxies_irrigation_methods_from_ai(self, mock_external_api_request): mock_external_api_request.return_value = AdapterResponse( status_code=200, @@ -182,7 +182,7 @@ class IrrigationMethodListViewTests(TestCase): method="GET", ) - @patch("irrigation_recommendation.views.external_api_request") + @patch("irrigation.views.external_api_request") def test_post_proxies_irrigation_method_creation_to_ai(self, mock_external_api_request): mock_external_api_request.return_value = AdapterResponse( status_code=201, @@ -226,7 +226,7 @@ class RecommendViewTests(TestCase): irrigation_method_name="آبیاری قطره ای", ) - @patch("irrigation_recommendation.views.external_api_request") + @patch("irrigation.views.external_api_request") def test_post_returns_full_recommendation_shape(self, mock_external_api_request): mock_external_api_request.return_value = AdapterResponse( status_code=200, @@ -428,7 +428,7 @@ class IrrigationRecommendationHistoryTests(TestCase): self.assertEqual(response.status_code, 404) self.assertEqual(response.data["msg"], "Recommendation not found.") - @patch("irrigation_recommendation.views.external_api_request") + @patch("irrigation.views.external_api_request") def test_post_accepts_sensor_uuid_as_farm_uuid_alias(self, mock_external_api_request): mock_external_api_request.return_value = AdapterResponse( status_code=200, diff --git a/irrigation_recommendation/urls.py b/irrigation/urls.py similarity index 100% rename from irrigation_recommendation/urls.py rename to irrigation/urls.py diff --git a/irrigation_recommendation/views.py b/irrigation/views.py similarity index 99% rename from irrigation_recommendation/views.py rename to irrigation/views.py index ed5bc3c..dba2960 100644 --- a/irrigation_recommendation/views.py +++ b/irrigation/views.py @@ -250,7 +250,7 @@ class RecommendationListView(FarmAccessMixin, APIView): serializer.is_valid(raise_exception=True) farm = self._get_farm(request, serializer.validated_data["farm_uuid"]) - recommendations = farm.irrigation_recommendations.all().order_by("-created_at", "-id") + recommendations = farm.irrigations.all().order_by("-created_at", "-id") paginator = self.pagination_class() page = paginator.paginate_queryset(recommendations, request, view=self) diff --git a/water/services.py b/water/services.py index 96ca784..47405e6 100644 --- a/water/services.py +++ b/water/services.py @@ -1,6 +1,6 @@ from copy import deepcopy -from irrigation_recommendation.models import IrrigationRecommendationRequest +from irrigation.models import IrrigationRecommendationRequest from .mock_data import FARM_WEATHER_CARD, WATER_NEED_PREDICTION, WATER_STRESS_INDEX from .models import WeatherForecastLog