11 KiB
Farmer Todos API
این فایل مستندات کامل APIهای اپ farmer_todos را توضیح میدهد.
Base Path
تمام endpointهای این اپ با این prefix در دسترس هستند:
/api/farmer-todos/
Authentication
همه endpointهای این اپ نیاز به احراز هویت دارند.
- Permission:
IsAuthenticated - Authentication: بر اساس تنظیمات DRF پروژه، معمولاً JWT
هدر معمول:
Authorization: Bearer <token>
Overview
در ساختار فعلی پروژه، farmer_todos و farmer_calendar روی یک مدل مشترک سوار هستند، اما این اپ APIهای مخصوص todo را با فرمت مناسب frontend برمیگرداند.
موجودیت اصلی:
FarmerTodoTask
فیلدهای مهم response:
id: شناسه عمومی task از نوع UUIDtitle: عنوان کارzone: نام ناحیه یا بخشscheduledDate: تاریخ انجامtime: ساعت انجامpriority: اولویتnote: توضیح tasktags: لیست tagهاstatus: وضعیت
Enums
Priority
اولویتها enum-based هستند و از دیتابیس خوانده نمیشوند.
مقادیر نهایی ذخیرهشده:
زیادمتوسطکم
ورودیهای قابل قبول:
highmediumlowزیادمتوسطکم
Tags
tags هم enum-based هستند و از دیتابیس خوانده نمیشوند.
نمونه tagهای مجاز:
آبیاریآفتفوریروزانهثبت دستیبازدیدکوددهیسمپاشیبرداشت
اگر tag خارج از enum ارسال شود، request با validation error رد میشود.
Status
مقادیر مجاز:
opendone
Endpoints
1) List Tasks
GET /api/farmer-todos/
Query Params
status: فیلتر بر اساس وضعیتpriority: فیلتر بر اساس اولویتdate: فیلتر دقیق روی تاریخfrom: فیلتر از این تاریخ به بعدto: فیلتر تا این تاریخzone: فیلتر بر اساس zonesearch: جستجو درtitleوnotefarm_uuid: محدود کردن نتایج به یک مزرعه
Behavior
- فقط taskهای متعلق به farmهای کاربر login شده را برمیگرداند
priorityورودی مثلhighبه مقدار داخلی مثلزیادnormalize میشودsearchدرtitleوdescriptionمدل جستجو میکند- خروجی بر اساس
scheduled_dateوtimeوcreated_atمرتب میشود
Sample Request
GET /api/farmer-todos/?farm_uuid=<farm_uuid>&priority=high&status=open&search=رطوبت
Sample Response
{
"tasks": [
{
"id": "11111111-1111-1111-1111-111111111111",
"title": "بررسی رطوبت ردیف شمالی",
"zone": "قطعه گندم - شمال مزرعه",
"scheduledDate": "2025-02-24",
"time": "06:30",
"priority": "زیاد",
"note": "اگر رطوبت کمتر از 28٪ بود، آبیاری دوباره بررسی شود.",
"tags": ["آبیاری"],
"status": "open"
}
],
"meta": {
"total": 1
}
}
2) Create Task
POST /api/farmer-todos/
Request Body
title: اجباری، stringzone: اجباری، stringscheduledDate: اجباری، date با فرمتYYYY-MM-DDtime: اجباری، time با فرمتHH:MMpriority: اجباریnote: اختیاری، stringtags: اختیاری، array از tagهای enumstatus: اختیاری،openیاdonefarm_uuid: اختیاری، اما اگر کاربر چند farm داشته باشد اجباری میشود
Validation Rules
titleنباید خالی باشدzoneنباید خالی باشدpriorityباید از enum مجاز باشدtagsباید فقط از enum مجاز باشند- در create اگر fieldهای اصلی نباشند خطای validation برمیگردد
fieldهای اجباری:
titlezonescheduledDatetimepriority
Sample Request
{
"farm_uuid": "6b7ce8a8-13ec-4a6e-9118-7c298fd2a111",
"title": "بازدید پمپ جنوب",
"zone": "انبار مرکزی",
"scheduledDate": "2025-02-24",
"time": "07:00",
"priority": "medium",
"note": "بعد از ثبت انجام، مورد غیرعادی را یادداشت کن.",
"tags": ["روزانه", "ثبت دستی"],
"status": "open"
}
Sample Success Response
{
"task": {
"id": "7aa97f9f-bc4c-49f1-858f-11f3f433a111",
"title": "بازدید پمپ جنوب",
"zone": "انبار مرکزی",
"scheduledDate": "2025-02-24",
"time": "07:00",
"priority": "متوسط",
"note": "بعد از ثبت انجام، مورد غیرعادی را یادداشت کن.",
"tags": ["روزانه", "ثبت دستی"],
"status": "open"
}
}
Sample Validation Error
{
"code": "TASK_VALIDATION_ERROR",
"message": "priority must be one of زیاد, متوسط, کم, high, medium, low",
"details": {
"priority": [
"priority must be one of زیاد, متوسط, کم, high, medium, low"
]
}
}
3) Get Task Detail
GET /api/farmer-todos/<task_uuid>/
Path Param
task_uuid: شناسه UUID تسک
Behavior
- فقط اگر task متعلق به کاربر باشد برگردانده میشود
- اگر وجود نداشته باشد یا متعلق به کاربر دیگری باشد،
404میدهد
Sample Response
{
"task": {
"id": "11111111-1111-1111-1111-111111111111",
"title": "بررسی رطوبت ردیف شمالی",
"zone": "قطعه گندم - شمال مزرعه",
"scheduledDate": "2025-02-24",
"time": "06:30",
"priority": "زیاد",
"note": "اگر رطوبت کمتر از 28٪ بود، آبیاری دوباره بررسی شود.",
"tags": ["آبیاری"],
"status": "open"
}
}
Sample Not Found Response
{
"code": "TASK_NOT_FOUND",
"message": "Task not found."
}
4) Update Task
PUT /api/farmer-todos/<task_uuid>/
Behavior
- این endpoint از
partial=Trueاستفاده میکند، پس میتوانی فقط بخشی از فیلدها را بفرستی - اگر
farm_uuidارسال شود، نباید farm فعلی task را تغییر دهد - اگر
tagsارسال شوند، لیست tagهای task با لیست جدید جایگزین میشود - اگر
zoneارسال شود، zone جدید resolve یا ساخته میشود
Sample Request
{
"status": "done"
}
یا:
{
"priority": "high",
"tags": ["فوری", "بازدید"],
"note": "این کار باید امروز نهایی شود."
}
Sample Response
{
"task": {
"id": "11111111-1111-1111-1111-111111111111",
"title": "بررسی رطوبت ردیف شمالی",
"zone": "قطعه گندم - شمال مزرعه",
"scheduledDate": "2025-02-24",
"time": "06:30",
"priority": "زیاد",
"note": "اگر رطوبت کمتر از 28٪ بود، آبیاری دوباره بررسی شود.",
"tags": ["آبیاری"],
"status": "done"
}
}
5) Delete Task
DELETE /api/farmer-todos/<task_uuid>/
Sample Response
{
"success": true
}
6) List Zones
GET /api/farmer-todos/zones/
Query Params
farm_uuid: اختیاری
Behavior
- zoneها از دیتابیس خوانده میشوند
- اگر
farm_uuidارسال شود، zoneها به همان farm محدود میشوند - اگر
farm_uuidارسال نشود، zoneهای تکراری بین farmهای کاربر deduplicate میشوند
Sample Response
{
"zones": [
{
"id": "zone_gndm-shmal-mzrh",
"label": "قطعه گندم - شمال مزرعه",
"value": "قطعه گندم - شمال مزرعه"
}
],
"meta": {
"total": 1
}
}
7) List Tags
GET /api/farmer-todos/tags/
Query Params
farm_uuid: اختیاری؛ در نسخه فعلی فقط validate میشود
Behavior
- tagها از enum داخلی کد برمیگردند
- این endpoint دیگر از جدول tag چیزی نمیخواند
Sample Response
{
"tags": [
{
"id": "tag_irrigation",
"label": "آبیاری",
"value": "آبیاری"
},
{
"id": "tag_pest",
"label": "آفت",
"value": "آفت"
},
{
"id": "tag_urgent",
"label": "فوری",
"value": "فوری"
}
],
"meta": {
"total": 9
}
}
8) Summary
GET /api/farmer-todos/summary/
Query Params
farm_uuid: اختیاری
Response Fields
todayTasksCount: تعداد taskهای امروزcompletedCount: تعداد taskهای انجامشدهurgentCount: تعداد taskهای باز با priority بالاprogressValue: درصد پیشرفتnextTask: نزدیکترین task باز
Behavior
progressValueاز نسبتcompletedCount / totalCountمحاسبه میشودnextTaskاولین task باز از امروز به بعد است
Sample Response
{
"todayTasksCount": 2,
"completedCount": 1,
"urgentCount": 2,
"progressValue": 50,
"nextTask": {
"id": "11111111-1111-1111-1111-111111111111",
"title": "بررسی رطوبت ردیف شمالی",
"zone": "قطعه گندم - شمال مزرعه",
"scheduledDate": "2025-02-24",
"time": "06:30",
"priority": "زیاد",
"note": "اگر رطوبت کمتر از 28٪ بود، آبیاری دوباره بررسی شود.",
"tags": ["آبیاری"],
"status": "open"
}
}
Error Format
خطاهای validation:
{
"code": "TASK_VALIDATION_ERROR",
"message": "error message",
"details": {}
}
خطای پیدا نشدن:
{
"code": "TASK_NOT_FOUND",
"message": "Task not found."
}
Farm Resolution Rules
رفتار farm_uuid:
- اگر کاربر فقط یک farm داشته باشد، در create میتواند
farm_uuidنفرستد - اگر کاربر چند farm داشته باشد، در create باید
farm_uuidبفرستد - اگر
farm_uuidنامعتبر باشد، validation error برمیگردد - در update،
farm_uuidنباید farm task را تغییر دهد
Notes
- فایل routeها:
farmer_todos/urls.py - فایل viewها:
farmer_todos/views.py - فایل serializerها:
farmer_todos/serializers.py - enumهای مشترک:
farmer_calendar/enums.py
Related Note
در ساختار فعلی پروژه، farmer_todos از مدل مشترک با farmer_calendar استفاده میکند، ولی response و endpointهای این فایل مخصوص todo هستند.