Exemplo n.º 1
0
def assign_tasks(review_milestone, reviewer, routing_algorithm='random', tasks_to_assign=None, simulate=False, chunk_id_task_map={}):
	# if tasks_to_assign == None, set tasks_to_assign equal to number required by the milestone for the reviewer's role
	if tasks_to_assign == None:
		tasks_to_assign = get_num_tasks_for_user(review_milestone, reviewer, simulate=simulate)
	reviewer_role = None
	if simulate:
		reviewer_role = reviewer['membership__role']
	else:
		reviewer_role = reviewer.membership.get(semester=review_milestone.assignment.semester).role
	# get all the chunks that the reviewer can review in the order they should be assigned
	reviewable_chunks = get_reviewable_chunks(review_milestone, reviewer, reviewer_role, simulate=simulate, chunk_id_task_map=chunk_id_task_map)
	chunks_to_assign = apply_routing_algorithm(reviewable_chunks, tasks_to_assign, routing_algorithm=routing_algorithm)
	# if len(chunks_to_assign) < num_tasks_for_user, the reviewer will be assigned fewer
	# tasks than they should be and they will be assigned more tasks the next time they
	# log in if there are more tasks they can be assigned

	# create and save tasks if it's NOT a simulation
	if not simulate:
		# create tasks for the chunks in chunks_to_assign and save them
		for chunk in chunks_to_assign:
			# create a ChunkReview if one doesn't already exist
			chunk_review, created = ChunkReview.objects.get_or_create(chunk=chunk)
			# update the ChunkReview
			if reviewer_role == Member.STUDENT or reviewer_role == Member.VOLUNTEER:
				chunk_review.student_or_alum_reviewers += 1
			elif reviewer_role == Member.TEACHER:
				chunk_review.staff_reviewers += 1
			chunk_review.save()
			# create a task
			task = Task(reviewer=reviewer, chunk=chunk, milestone=review_milestone, submission=chunk.file.submission, chunk_review=chunk_review)
			task.save()
	return len(chunks_to_assign)
Exemplo n.º 2
0
def assign_tasks(review_milestone, reviewer, routing_algorithm='random', tasks_to_assign=None, simulate=False, chunk_id_task_map={}):
	# if tasks_to_assign == None, set tasks_to_assign equal to number required by the milestone for the reviewer's role
	if tasks_to_assign == None:
		tasks_to_assign = get_num_tasks_for_user(review_milestone, reviewer, simulate=simulate)
	reviewer_role = None
	if simulate:
		reviewer_role = reviewer['membership__role']
	else:
		reviewer_role = reviewer.membership.get(semester=review_milestone.assignment.semester).role
	# get all the chunks that the reviewer can review in the order they should be assigned
	reviewable_chunks = get_reviewable_chunks(review_milestone, reviewer, reviewer_role, simulate=simulate, chunk_id_task_map=chunk_id_task_map)
	chunks_to_assign = apply_routing_algorithm(reviewable_chunks, tasks_to_assign, routing_algorithm=routing_algorithm)
	# if len(chunks_to_assign) < num_tasks_for_user, the reviewer will be assigned fewer
	# tasks than they should be and they will be assigned more tasks the next time they
	# log in if there are more tasks they can be assigned

	# create and save tasks if it's NOT a simulation
	if not simulate:
		# create tasks for the chunks in chunks_to_assign and save them
		for chunk in chunks_to_assign:
			# create a ChunkReview if one doesn't already exist
			chunk_review, created = ChunkReview.objects.get_or_create(chunk=chunk)
			# update the ChunkReview
			if reviewer_role == Member.STUDENT or reviewer_role == Member.VOLUNTEER:
				chunk_review.student_or_alum_reviewers += 1
			elif reviewer_role == Member.TEACHER:
				chunk_review.staff_reviewers += 1
			chunk_review.save()
			# create a task
			task = Task(reviewer=reviewer, chunk=chunk, milestone=review_milestone, submission=chunk.file.submission, chunk_review=chunk_review)
			task.save()
	return len(chunks_to_assign)
