示例#1
0
    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))
示例#2
0
    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))
示例#3
0
    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))
示例#4
0
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
示例#5
0
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()
示例#6
0
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()
示例#7
0
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()
示例#8
0
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()
示例#9
0
 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
示例#10
0
 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