f
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
from django.shortcuts import render, get_object_or_404, redirect
|
||||
from django.contrib.auth.decorators import login_required, user_passes_test
|
||||
from django.utils.html import strip_tags
|
||||
from .models import Assignment, Submission, Answer
|
||||
from .forms import AnswersForm, StudentRegistrationForm
|
||||
from django.contrib.auth import login
|
||||
def register(request):
|
||||
if request.user.is_authenticated:
|
||||
return redirect('lms:dashboard')
|
||||
if request.method == 'POST':
|
||||
form = StudentRegistrationForm(request.POST)
|
||||
if form.is_valid():
|
||||
user = form.save(commit=False)
|
||||
user.role = 'STUDENT'
|
||||
user.save()
|
||||
login(request, user)
|
||||
return redirect('lms:dashboard')
|
||||
else:
|
||||
form = StudentRegistrationForm()
|
||||
return render(request, 'lms/register.html', {'form': form})
|
||||
|
||||
def is_student(user):
|
||||
return user.is_authenticated and user.role == 'STUDENT'
|
||||
|
||||
def home(request):
|
||||
if request.user.is_authenticated:
|
||||
if getattr(request.user, 'role', None) == 'STUDENT':
|
||||
return redirect('lms:dashboard')
|
||||
else:
|
||||
return redirect('/admin/')
|
||||
return render(request, 'lms/home.html')
|
||||
|
||||
@login_required
|
||||
@user_passes_test(is_student, login_url='/login/')
|
||||
def dashboard(request):
|
||||
# Fetch assignments (could be all, or specific to student's classes)
|
||||
# For now, let's fetch all assignments.
|
||||
assignments = Assignment.objects.all().order_by('-created_at')
|
||||
|
||||
# Check which ones the student has submitted
|
||||
submissions = Submission.objects.filter(student=request.user)
|
||||
submitted_assignment_ids = submissions.values_list('assignment_id', flat=True)
|
||||
|
||||
return render(request, 'lms/dashboard.html', {
|
||||
'assignments': assignments,
|
||||
'submitted_assignment_ids': submitted_assignment_ids,
|
||||
'submissions': {sub.assignment_id: sub for sub in submissions}
|
||||
})
|
||||
|
||||
@login_required
|
||||
@user_passes_test(is_student, login_url='/login/')
|
||||
def assignment_detail(request, pk):
|
||||
assignment = get_object_or_404(Assignment, pk=pk)
|
||||
questions = assignment.questions.all()
|
||||
|
||||
# Try to get existing submission
|
||||
submission = Submission.objects.filter(assignment=assignment, student=request.user).first()
|
||||
|
||||
if submission:
|
||||
if request.method == 'POST':
|
||||
# Do not allow updating
|
||||
return redirect('lms:dashboard')
|
||||
form = None
|
||||
else:
|
||||
if request.method == 'POST':
|
||||
form = AnswersForm(request.POST, request.FILES, questions=questions)
|
||||
if form.is_valid():
|
||||
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)
|
||||
if q.question_type == 'TEXT_AUTO':
|
||||
val = form.cleaned_data.get(f'answer_{q.id}', '')
|
||||
answer_obj.text_answer = val
|
||||
if q.correct_answer:
|
||||
correct = strip_tags(q.correct_answer).strip().lower()
|
||||
answer_obj.is_correct = (val.strip().lower() == correct)
|
||||
answer_obj.points = 1 if answer_obj.is_correct else 0
|
||||
total_points += answer_obj.points
|
||||
else:
|
||||
all_auto = False
|
||||
max_points += 1
|
||||
else:
|
||||
all_auto = False
|
||||
val = form.cleaned_data.get(f'file_{q.id}')
|
||||
if val:
|
||||
answer_obj.file_answer = val
|
||||
answer_obj.save()
|
||||
|
||||
if all_auto and max_points > 0:
|
||||
submission.status = 'GRADED'
|
||||
submission.grade = f"{total_points}/{max_points}"
|
||||
else:
|
||||
submission.status = 'PENDING'
|
||||
submission.save()
|
||||
return redirect('lms:dashboard')
|
||||
else:
|
||||
form = AnswersForm(questions=questions)
|
||||
|
||||
question_fields = []
|
||||
if form:
|
||||
for q in questions:
|
||||
field = form[f'answer_{q.id}'] if q.question_type == 'TEXT_AUTO' else form[f'file_{q.id}']
|
||||
question_fields.append((q, field))
|
||||
|
||||
return render(request, 'lms/assignment_detail.html', {
|
||||
'assignment': assignment,
|
||||
'form': form,
|
||||
'submission': submission,
|
||||
'questions': questions,
|
||||
'question_fields': question_fields,
|
||||
})
|
||||
Reference in New Issue
Block a user