Exemplo n.º 3
0
def _generate_tasks(review_milestone,
                    reviewer,
                    chunk_map,
                    chunk_id_task_map=defaultdict(list),
                    max_tasks=sys.maxint,
                    assign_more=False):
    """
    Returns a list of tasks that should be assigned to the given reviewer.
    assignment: assignment that tasks should be generated for
    reviewer: user object to create more tasks for
    chunk_map: map of chunk ids to chunk object returned by load_chunks. If simulating routing, use the same chunk_map object each time.
    chunk_id_task_map: map of chunk ids to lists of the assigned tasks. If simulating routing, use the same chunk_id_task_map each time.
    """

    #unfinished_task_count = Task.objects.filter(reviewer=reviewer.id, chunk__file__submission__milestone__assignment=assignment).exclude(status='C').count()
    unfinished_tasks = Task.objects.filter(reviewer=reviewer.id,
                                           milestone=review_milestone)
    if assign_more:
        unfinished_tasks = unfinished_tasks.exclude(status='C').exclude(
            status='U')

    unfinished_task_count = unfinished_tasks.count()

    # Should task milestones have num_tasks_for_user?
    num_tasks_to_assign = num_tasks_for_user(review_milestone,
                                             reviewer) - unfinished_task_count
    if num_tasks_to_assign <= 0:
        return []

    if unfinished_task_count > 0:
        return []

    num_tasks_to_assign = min(num_tasks_to_assign, max_tasks)

    tasks = []
    for chunk_id in find_chunks(reviewer, chunk_map.values(),
                                num_tasks_to_assign,
                                review_milestone.reviewers_per_chunk,
                                review_milestone.min_student_lines, {}):
        submission = chunk_map[chunk_id].submission
        task = Task(reviewer_id=reviewer.id,
                    chunk_id=chunk_id,
                    milestone=review_milestone,
                    submission_id=submission.id)

        chunk_id_task_map[chunk_id].append(task)
        chunk_map[chunk_id].reviewers.add(reviewer)
        submission.reviewers.add(reviewer)
        tasks.append(task)

    return tasks
Exemplo n.º 4
0
# get the students
query = Q(username__in=args.usernames)
if args.all_students:
  query = query | Q(membership__semester=semester, membership__role=Member.STUDENT)
if args.all_staff:
  query = query | Q(membership__semester=semester, membership__role=Member.TEACHER)
students = User.objects.filter(query).distinct()
print "to reviewers ", students

def get_name(file):
  basename= os.path.basename(file.path)
  root,ext = os.path.splitext(basename)
  return root

# make chunk and task for each student/file pair
tasksCreated = 0
for student in students:
  for file in files:
    chunk = Chunk(file=file, name=get_name(file), start=0, end=len(file.data), class_type='none', staff_portion=0, student_lines=len(file.data.split('\n')))
    if not args.dry_run:
      chunk.save()
    task = Task(chunk=chunk, milestone=reviewMilestone, reviewer=student, submission=submission)
    tasksCreated += 1
    if not args.dry_run:
      task.save()

print tasksCreated, " tasks created"
if not args.dry_run:
  print "and saved to database"
Exemplo n.º 5
0
def get_name(file):
    basename = os.path.basename(file.path)
    root, ext = os.path.splitext(basename)
    return root


# make chunk and task for each student/file pair
tasksCreated = 0
for student in students:
    for file in files:
        chunk = Chunk(file=file,
                      name=get_name(file),
                      start=0,
                      end=len(file.data),
                      class_type='none',
                      staff_portion=0,
                      student_lines=len(file.data.split('\n')))
        if not args.dry_run:
            chunk.save()
        task = Task(chunk=chunk,
                    milestone=reviewMilestone,
                    reviewer=student,
                    submission=submission)
        tasksCreated += 1
        if not args.dry_run:
            task.save()

print tasksCreated, " tasks created"
if not args.dry_run:
    print "and saved to database"