manage questions from the admin panel, not the server terminal

تا الان تنها راهِ گذاشتنِ سوال روی یک سرور، زدنِ دستور در ترمینالِ همان سرور
بود. یعنی هر تغییرِ محتوایی به کسی که SSH دارد وابسته می‌شد، تاریخچه نداشت و
برگشت‌پذیر نبود. محتوا داده است نه کد؛ باید با رابطِ کاربری ویرایش شود.

در /admin/content/question/ دکمه‌ی «وارد کردنِ سوال‌ها از فایل» اضافه شد، و
اکشنِ «دریافتِ فایلِ سوال‌های انتخاب‌شده» خروجی می‌دهد. خروجی دقیقاً همان قالبی
است که ورودی می‌پذیرد، پس چرخه‌ی «بگیر → ویرایش کن → برگردان» بسته است و برای
گرفتنِ نمونه هم لازم نیست کسی مستندات بخواند.

قالب عمداً ساده است (lessonId، prompt، choices، correct) تا کسی که برنامه‌نویس
نیست هم بتواند در ویرایشگرِ متن درستش کند.

اعتبارسنجی قبل از هر نوشتنی کامل انجام می‌شود و کلِ فایل در یک تراکنش است:
فایلِ نامعتبر هیچ چیزی نمی‌نویسد. وارد کردنِ نیمه‌کاره بدترین حالت بود، چون
کسی که فایل را داده فکر می‌کند کار شده ولی درس نصفه پر است.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-13 20:29:24 +03:30
parent cbe9b63dc4
commit 190bff3d0f
5 changed files with 344 additions and 1 deletions

View File

@@ -0,0 +1,8 @@
{% extends "admin/change_list.html" %}
{# دکمه‌ی «وارد کردنِ سوال‌ها» کنارِ دکمه‌ی «افزودن» #}
{% block object-tools-items %}
<li>
<a href="{% url 'admin:content_question_import' %}" class="addlink">وارد کردنِ سوال‌ها از فایل</a>
</li>
{{ block.super }}
{% endblock %}

View File

@@ -0,0 +1,36 @@
{% extends "admin/base_site.html" %}
{% block content %}
<div dir="rtl" style="max-width:760px">
<h1>وارد کردنِ سوال‌ها از فایل</h1>
<p>یک فایلِ JSON با این قالب بدهید. برای گرفتنِ نمونه، از فهرستِ سوال‌ها چند
مورد را انتخاب کنید و اکشنِ «دریافتِ فایلِ سوال‌های انتخاب‌شده» را بزنید —
خروجی دقیقاً همین قالب است.</p>
<pre style="background:#f6f6f6;padding:12px;border-radius:6px;direction:ltr;text-align:left">[
{
"lessonId": 42,
"prompt": "حاصل ۲+۳ چند است؟",
"type": "multiple_choice",
"choices": ["۴", "۵", "۶", "۷"],
"correct": 1
}
]</pre>
<p><code>correct</code> شماره‌ی گزینه‌ی درست است و از صفر شمرده می‌شود.</p>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<p><input type="file" name="file" accept=".json,application/json" required></p>
<p>
<label>
<input type="checkbox" name="replace">
سوال‌های قبلیِ همان درس‌ها اول پاک شوند
</label>
</p>
<p style="color:#666">اگر فایل ایرادی داشته باشد هیچ چیزی نوشته نمی‌شود —
یا همه‌ی سوال‌ها وارد می‌شوند یا هیچ‌کدام.</p>
<p><input type="submit" value="وارد کن" class="default"></p>
</form>
</div>
{% endblock %}