Exemplo n.º 1
0
def createAssignment(request, courseID):
    course = get_object_or_404(Course, pk=courseID)

    is_moderator = isCourseModerator(course, request.user)

    if not is_moderator:
        return HttpResponseForbidden("Forbidden 403")

    if request.method == 'POST':
        form = AssignmentForm(request.POST, request.FILES)
        form.this_course = course
        if form.is_valid():
            newAssignment = Assignment(**form.cleaned_data)
            newAssignment.course = course
            newAssignment.creater = request.user
            newAssignment.serial_number = (
                Assignment.objects.filter(course=course).aggregate(
                    Max('serial_number'))['serial_number__max'] or 0) + 1
            newAssignment.save()
            link = reverse('assignments_createprogram',
                           kwargs={'assignmentID': newAssignment.id})
            messages.success(
                request,
                'Assignment Created! Now <a href="{0}">ADD</a> programs to assignment.'
                .format(link),
                extra_tags='safe')
            #return HttpResponseRedirect(reverse('assignments_index', kwargs={'courseID':courseID}))
            return HttpResponseRedirect(
                reverse('assignments_details',
                        kwargs={'assignmentID': newAssignment.id}))
    else:
        form = AssignmentForm()
    return render_to_response('assignments/createAssignment.html', {
        '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),
    )