def assign_task(worker_id, task_id): """ Return a given task after assigning or reassigning it to the specified worker. Args: worker_id (int): The ID of the worker to be assigned. task_id (int): The ID of the task to be assigned. Returns: task (orchestra.models.Task): The newly assigned task. Raises: orchestra.core.errors.TaskAssignmentError: The specified worker is already assigned to the given task or the task status is not compatible with new assignment. orchestra.core.errors.WorkerCertificationError: The specified worker is not certified for the given task. """ worker = Worker.objects.get(id=worker_id) task = Task.objects.get(id=task_id) required_role = role_required_for_new_task(task) assignment = current_assignment(task) if not is_worker_certified_for_task(worker, task, required_role): raise WorkerCertificationError('Worker not certified for this task.') if task.is_worker_assigned(worker): raise TaskAssignmentError('Worker already assigned to this task.') assignment_counter = task.assignments.count() in_progress_task_data = {} if assignment: # In-progress task data is the latest # submission by a previous worker in_progress_task_data = assignment.in_progress_task_data previous_status = task.status if previous_status == Task.Status.AWAITING_PROCESSING: task.status = Task.Status.PROCESSING elif previous_status == Task.Status.PENDING_REVIEW: task.status = Task.Status.REVIEWING task.save() assignment = (TaskAssignment.objects.create( worker=worker, task=task, status=TaskAssignment.Status.PROCESSING, assignment_counter=assignment_counter, in_progress_task_data=in_progress_task_data)) Iteration.objects.create(assignment=assignment, start_datetime=assignment.start_datetime) add_worker_to_project_team(worker, task.project) notify_status_change(task, previous_status) return task
def reassign_assignment(worker_id, assignment_id, staffing_request_inquiry=None): """ Return a given assignment after reassigning it to the specified worker. Args: worker_id (int): The ID of the worker to be assigned. assignment_id (int): The ID of the assignment to be assigned. Returns: assignment (orchestra.models.TaskAssignment): The newly assigned assignment. Raises: orchestra.core.errors.TaskAssignmentError: The specified worker is already assigned to the given task. orchestra.core.errors.WorkerCertificationError: The specified worker is not certified for the given assignment. """ worker = Worker.objects.get(id=worker_id) assignment = TaskAssignment.objects.get(id=assignment_id) if assignment.assignment_counter > 0: role = WorkerCertification.Role.REVIEWER else: role = WorkerCertification.Role.ENTRY_LEVEL if not is_worker_certified_for_task(worker, assignment.task, role): raise WorkerCertificationError( 'Worker not certified for this assignment.') if assignment.task.is_worker_assigned(worker): raise TaskAssignmentError('Worker already assigned to this task.') assignment.worker = worker assignment.save() mark_worker_as_winner(worker, assignment.task, assignment.assignment_counter, staffing_request_inquiry) add_worker_to_project_team(worker, assignment.task.project) return assignment
def reassign_assignment(worker_id, assignment_id): """ Return a given assignment after reassigning it to the specified worker. Args: worker_id (int): The ID of the worker to be assigned. assignment_id (int): The ID of the assignment to be assigned. Returns: assignment (orchestra.models.TaskAssignment): The newly assigned assignment. Raises: orchestra.core.errors.TaskAssignmentError: The specified worker is already assigned to the given task. orchestra.core.errors.WorkerCertificationError: The specified worker is not certified for the given assignment. """ worker = Worker.objects.get(id=worker_id) assignment = TaskAssignment.objects.get(id=assignment_id) if assignment.assignment_counter > 0: role = WorkerCertification.Role.REVIEWER else: role = WorkerCertification.Role.ENTRY_LEVEL if not is_worker_certified_for_task(worker, assignment.task, role): raise WorkerCertificationError( 'Worker not certified for this assignment.') if assignment.task.is_worker_assigned(worker): raise TaskAssignmentError('Worker already assigned to this task.') assignment.worker = worker assignment.save() add_worker_to_project_team(worker, assignment.task.project) return assignment
def assign_task(worker_id, task_id): """ Return a given task after assigning or reassigning it to the specified worker. Args: worker_id (int): The ID of the worker to be assigned. task_id (int): The ID of the task to be assigned. Returns: task (orchestra.models.Task): The newly assigned task. Raises: orchestra.core.errors.TaskAssignmentError: The specified worker is already assigned to the given task or the task status is not compatible with new assignment. orchestra.core.errors.WorkerCertificationError: The specified worker is not certified for the given task. """ worker = Worker.objects.get(id=worker_id) task = Task.objects.get(id=task_id) required_role = role_required_for_new_task(task) assignment = current_assignment(task) if not is_worker_certified_for_task(worker, task, required_role): raise WorkerCertificationError('Worker not certified for this task.') if task.is_worker_assigned(worker): raise TaskAssignmentError('Worker already assigned to this task.') assignment_counter = task.assignments.count() in_progress_task_data = {} if assignment: # In-progress task data is the latest # submission by a previous worker in_progress_task_data = assignment.in_progress_task_data previous_status = task.status if previous_status == Task.Status.AWAITING_PROCESSING: task.status = Task.Status.PROCESSING elif previous_status == Task.Status.PENDING_REVIEW: task.status = Task.Status.REVIEWING task.save() assignment = ( TaskAssignment.objects .create(worker=worker, task=task, status=TaskAssignment.Status.PROCESSING, assignment_counter=assignment_counter, in_progress_task_data=in_progress_task_data)) Iteration.objects.create( assignment=assignment, start_datetime=assignment.start_datetime) add_worker_to_project_team(worker, task.project) notify_status_change(task, previous_status) return task