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)
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
# 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"
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"