No LaTeX/markdown anywhere students read (seed, import, DB migration 0021, tutor history, frontend guard); quiz of an island is fixed per user again

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 12:15:28 +03:30
parent dd10ff83f4
commit e662914efc
11 changed files with 855 additions and 670 deletions

View File

@@ -1036,15 +1036,9 @@ class NodeQuizView(APIView):
# درهم‌ریزیِ پایدار: همان کاربر روی همان مبحث همیشه همان ترتیب را
# می‌بیند، ولی دو کاربرِ مختلف دو ترتیبِ مختلف.
seed = request.query_params.get('seed') or str(getattr(request.user, 'id', '') or '')
# دوباره‌بازیِ همان جزیره آزمونِ تازه می‌دهد: شمارِ آزمون‌های تمام‌شده‌ی این کاربر روی این
# جزیره در مبنای درهم‌ریزی می‌آید. تا پایانِ آزمون عدد ثابت است، پس رفرش همان آزمون را
# می‌دهد. با استخرِ یک‌سوال‌به‌درس عملاً چیزی عوض نمی‌شود؛ معنی‌اش با استخرِ بزرگ پیداست.
# فقط برای کاربرِ واردشده و بی‌`?seed=`؛ نسنجیده: اثرش روی کشِ فرانت.
rounds = 0
if not request.query_params.get('seed') and getattr(request.user, 'id', None):
rounds = UserNodeCompletion.objects.filter(
user_id=request.user.id, node_id=node_id).count()
rng = random.Random(f'{node_id}:{seed}:{rounds}' if rounds else f'{node_id}:{seed}')
# آزمونِ هر جزیره برای هر کاربر ثابت است (تصمیمِ مالک ۲۰۲۶-۱۰-۱۲): هر بار که برگردد همان
# سوال‌ها را می‌بیند تا بتواند ایرادش را رفع و مکانِ سوال‌ها را یاد بگیرد.
rng = random.Random(f'{node_id}:{seed}')
rng.shuffle(questions)
# حداکثر یک سوال از هر درس تا آزمون روی یک مهارت گیر نکند؛ اگر با این