Exemplo n.º 1
0
def editAssignment(request, assignmentID):
    # Only creator of the course can edit this assignment.
    assignment = get_object_or_404(Assignment, pk=assignmentID)

    is_moderator = isCourseModerator(assignment.course, request.user)
    if not is_moderator:
        return HttpResponseForbidden("Forbidden 403")

    if request.method == 'POST':
        form = AssignmentForm(request.POST, request.FILES, initial=model_to_dict(assignment))
        form.assignment_model = assignment

        if form.is_valid():
            # check if new file is uploaded
            if 'document' in form.changed_data:
                if assignment.document:
                    assignment.document.delete(save=False)
                if not form.cleaned_data['document']:
                    form.cleaned_data.pop('document')

            if 'helper_code' in form.changed_data:
                if assignment.helper_code:
                    assignment.helper_code.delete(save=False)
                if not form.cleaned_data['helper_code']:
                    form.cleaned_data.pop('helper_code')

            if 'model_solution' in form.changed_data:
                if assignment.model_solution:
                    assignment.model_solution.delete(save=False)
                if not form.cleaned_data['model_solution']:
                    form.cleaned_data.pop('model_solution')

            for key in form.cleaned_data.keys():
                setattr(assignment, key, form.cleaned_data[key])

            for afield in ['model_solution', 'student_program_files', 'program_language']:
                if afield in form.changed_data:
                    assignment.verify_programs = True
                    assignment.program_model = Program
                    assignment.changed_list = form.changed_data
                    break
            assignment.save()

            if any(f in ['student_program_files', 'helper_code'] for f in form.changed_data):
                all_submissions = Upload.objects.select_related('owner').select_for_update().filter(assignment=assignment)
                all_submissions.update(is_stale=True)

                subject_line = "Evalpro: Please re-submit assignment '{0}' of the course '{1}'".format(assignment.name, assignment.course.name)
                message = "Course {0} assignment {1} specification has been changed since you submit your assignment last time. \
You are required to submit your assignment again. Your current submission will not be considered.".format(assignment.course.name, assignment.name)
                message_from = 'noreply@evalpro'
                message_to = [a.owner.email for a in all_submissions]
                send_mail(subject_line, message, message_from,
                          message_to, fail_silently=False)

            return HttpResponseRedirect(reverse('assignments_details', kwargs={'assignmentID':assignmentID}))
    else:
        form = AssignmentForm(initial=model_to_dict(assignment))

    course = assignment.course
    return render_to_response(
                'assignments/edit.html',
                {'assignment': assignment, 'form': form, 'course': course, 'is_moderator':is_moderator},
                context_instance=RequestContext(request),
            )
Exemplo n.º 2
0
def editAssignment(request, assignmentID):
    # Only creator of the course can edit this assignment.
    assignment = get_object_or_404(Assignment, pk=assignmentID)

    is_moderator = isCourseModerator(assignment.course, request.user)
    if not is_moderator:
        return HttpResponseForbidden("Forbidden 403")

    if request.method == 'POST':
        form = AssignmentForm(request.POST,
                              request.FILES,
                              initial=model_to_dict(assignment))
        form.assignment_model = assignment

        if form.is_valid():
            # check if new file is uploaded
            if 'document' in form.changed_data:
                if assignment.document:
                    assignment.document.delete(save=False)
                if not form.cleaned_data['document']:
                    form.cleaned_data.pop('document')

            if 'helper_code' in form.changed_data:
                if assignment.helper_code:
                    assignment.helper_code.delete(save=False)
                if not form.cleaned_data['helper_code']:
                    form.cleaned_data.pop('helper_code')

            if 'model_solution' in form.changed_data:
                if assignment.model_solution:
                    assignment.model_solution.delete(save=False)
                if not form.cleaned_data['model_solution']:
                    form.cleaned_data.pop('model_solution')

            for key in form.cleaned_data.keys():
                setattr(assignment, key, form.cleaned_data[key])

            for afield in [
                    'model_solution', 'student_program_files',
                    'program_language'
            ]:
                if afield in form.changed_data:
                    assignment.verify_programs = True
                    assignment.program_model = Program
                    assignment.changed_list = form.changed_data
                    break
            assignment.save()

            if any(f in ['student_program_files', 'helper_code']
                   for f in form.changed_data):
                all_submissions = Upload.objects.select_related(
                    'owner').select_for_update().filter(assignment=assignment)
                all_submissions.update(is_stale=True)

                subject_line = "Evalpro: Please re-submit assignment '{0}' of the course '{1}'".format(
                    assignment.name, assignment.course.name)
                message = "Course {0} assignment {1} specification has been changed since you submit your assignment last time. \
You are required to submit your assignment again. Your current submission will not be considered.".format(
                    assignment.course.name, assignment.name)
                message_from = 'noreply@evalpro'
                message_to = [a.owner.email for a in all_submissions]
                send_mail(subject_line,
                          message,
                          message_from,
                          message_to,
                          fail_silently=False)

            return HttpResponseRedirect(
                reverse('assignments_details',
                        kwargs={'assignmentID': assignmentID}))
    else:
        form = AssignmentForm(initial=model_to_dict(assignment))

    course = assignment.course
    return render_to_response(
        'assignments/edit.html',
        {
            'assignment': assignment,
            'form': form,
            'course': course,
            'is_moderator': is_moderator
        },
        context_instance=RequestContext(request),
    )