Seed: grade 6 rebuilt (every lesson 5+ questions, answers computed in code), supplementary/complementary text fixed in grades 4/6/7, '/' decimals to '٫', wrong keys fixed

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-17 01:31:28 +03:30
parent f57deb9c1d
commit 9eae99340d
6 changed files with 24629 additions and 759 deletions

View File

@@ -300,7 +300,7 @@ has been done before.
### Content
- `content/seed/` is the whole curriculum and question bank as committed JSON: 10 grades (3–12), 5 subjects,
89 units, 1,145 islands, 5,406 lessons (every one has at least one question), 21,172 questions. `deploy.sh` runs `seed_content` on every release.
89 units, 1,145 islands, 5,406 lessons (every one has at least one question), 22,602 questions. `deploy.sh` runs `seed_content` on every release.
- `seed_content` is idempotent, never deletes, and does not undo admin work: the `SeedRecord` ledger remembers
what it delivered, so anything the admin deleted or renamed is not recreated; lesson text, `example`,
`steps` and `figures` are only filled when empty. Questions bind to lessons **by title path**

View File

@@ -13,7 +13,7 @@
| **سرویسِ زنده** | `https://mathapi.tadrisino2.ir` · اپ: `https://math.tadrisino2.ir` |
| **فناوری** | Python 3.11 · Django 5.2 · Django REST Framework · PostgreSQL 14 · Redis · Qdrant · gunicorn پشتِ nginx و ArvanCloud |
| **API** | ۶۱ عملیات روی ۵۹ مسیر، مستند با OpenAPI (`/api/docs/`) |
| **محتوا** | ۱۰ پایه · ۵ کتاب · ۸۹ فصل · ۱٬۱۴۵ جزیره · ۵٬۴۰۶ درس · ۲۱٬۱۷۲ سوال |
| **محتوا** | ۱۰ پایه · ۵ کتاب · ۸۹ فصل · ۱٬۱۴۵ جزیره · ۵٬۴۰۶ درس · ۲۲٬۶۰۲ سوال |
| **تست** | ۹۷۳ تستِ خودکار، همه سبز |
| **سرویس‌های بیرونی** | GapGPT (مدلِ زبانی) · Qdrant (جستجوی کتاب) · کاوه‌نگار (پیامک) · زرین‌پال و کافه‌بازار (پرداخت) |

View File

