def test_is_worker_certified_for_task(self): task = Task.objects.filter(status=Task.Status.AWAITING_PROCESSING)[0] for worker_certification in ( WorkerCertification.objects.filter(worker=self.workers[0])): worker_certification.staffbot_enabled = False worker_certification.save() # workers[0] has a certification self.assertTrue( is_worker_certified_for_task(self.workers[0], task, WorkerCertification.Role.ENTRY_LEVEL)) self.assertFalse( is_worker_certified_for_task(self.workers[0], task, WorkerCertification.Role.ENTRY_LEVEL, require_staffbot_enabled=True)) # workers[2] has no certification self.assertFalse( is_worker_certified_for_task(self.workers[2], task, WorkerCertification.Role.ENTRY_LEVEL))
def test_is_worker_certified_for_task(self): task = Task.objects.filter(status=Task.Status.AWAITING_PROCESSING)[0] # workers[0] has a certification self.assertTrue( is_worker_certified_for_task(self.workers[0], task, WorkerCertification.Role.ENTRY_LEVEL)) # workers[2] has no certification self.assertFalse( is_worker_certified_for_task(self.workers[2], task, WorkerCertification.Role.ENTRY_LEVEL))
def _is_worker_assignable(worker, task, required_role): try: check_worker_allowed_new_assignment(worker) if (is_worker_certified_for_task( worker, task, required_role, require_staffbot_enabled=True) and not task.is_worker_assigned(worker)): return True except TaskStatusError: pass except TaskAssignmentError: pass return False
def send_request_inquiries(staffbot, request, worker_batch_size): # Get Workers that haven't already received an inquiry. workers_with_inquiries = (StaffingRequestInquiry.objects.filter( request=request).distinct().values_list( 'communication_preference__worker__id', flat=True)) # Sort Workers by their staffing priority first, and then randomly # within competing staffing priorities. workers = (Worker.objects .exclude(id__in=workers_with_inquiries) .order_by('-staffing_priority', '?')) required_role = get_role_from_counter(request.required_role_counter) inquiries_sent = 0 for worker in workers: try: check_worker_allowed_new_assignment(worker) if (is_worker_certified_for_task(worker, request.task, required_role, require_staffbot_enabled=True) and not request.task.is_worker_assigned(worker)): staffbot.send_task_to_worker(worker, request) inquiries_sent += 1 if inquiries_sent >= worker_batch_size: break except TaskStatusError: pass except TaskAssignmentError: pass # check whether all inquiries have been sent out. if inquiries_sent < worker_batch_size: message_experts_slack_group( request.task.project.slack_group_id, ('All staffing requests for task {} have been sent!' .format(request.task))) request.status = StaffBotRequest.Status.COMPLETE.value request.last_inquiry_sent = timezone.now() request.save()
def send_request_inquiries(staffbot, request, worker_batch_size): # Get Workers that haven't already received an inquiry. workers_with_inquiries = (StaffingRequestInquiry.objects.filter( request=request).distinct().values_list( 'communication_preference__worker__id', flat=True)) # Sort Workers by their staffing priority first, and then randomly # within competing staffing priorities. workers = (Worker.objects.exclude(id__in=workers_with_inquiries).order_by( '-staffing_priority', '?')) required_role = get_role_from_counter(request.required_role_counter) inquiries_sent = 0 for worker in workers: try: check_worker_allowed_new_assignment(worker) if (is_worker_certified_for_task(worker, request.task, required_role, require_staffbot_enabled=True) and not request.task.is_worker_assigned(worker)): staffbot.send_task_to_worker(worker, request) inquiries_sent += 1 if inquiries_sent >= worker_batch_size: break except TaskStatusError: pass except TaskAssignmentError: pass # check whether all inquiries have been sent out. if inquiries_sent < worker_batch_size: message_experts_slack_group( request.task.project.slack_group_id, ('All staffing requests for task {} have been sent!'.format( request.task))) request.status = StaffBotRequest.Status.COMPLETE.value request.last_inquiry_sent = timezone.now() request.save()
def _send_request_inquiries(staffbot, request, worker_batch_size, worker_certifications): inquiries_sent = 0 required_role = get_role_from_counter(request.required_role_counter) contacted_workers = set() for certification in worker_certifications: try: worker = certification.worker if worker.id in contacted_workers: continue contacted_workers.add(worker.id) check_worker_allowed_new_assignment(worker) if (is_worker_certified_for_task(worker, request.task, required_role, require_staffbot_enabled=True) and not request.task.is_worker_assigned(worker)): staffbot.send_task_to_worker(worker, request) inquiries_sent += 1 if inquiries_sent >= worker_batch_size: break except TaskStatusError: pass except TaskAssignmentError: pass # check whether all inquiries have been sent out. if inquiries_sent < worker_batch_size: message_experts_slack_group( request.task.project.slack_group_id, ('All staffing requests for task {} have been sent!'.format( request.task))) request.status = StaffBotRequest.Status.DONE_SENDING_INQUIRIES.value request.last_inquiry_sent = timezone.now() request.save()
def send_request_inquiries(staffbot, request, worker_batch_size): # get names of workers that that already received inquiry worker_usernames = (StaffingRequestInquiry.objects.filter( request=request).values_list( 'communication_preference__worker__user__username', flat=True)) workers = (Worker.objects .exclude(user__username__in=worker_usernames) .order_by('?')) required_role = get_role_from_counter(request.required_role_counter) inquiries_sent = 0 for worker in workers: try: check_worker_allowed_new_assignment(worker) if (is_worker_certified_for_task(worker, request.task, required_role) and not request.task.is_worker_assigned(worker)): staffbot.send_task_to_worker(worker, request) inquiries_sent += 1 if inquiries_sent >= worker_batch_size: break except TaskStatusError: pass except TaskAssignmentError: pass # check whether all inquiries have been sent out. if inquiries_sent < worker_batch_size: message_experts_slack_group( request.task.project.slack_group_id, ('All staffing requests for task {} have been sent!' .format(request.task))) request.status = StaffBotRequest.Status.COMPLETE.value request.save()
def _get_worker_for_task(self, task, role): # Get certified reviewer for worker in Worker.objects.all(): if is_worker_certified_for_task(worker, task, role): return worker