feat(lms): replace is_closed with timer limit and auto-submit logic
This commit is contained in:
+53
-13
@@ -62,31 +62,64 @@ def assignment_detail(request, pk):
|
||||
submission = Submission.objects.filter(assignment=assignment, student=request.user).first()
|
||||
|
||||
from django.utils import timezone
|
||||
import datetime
|
||||
|
||||
now = timezone.now()
|
||||
can_submit = True
|
||||
if assignment.is_closed:
|
||||
can_submit = False
|
||||
if assignment.deadline and timezone.now() > assignment.deadline:
|
||||
time_left_seconds = None
|
||||
needs_start = False
|
||||
|
||||
if assignment.deadline and now > assignment.deadline:
|
||||
can_submit = False
|
||||
|
||||
if submission:
|
||||
if request.method == 'POST':
|
||||
# Do not allow updating
|
||||
if assignment.time_limit:
|
||||
if not submission:
|
||||
needs_start = True
|
||||
can_submit = False # Can't submit until started
|
||||
elif submission.status == 'IN_PROGRESS':
|
||||
if submission.started_at:
|
||||
elapsed = (now - submission.started_at).total_seconds()
|
||||
allowed = assignment.time_limit * 60
|
||||
if elapsed > allowed + 60: # 1 minute grace period for network latency
|
||||
can_submit = False
|
||||
submission.is_time_expired = True
|
||||
submission.status = 'PENDING' # Or graded with 0
|
||||
submission.save()
|
||||
else:
|
||||
time_left_seconds = int(allowed - elapsed)
|
||||
if time_left_seconds < 0:
|
||||
time_left_seconds = 0
|
||||
else:
|
||||
can_submit = False # Already submitted
|
||||
|
||||
if request.method == 'POST':
|
||||
if needs_start and 'action' in request.POST and request.POST['action'] == 'start':
|
||||
Submission.objects.create(
|
||||
assignment=assignment,
|
||||
student=request.user,
|
||||
status='IN_PROGRESS',
|
||||
started_at=now
|
||||
)
|
||||
return redirect('lms:assignment_detail', pk=pk)
|
||||
|
||||
if submission and submission.status != 'IN_PROGRESS':
|
||||
return redirect('lms:dashboard')
|
||||
form = None
|
||||
else:
|
||||
if not can_submit:
|
||||
form = None
|
||||
elif request.method == 'POST':
|
||||
|
||||
if can_submit and not needs_start:
|
||||
form = AnswersForm(request.POST, request.FILES, questions=questions)
|
||||
if form.is_valid():
|
||||
submission = Submission.objects.create(assignment=assignment, student=request.user)
|
||||
if not submission:
|
||||
submission = Submission.objects.create(assignment=assignment, student=request.user)
|
||||
|
||||
all_auto = True
|
||||
total_points = 0
|
||||
max_points = 0
|
||||
|
||||
for q in questions:
|
||||
answer_obj = Answer(submission=submission, question=q)
|
||||
answer_obj = Answer.objects.filter(submission=submission, question=q).first()
|
||||
if not answer_obj:
|
||||
answer_obj = Answer(submission=submission, question=q)
|
||||
|
||||
if q.question_type == 'TEXT_AUTO':
|
||||
val = form.cleaned_data.get(f'answer_{q.id}', '')
|
||||
answer_obj.text_answer = val
|
||||
@@ -142,7 +175,12 @@ def assignment_detail(request, pk):
|
||||
submission.save()
|
||||
return redirect('lms:dashboard')
|
||||
else:
|
||||
form = None
|
||||
else:
|
||||
if can_submit and not needs_start:
|
||||
form = AnswersForm(questions=questions)
|
||||
else:
|
||||
form = None
|
||||
|
||||
question_fields = []
|
||||
if form:
|
||||
@@ -165,4 +203,6 @@ def assignment_detail(request, pk):
|
||||
'questions': questions,
|
||||
'question_fields': question_fields,
|
||||
'can_submit': can_submit,
|
||||
'needs_start': needs_start,
|
||||
'time_left_seconds': time_left_seconds,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user