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, })