def handle_staffing_response(worker, staffing_request_inquiry_id, is_available=False): """ Args: worker (orchestra.models.Worker): Worker instance that responsed to a staffing request inquiry staffing_request_inquiry_id (int): Id of a staffing_request_inquiry that is associated with a response is_available (boolean): Boolean that tells whether worker accepted an inquiry or not Returns: response (orchestra.models.StaffingResponse): StaffingResponse object that has been created for the worker """ staffing_request_inquiry = get_object_or_None( StaffingRequestInquiry, communication_preference__worker=worker, id=staffing_request_inquiry_id) if staffing_request_inquiry is None: return None response = (StaffingResponse.objects.filter( request_inquiry=staffing_request_inquiry)) if response.exists(): response = response.first() if not is_available and response.is_winner: raise StaffingResponseException( 'Cannot reject after accepting the task') response.is_available = is_available else: response = StaffingResponse.objects.create( request_inquiry=staffing_request_inquiry, is_available=is_available) if (is_available and not StaffingResponse.objects.filter( request_inquiry__request=staffing_request_inquiry.request, is_winner=True).exists()): request = staffing_request_inquiry.request task_assignment = get_object_or_None( TaskAssignment, task=request.task, assignment_counter=request.required_role_counter) # if task assignment exists then reassign if task_assignment is not None: reassign_assignment(worker.id, task_assignment.id, staffing_request_inquiry) # otherwise assign task else: assign_task(worker.id, request.task.id, staffing_request_inquiry) response = (StaffingResponse.objects.filter( request_inquiry=staffing_request_inquiry).first()) check_responses_complete(staffing_request_inquiry.request) return response
def reassign_assignment_api(request): worker_username = load_encoded_json(request.body)['worker_username'] try: worker = Worker.objects.get(user__username=worker_username) except Worker.DoesNotExist: raise BadRequest('Worker not found for the given username.') assignment_id = load_encoded_json(request.body)['assignment_id'] try: reassign_assignment(worker.id, assignment_id) except (WorkerCertificationError, TaskAssignmentError) as e: raise BadRequest(e)
def handle_staffing_response(worker, staffing_request_inquiry_id, is_available=False): # TODO(kkamalov): add proper docstring staffing_request_inquiry = get_object_or_None( StaffingRequestInquiry, communication_preference__worker=worker, id=staffing_request_inquiry_id ) if staffing_request_inquiry is None: return None response = (StaffingResponse.objects .filter(request=staffing_request_inquiry)) if response.exists(): response = response.first() if not is_available and response.is_winner: raise StaffingResponseException( 'Cannot reject after accepting the task') response.is_available = is_available else: response = StaffingResponse.objects.create( request=staffing_request_inquiry, is_available=is_available) if (is_available and not StaffingResponse.objects.filter( request__request=staffing_request_inquiry.request, is_winner=True).exists()): response.is_winner = True request = staffing_request_inquiry.request task_assignment = get_object_or_None( TaskAssignment, task=request.task, assignment_counter=request.required_role_counter ) # if task assignment exists then reassign if task_assignment is not None: reassign_assignment(worker.id, task_assignment.id) # otherwise assign task else: assign_task(worker.id, request.task.id) response.save() check_responses_complete(staffing_request_inquiry.request) return response
def handle_staffing_response(worker, staffing_request_inquiry_id, is_available=False): """ Args: worker (orchestra.models.Worker): Worker instance that responsed to a staffing request inquiry staffing_request_inquiry_id (int): Id of a staffing_request_inquiry that is associated with a response is_available (boolean): Boolean that tells whether worker accepted an inquiry or not Returns: response (orchestra.models.StaffingResponse): StaffingResponse object that has been created for the worker """ # TODO(kkamalov): add proper docstring staffing_request_inquiry = get_object_or_None( StaffingRequestInquiry, communication_preference__worker=worker, id=staffing_request_inquiry_id ) if staffing_request_inquiry is None: return None response = (StaffingResponse.objects .filter(request_inquiry=staffing_request_inquiry)) if response.exists(): response = response.first() if not is_available and response.is_winner: raise StaffingResponseException( 'Cannot reject after accepting the task') response.is_available = is_available else: response = StaffingResponse.objects.create( request_inquiry=staffing_request_inquiry, is_available=is_available) if (is_available and not StaffingResponse.objects.filter( request_inquiry__request=staffing_request_inquiry.request, is_winner=True).exists()): response.is_winner = True request = staffing_request_inquiry.request task_assignment = get_object_or_None( TaskAssignment, task=request.task, assignment_counter=request.required_role_counter ) # if task assignment exists then reassign if task_assignment is not None: reassign_assignment(worker.id, task_assignment.id) # otherwise assign task else: assign_task(worker.id, request.task.id) response.save() check_responses_complete(staffing_request_inquiry.request) return response