def view_code_upload_chunk(request): ''' Creates the necessary db objects for code to be created in Caesar as a chunk and redirects the user to their new chunk after submission. ''' user = request.user if request.method == "POST": code = request.POST["code"] file_name = request.POST["filename"] assignment = Assignment.objects.get(name='Personal Code Upload') new_submit_milestone = SubmitMilestone(assignment=assignment, name=file_name, duedate=datetime.datetime.now()) new_submit_milestone.save() new_submission = Submission(milestone=new_submit_milestone, name=file_name) new_submission.save() #save it so you can add an author which is a ManyToManyField new_submission.authors.add(user) new_submission.save() new_file = File(submission=new_submission, data=code, path=user.username+"/"+file_name) #does file path matter? new_file.save() code_size = len(code.split('\n')) new_chunk = Chunk(file=new_file, name=file_name, start=0, end=len(code), student_lines=code_size, staff_portion=0) #start, end, name new_chunk.save() return HttpResponseRedirect(reverse('chunks.views.view_chunk', args=(new_chunk.id,) ))
def parse_student_files(usernames, files, batch, submit_milestone, save, student_base_dir, staff_code, restricted): # staff_code is a dictionary from filename to staff code # Trying to find the user(s) who wrote this submission. Bail if they don't all exist in the DB. users = User.objects.filter(username__in=usernames) if users.count() != len(set(usernames)): missing_users = set(usernames).difference([user.username for user in users]) for username in missing_users: print "user %s doesn't exist in the database." % username failed_users += missing_users return None submission_name = "-".join(usernames) # Shouldn't remake submissions if Submission.objects.filter(milestone=submit_milestone, authors__in=users).count() > 0: print "submission for %s already exists in the database." % submission_name return None # Creating the Submission object submission = Submission(milestone=submit_milestone, name=submission_name, batch=batch) if save: submission.save() for user in users: submission.authors.add(user) submission.save() print submission file_objects = [] chunk_objects = [] # Creating the File objects for file_path in files: file = create_file(file_path, submission) if len(file.data) == 0: continue # don't import empty files file_objects.append(file) if save: file.save() chunk = create_chunk(file) chunk_objects.append(chunk) if restricted: chunk.chunk_info = 'restricted' if save: chunk.save() student_code = file.data.split('\n') num_student_lines = len(student_code) if staff_code: # Assuming that the student's directory looks like student_base_dir + '/' + username + '/' + project_name_dir num_subdirs = len(student_base_dir.split('/')) + 1 # + 1 for student username relative_path = '/'.join(file_path.split('/')[num_subdirs:]) #print "looking for student path " + relative_path if relative_path in staff_code: # print "comparing with staff version of " + relative_path num_student_lines = 0 staff_lines = [] is_staff_line = False line_start = 0 current_line = 0 for line in student_code: if line.strip() in staff_code[relative_path]: if not is_staff_line: line_start = current_line is_staff_line = True else: num_student_lines += 1 if is_staff_line: staff_lines.append((line_start, current_line - 1)) is_staff_line = False current_line += 1 if is_staff_line: staff_lines.append((line_start, current_line - 1)) # print "staff lines = " + str(staff_lines) if save: for start, end in staff_lines: sm = StaffMarker(chunk=chunk, start_line=start+1, end_line=end+1) # StaffMarker uses 1-based numbering sm.save() chunk.student_lines = num_student_lines if num_student_lines > 0: print str(chunk) + ": " + str(num_student_lines) + " new student lines" if save: chunk.save() return (submission, file_objects, chunk_objects)
import logging import randomrouting.random_routing as rr # creating a fake SubmitMilestone, ReviewMilestone, Submission, File, and 50 Chunks assignment = Assignment.objects.all()[1] semester = assignment.semester semester_members = User.objects.filter(membership__semester=semester) user_in_class = semester_members[0] semester_non_members = User.objects.exclude(pk__in=semester_members) user_not_in_class = semester_non_members[0] rr_submit_milestone = SubmitMilestone(assignment=assignment,name="rr3_submit_milestone") rr_submit_milestone.save() rr_review_milestone = ReviewMilestone(assignment=assignment,submit_milestone=rr_submit_milestone,name="rr3_review_milestone") rr_review_milestone.save() rr_submission = Submission(milestone=rr_submit_milestone,name="rr3_submission") rr_submission.milestone_id = rr_submit_milestone.id rr_submission.save() rr_submission.authors.add(user_not_in_class) rr_file = Chunk.objects.filter(student_lines__gte=5)[0].file rr_file.pk = None rr_file.submission = rr_submission rr_file.save() rr_chunks = [] for i in range(1): rr_chunk = Chunk.objects.filter(student_lines__gte=5)[0] rr_chunk.pk = None rr_chunk.name = "chunk_"+str(i) rr_chunk.file = rr_file rr_chunk.save() rr_file.chunks.add(rr_chunk)
review_milestone.save() chunk_to_copy = Chunk.objects.filter(student_lines__gte=5)[0] file_to_copy = chunk_to_copy.file # make all the users members of the class # create a Submission for every member in the class for m in semester_members: roles = [Member.STUDENT, Member.STUDENT, Member.TEACHER, Member.VOLUNTEER] member = Member(semester=semester,user=m,role=roles[m.id%4]) # member = Member(semester=semester,user=m,role=Member.STUDENT) member.save() m.membership.add(member) m.save() semester.members.add(member) semester.save() submission = Submission(milestone=submit_milestone,name="submission_"+m.username) submission.pk = None # submission.milestone_id = submit_milestone.id submission.save() submission.authors.add(m) submission.save() # create 8 files that each have 1 chunk for i in range(8): file = file_to_copy file.pk = None file.submission = submission file.chunks = [] file.path = file.path + str(m.id) + "_" + str(i) file.submission_id = submission.id file.save() chunk = chunk_to_copy