示例#1
0
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,) ))
示例#2
0
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)
示例#3
0
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)
示例#4
0
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