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