@@ -23516,7 +23516,7 @@
},
{
"title": "محاسبه زاویه با توجه به زاویه‌های مکمل و مکمل زاویه مستقیم",
"introText": "۱. زاویه مستقیم برابر با ۱۸۰ درجه است.\n۲. اگر زاویه مجهول مکمل زاویه داده شده است، آن زاویه را از ۱۸۰ درجه کم کنید.\n۳. اگر زاویه مجهول مکمل زاویه قائمه است، آن زاویه را از ۹۰ درجه کم کنید.\n۴. مقدار به دست آمده اندازه زاویه مجهول است.",
"introText": "۱. زاویه‌ی مستقیم ۱۸۰ درجه است.\n۲. اگر دو زاویه مکمل باشند (روی یک خط راست)، زاویه‌ی داده‌شده را از ۱۸۰ درجه کم کنید.\n۳. اگر دو زاویه متمم باشند (مجموعشان یک زاویه‌ی قائمه، ۹۰ درجه)، زاویه‌ی داده‌شده را از ۹۰ درجه کم کنید.\n۴. مقدار به‌دست‌آمده اندازه‌ی زاویه‌ی مجهول است.",
"example": "دو زاویه روی یک خط راست‌اند و یکی ۷۰ درجه است. زاویهٔ دیگر چقدر است؟",
"steps": [
"زاویهٔ مستقیم ۱۸۰ درجه است.",
@@ -28173,7 +28173,7 @@
},
{
"title": "اندازه‌گیری زاویه با استفاده از زاویه‌های مکمل",
"introText": "برای پیدا کردن اندازه زاویه مجهول، از این نکته استفاده می‌کنیم که جمع دو زاویه مکمل برابر ۹۰ درجه است. بنابراین، اندازه زاویه مجهول را با کم کردن زاویه معلوم از ۹۰ درجه به دست می‌آوریم.",
"introText": "برای پیدا کردن اندازه‌ی زاویه‌ی مجهول، از این نکته استفاده می‌کنیم که دو زاویه‌ی روی یک خط راست مکمل‌اند و جمعشان ۱۸۰ درجه است. بنابراین زاویه‌ی مجهول را با کم کردن زاویه‌ی معلوم از ۱۸۰ درجه به دست می‌آوریم.",
"example": "دو زاویه روی یک خط راست‌اند و یکی ۱۳۰ درجه است. دیگری؟",
"steps": [
"روی خط راست مجموع ۱۸۰ درجه.",
@@ -56251,64 +56251,7 @@
"۱۴ + ۳ = ۱۷ و ۱۷ + ۳ = ۲۰.",
"✅ جواب: ۱۷ و ۲۰"
],
"figures": [
{
"where": "example",
"diagram": {
"kind": "plane",
"title": "۳n + ۲",
"axes": true,
"points": {},
"items": [
{
"type": "function",
"expr": "3*x+2",
"from": 0.0,
"to": 4.5,
"color": "gray",
"dashed": true
},
{
"type": "point",
"point": [
1.0,
5.0
]
},
{
"type": "point",
"point": [
2.0,
8.0
]
},
{
"type": "point",
"point": [
3.0,
11.0
]
},
{
"type": "point",
"point": [
4.0,
14.0
]
}
],
"grid": true,
"xRange": [
0.0,
5.0
],
"yRange": [
0.0,
17.0
]
}
}
]
"figures": []
},
{
"title": "ارتفاع و موقعیت نسبی اعداد صحیح",
@@ -56466,71 +56409,7 @@
"۴۰ + ۱۰ = ۵۰.",
"✅ جواب: ۵۰"
],
"figures": [
{
"where": "example",
"diagram": {
"kind": "plane",
"title": "۱۰n",
"axes": true,
"points": {},
"items": [
{
"type": "function",
"expr": "10*x",
"from": 0.0,
"to": 5.5,
"color": "gray",
"dashed": true
},
{
"type": "point",
"point": [
1.0,
10.0
]
},
{
"type": "point",
"point": [
2.0,
20.0
]
},
{
"type": "point",
"point": [
3.0,
30.0
]
},
{
"type": "point",
"point": [
4.0,
40.0
]
},
{
"type": "point",
"point": [
5.0,
50.0
]
}
],
"grid": true,
"xRange": [
0.0,
6.0
],
"yRange": [
0.0,
53.0
]
}
}
]
"figures": []
},
{
"title": "الگوی عددی ضربی",
@@ -57106,71 +56985,7 @@
"عدد بعدی برابر است با ۱۰ + ۲ = ۱۲.",
"✅ جواب: ۱۰، ۱۲"
],
"figures": [
{
"where": "example",
"diagram": {
"kind": "plane",
"title": "۲n",
"axes": true,
"points": {},
"items": [
{
"type": "function",
"expr": "2*x",
"from": 0.0,
"to": 5.5,
"color": "gray",
"dashed": true
},
{
"type": "point",
"point": [
1.0,
2.0
]
},
{
"type": "point",
"point": [
2.0,
4.0
]
},
{
"type": "point",
"point": [
3.0,
6.0
]
},
{
"type": "point",
"point": [
4.0,
8.0
]
},
{
"type": "point",
"point": [
5.0,
10.0
]
}
],
"grid": true,
"xRange": [
0.0,
6.0
],
"yRange": [
0.0,
13.0
]
}
}
]
"figures": []
},
{
"title": "جایگذاری اعداد در جدول",
@@ -57260,71 +57075,7 @@
"۲ × ۵ = ۱۰.",
"✅ جواب: ۱۰"
],
"figures": [
{
"where": "example",
"diagram": {
"kind": "plane",
"title": "۲n",
"axes": true,
"points": {},
"items": [
{
"type": "function",
"expr": "2*x",
"from": 0.0,
"to": 5.5,
"color": "gray",
"dashed": true
},
{
"type": "point",
"point": [
1.0,
2.0
]
},
{
"type": "point",
"point": [
2.0,
4.0
]
},
{
"type": "point",
"point": [
3.0,
6.0
]
},
{
"type": "point",
"point": [
4.0,
8.0
]
},
{
"type": "point",
"point": [
5.0,
10.0
]
}
],
"grid": true,
"xRange": [
0.0,
6.0
],
"yRange": [
0.0,
13.0
]
}
}
]
"figures": []
}
]
},
@@ -57363,64 +57114,7 @@
"۷ + ۲ = ۹.",
"✅ جواب: ۹"
],
"figures": [
{
"where": "example",
"diagram": {
"kind": "plane",
"title": "۲n + ۱",
"axes": true,
"points": {},
"items": [
{
"type": "function",
"expr": "2*x+1",
"from": 0.0,
"to": 4.5,
"color": "gray",
"dashed": true
},
{
"type": "point",
"point": [
1.0,
3.0
]
},
{
"type": "point",
"point": [
2.0,
5.0
]
},
{
"type": "point",
"point": [
3.0,
7.0
]
},
{
"type": "point",
"point": [
4.0,
9.0
]
}
],
"grid": true,
"xRange": [
0.0,
5.0
],
"yRange": [
0.0,
12.0
]
}
}
]
"figures": []
},
{
"title": "ساخت شکل با تعداد مشخص مربع",
@@ -59267,64 +58961,7 @@
"۲٫۰ + ۰٫۵ = ۲٫۵.",
"✅ جواب: ۲٫۵"
],
"figures": [
{
"where": "example",
"diagram": {
"kind": "plane",
"title": "۰٫۵n",
"axes": true,
"points": {},
"items": [
{
"type": "function",
"expr": "0.5*x",
"from": 0.0,
"to": 4.5,
"color": "gray",
"dashed": true
},
{
"type": "point",
"point": [
1.0,
0.5
]
},
{
"type": "point",
"point": [
2.0,
1.0
]
},
{
"type": "point",
"point": [
3.0,
1.5
]
},
{
"type": "point",
"point": [
4.0,
2.0
]
}
],
"grid": true,
"xRange": [
0.0,
5.0
],
"yRange": [
0.0,
5.0
]
}
}
]
"figures": []
},
{
"title": "تبدیل اعداد اعشاری به کسر",
@@ -62281,50 +61918,7 @@
"هر دو مختصات علامت عوض می‌کنند.",
"✅ جواب: (−۱ ، −۲)"
],
"figures": [
{
"where": "example",
"diagram": {
"kind": "plane",
"title": "چرخش ۱۸۰° حول مبدأ",
"axes": true,
"points": {},
"items": [
{
"type": "point",
"point": [
1.0,
2.0
]
},
{
"type": "point",
"point": [
-1.0,
-2.0
],
"color": "red"
},
{
"type": "point",
"point": [
0.0,
0.0
]
}
],
"grid": true,
"xRange": [
-3.0,
3.0
],
"yRange": [
-3.0,
3.0
]
}
}
]
"figures": []
}
]
},
@@ -62341,51 +61935,7 @@
"قرینه ۲ واحد آن‌طرف مرکز: ۱ − ۲ = −۱.",
"✅ جواب: (−۱ ، ۱)"
],
"figures": [
{
"where": "example",
"diagram": {
"kind": "plane",
"title": "چرخش ۱۸۰° حول (۱ ، ۱)",
"axes": true,
"points": {},
"items": [
{
"type": "point",
"point": [
3.0,
1.0
]
},
{
"type": "point",
"point": [
-1.0,
1.0
],
"color": "red"
},
{
"type": "point",
"point": [
1.0,
1.0
],
"color": "green"
}
],
"grid": true,
"xRange": [
-2.0,
4.0
],
"yRange": [
-1.0,
3.0
]
}
}
]
"figures": []
},
{
"title": "چرخش شکل در شبکه مربعی",
@@ -63600,7 +63150,7 @@
},
{
"title": "تکمیل جدول زوایا",
"introText": "۱. زاویه‌های داده‌شده را بررسی کنید. ۲. برای هر زاویه، نوع آن (تند، قائم، باز، یا نیم‌صفحه) را مشخص کنید. ۳. اگر زاویه مکمل یا متقابل خواسته شده است، از روابط ۹۰ درجه یا ۱۸۰ درجه استفاده کنید.",
"introText": "۱. زاویه‌های داده‌شده را بررسی کنید. ۲. برای هر زاویه، نوع آن (تند، قائمه، باز یا نیم‌صفحه) را مشخص کنید. ۳. زاویه‌ی متمم یعنی مجموع دو زاویه ۹۰ درجه باشد و زاویه‌ی مکمل یعنی مجموع دو زاویه ۱۸۰ درجه باشد؛ برای پیدا کردن هر کدام، زاویه‌ی داده‌شده را از ۹۰ یا ۱۸۰ کم کنید.",
"example": "زاویه‌ای ۵۵ درجه است. نوع آن را بگویید و زاویهٔ متمم آن (تا ۹۰ درجه) را پیدا کنید.",
"steps": [
"۵۵ از ۹۰ کمتر است، پس زاویه تند است.",
@@ -63945,7 +63495,7 @@
},
{
"title": "مجموع زوایای متقابل",
"introText": "۱. اگر دو زاویه متقابل باشند، مجموع آن‌ها برابر با ۱۸۰ درجه است. ۲. برای یافتن زاویه مجهول، مقدار زاویه داده‌شده را از ۱۸۰ کم کنید.",
"introText": "۱. دو زاویه‌ی متقابل به رأس با هم برابرند؛ پس مجموعشان دو برابر یکی از آن‌هاست. ۲. دو زاویه‌ی کنار هم که روی یک خط راست‌اند، مجموعشان ۱۸۰ درجه است. ۳. برای پیدا کردن زاویه‌ی مجهول، یا برابری زاویه‌های متقابل به رأس را به کار ببرید یا زاویه‌ی داده‌شده را از ۱۸۰ کم کنید.",
"example": "دو زاویهٔ متقابل به رأس هر کدام ۴۰ درجه‌اند. جمعشان؟",
"steps": [
"۴۰ + ۴۰.",
@@ -64024,7 +63574,7 @@
},
{
"title": "مجموع زوایای مکمل",
"introText": "۱. اگر دو زاویه مکمل باشند، مجموع آن‌ها برابر با ۹۰ درجه است. ۲. برای یافتن زاویه مجهول، مقدار زاویه داده‌شده را از ۹۰ کم کنید.",
"introText": "۱. اگر دو زاویه مکمل باشند، مجموع آن‌ها ۱۸۰ درجه است (روی یک خط راست). ۲. اگر دو زاویه متمم باشند، مجموع آن‌ها ۹۰ درجه است. ۳. برای یافتن زاویه‌ی مجهول، زاویه‌ی داده‌شده را از ۱۸۰ (مکمل) یا ۹۰ (متمم) کم کنید.",
"example": "دو زاویهٔ مکمل جمعشان چند درجه است؟",
"steps": [
"مکمل یعنی روی خط راست.",
@@ -65917,46 +65467,7 @@
"y = ۵ × x.",
"✅ جواب: y = ۵x"
],
"figures": [
{
"where": "example",
"diagram": {
"kind": "plane",
"title": "y = ۵x",
"axes": true,
"points": {},
"items": [
{
"type": "function",
"expr": "5*x",
"from": -1.0,
"to": 3.0,
"color": "blue",
"label": "y = ۵x"
},
{
"type": "point",
"point": [
1.0,
5.0
]
},
{
"type": "point",
"point": [
2.0,
10.0
]
}
],
"grid": true,
"yRange": [
-5.0,
15.0
]
}
}
]
"figures": []
}
]
},
@@ -71547,7 +71058,7 @@
},
{
"title": "تساوی زاویه‌ها",
"introText": "۱. به شکل داده شده نگاه کنید و زاویه‌های متقابل به رأس یا مکمل را شناسایی کنید. \n۲. تساوی زاویه‌ها را با توجه به روابط هندسی مشخص کنید. \n۳. اگر زاویه‌ها مکمل هستند، مجموع آن‌ها باید ۹۰ درجه باشد.",
"introText": "۱. به شکل نگاه کنید و زاویه‌های متقابل به رأس را پیدا کنید؛ این زاویه‌ها با هم برابرند.\n۲. اگر دو زاویه متمم باشند، مجموعشان ۹۰ درجه است.\n۳. اگر دو زاویه مکمل باشند، مجموعشان ۱۸۰ درجه است.",
"example": "زاویه‌های A و B متمم‌اند (مجموعشان ۹۰ درجه) و زاویهٔ A برابر ۳۰ درجه است. زاویهٔ B را پیدا کنید.",
"steps": [
"مجموع دو زاویهٔ متمم ۹۰ درجه است.",
@@ -72844,7 +72355,7 @@
"lessons": [
{
"title": "زاویه‌های مکمل و مجاور",
"introText": "زاویه‌های مکمل مجموعشان ۹۰ درجه و زاویه‌های مجاور مجموعشان ۱۸۰ درجه است. برای حل مسائل، ابتدا زاویه داده‌شده را مشخص کنید و سپس با استفاده از روابط مکمل یا مجاور، زاویه مجهول را پیدا کنید.",
"introText": "دو زاویه‌ی مجاور که روی یک خط راست‌اند مکمل‌اند و مجموعشان ۱۸۰ درجه است. دو زاویه‌ی متمم مجموعشان ۹۰ درجه است. برای حل مسئله، زاویه‌ی داده‌شده را از ۱۸۰ (مکمل) یا ۹۰ (متمم) کم کنید.",
"example": "دو زاویهٔ مجاور روی خط راست‌اند و یکی ۱۱۰ است. دیگری؟",
"steps": [
"۱۸۰ − ۱۱۰.",

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,7 @@
| فایل | محتوا |
|---|---|
| `curriculum.json` | ۱۰ پایه (سوم تا دوازدهم)، ۵ کتاب، ۸۹ فصل، ۱٬۱۴۵ جزیره، ۵٬۴۰۶ درس؛ با `subject`، متنِ درس، مثال، قدم‌ها و شکلِ درس (`figures`) |
| `questions.json` | ۲۱٬۱۷۲ سوالِ چهارگزینه‌ای، بعضی با شکل (`figure`) |
| `questions.json` | ۲۲٬۶۰۲ سوالِ چهارگزینه‌ای، بعضی با شکل (`figure`) |
هر فصل باید `subject` داشته باشد (ریاضی، حسابان، هندسه، آمار و احتمال، گسسته)؛ فایلِ بی‌آن رد می‌شود. شکل‌ها
(`Lesson.figures`، `Question.figure`) با `rag.services.diagram.validate` در ورود اعتبارسنجی می‌شوند و شکلِ نامعتبر کلِ

View File

@@ -20,7 +20,7 @@
|---|---|
| پایه‌های سوم تا دوازدهم | **۱۰ پایه** |
| کتاب (ریاضی، حسابان، هندسه، آمار و احتمال، گسسته) | **۱۵ کتاب در ۵ درس** |
| سؤالِ چهارگزینه‌ای | **۲۱٬۱۷۲** |
| سؤالِ چهارگزینه‌ای | **۲۲٬۶۰۲** |
| عملیاتِ API، مستند در Swagger | **۶۱** |
| تستِ خودکار، همه سبز | **۹۷۳** |
| اپِ جنگو، هرکدام یک مسئولیت | **۱۴** |
@@ -55,7 +55,7 @@
### واحدهای محتوا (این واژه‌ها در کلِ سند تکرار می‌شوند)
پایه Grade ۱۰ ← کتاب Subject ۵ ← فصل Unit ۸۹ ← جزیره Node ۱٬۱۴۵ ← درس Lesson ۵٬۴۰۶ ← سؤال Question ۲۱٬۱۷۲ ← گزینه Choice
پایه Grade ۱۰ ← کتاب Subject ۵ ← فصل Unit ۸۹ ← جزیره Node ۱٬۱۴۵ ← درس Lesson ۵٬۴۰۶ ← سؤال Question ۲۲٬۶۰۲ ← گزینه Choice
**«درس» در این پروژه یعنی یک «تیپ‌مسئله»ی کتاب**، نه یک جلسه‌ی کلاس. برای همین درس خیلی ریز است و اپ در سطحِ **جزیره** (Node) بازی می‌شود: آزمونِ هر جزیره از درس‌هایش سؤال برمی‌دارد.
@@ -732,7 +732,7 @@ if (Math.sign(y) !== Math.sign(py)) { const r = bisect(f, px, x); if (Math.abs(f
| فایل | محتوا |
|---|---|
| `content/seed/curriculum.json` | ۱۰ پایه، ۵ کتاب، ۸۹ فصل، ۱٬۱۴۵ جزیره، ۵٬۴۰۶ درس، با مثال، قدم‌ها و شکلِ درس |
| `content/seed/questions.json` | ۲۱٬۱۷۲ سؤالِ چهارگزینه‌ای، بعضی با شکل |
| `content/seed/questions.json` | ۲۲٬۶۰۲ سؤالِ چهارگزینه‌ای، بعضی با شکل |
- `seed_content` در هر انتشار اجرا می‌شود؛ **هیچ‌وقت چیزی پاک نمی‌کند** و اجرای دوباره‌اش بی‌خطر است.
- سؤال با **مسیرِ عنوان** (پایه › فصل › جزیره › درس) به درس وصل می‌شود، نه با شناسه — چون شناسه‌ها بینِ دو دیتابیس فرق دارند.