def test_mark_worker_as_winner(self): self.assertEqual(self.staffing_request_inquiry.responses.all().count(), 0) mark_worker_as_winner(self.worker, self.staffing_request_inquiry.request.task, 0, self.staffing_request_inquiry) staffbot_request = self.staffing_request_inquiry.request staffbot_request.refresh_from_db() self.assertEqual(staffbot_request.status, StaffBotRequest.Status.CLOSED.value) self.assertEqual(self.staffing_request_inquiry.responses.all().count(), 0) # Can't mark another worker as a winner for this request worker2 = WorkerFactory() inquiry2 = StaffingRequestInquiryFactory( communication_preference__worker=worker2, communication_preference__communication_type=( CommunicationPreference.CommunicationType.NEW_TASK_AVAILABLE. value), request__task__step__is_human=True, request=self.staffing_request_inquiry.request) mark_worker_as_winner(worker2, inquiry2.request.task, 0, inquiry2) self.assertEqual(inquiry2.responses.count(), 0)
def test_mark_worker_as_winner(self): self.assertEqual(self.staffing_request_inquiry.responses.all().count(), 0) mark_worker_as_winner(self.worker, self.staffing_request_inquiry.request.task, 0, self.staffing_request_inquiry) staffbot_request = self.staffing_request_inquiry.request staffbot_request.refresh_from_db() self.assertEqual(staffbot_request.status, StaffBotRequest.Status.COMPLETE.value) self.assertEqual(self.staffing_request_inquiry.responses.all().count(), 1) response = self.staffing_request_inquiry.responses.first() self.assertTrue(response.is_winner) response.is_winner = False response.is_available = False mark_worker_as_winner(self.worker, self.staffing_request_inquiry.request.task, 0, None) self.assertEqual(self.staffing_request_inquiry.responses.all().count(), 1) response.refresh_from_db() self.assertTrue(response.is_winner)
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 assign_task(worker_id, task_id, staffing_request_inquiry=None): """ 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) required_role_counter = role_counter_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) if settings.PRODUCTION or settings.STAGING: add_worker_to_project_team(worker, task.project) notify_status_change(task, previous_status) mark_worker_as_winner(worker, task, required_role_counter, staffing_request_inquiry) return task