def restaff(self, task_id, username, request_cause=StaffBotRequest.RequestCause.USER.value): """ This function handles restaffing a request for the given task_id. The current user for the given username is removed, and a new user is found. """ # TODO(kkamalov): maybe username could also be slack_username try: worker = Worker.objects.get(user__username=username) task = Task.objects.get(id=task_id) task_assignment = TaskAssignment.objects.get(worker=worker, task=task) required_role_counter = task_assignment.assignment_counter error_msg = None except Worker.DoesNotExist: error_msg = self.worker_does_not_exist.format(username) except Task.DoesNotExist: error_msg = self.task_does_not_exist_error.format(task_id) except TaskAssignment.DoesNotExist: error_msg = (self.task_assignment_does_not_exist_error .format(username, task_id)) except TaskAssignmentError as error: error_msg = self.task_assignment_error.format(task_id, error) if error_msg is not None: logger.exception(error_msg) return format_slack_message(error_msg) StaffBotRequest.objects.create( task=task, required_role_counter=required_role_counter, request_cause=request_cause) return format_slack_message('Restaffed task {}!'.format(task_id))
def staff(self, task_id, request_cause=StaffBotRequest.RequestCause.USER.value): """ This function handles staffing a request for the given task_id. """ try: task = Task.objects.get(id=task_id) required_role_counter = role_counter_required_for_new_task(task) error_msg = None assert_new_task_status_valid(task.status) except TaskStatusError: error_msg = self.staffing_is_not_allowed.format(task_id) except Task.DoesNotExist: error_msg = self.task_does_not_exist_error.format(task_id) except TaskAssignmentError as error: error_msg = self.task_assignment_error.format(task_id, error) if error_msg is not None: logger.exception(error_msg) return format_slack_message(error_msg) StaffBotRequest.objects.create( task=task, required_role_counter=required_role_counter, request_cause=request_cause) return format_slack_message('Staffed task {}!'.format(task_id))
def post(self, request, *args, **kwargs): data = request.POST try: response_data = self.bot.dispatch(data) except SlackCommandInvalidRequest as e: response_data = format_slack_message(str(e)) except SlackUserUnauthorized as e: response_data = format_slack_message(str(e)) return JsonResponse(response_data)
def post(self, request, *args, **kwargs): data = request.POST try: response_data = self.bot.dispatch(data) except SlackCommandInvalidRequest as e: logger.exception('Invalid slack command') response_data = format_slack_message(str(e)) except SlackUserUnauthorized as e: logger.exception('Unauthorized slack user') response_data = format_slack_message(str(e)) return JsonResponse(response_data)
def no_command_found(self, text): """ If we are unable to parse the command, we return this helpful error message. """ return format_slack_message('{}: {}'.format(self.default_error_text, text))
def no_command_found(self, text): """ If we are unable to parse the command, we return this helpful error message. """ return format_slack_message( '{}: {}'.format(self.default_error_text, text) )
def staff(self, task_id, request_cause=StaffBotRequest.RequestCause.USER.value): """ This function handles staffing a request for the given task_id. """ command = 'staff {}'.format(task_id) try: task = Task.objects.get(id=task_id) required_role_counter = role_counter_required_for_new_task(task) error_msg = None assert_new_task_status_valid(task.status) except TaskStatusError: error_msg = self.staffing_is_not_allowed.format(task_id) except Task.DoesNotExist: error_msg = self.task_does_not_exist_error.format(task_id) except TaskAssignmentError as error: error_msg = self.task_assignment_error.format(task_id, error) if error_msg is not None: logger.exception(error_msg) return format_slack_message( command, attachments=[{ 'color': 'danger', 'title': 'Error', 'text': error_msg }]) StaffBotRequest.objects.create( task=task, required_role_counter=required_role_counter, request_cause=request_cause) slack_message = self.staffing_success.format(task_id) message_experts_slack_group(task.project.slack_group_id, slack_message) return format_slack_message( command, attachments=[{ 'color': 'good', 'title': 'Success', 'text': slack_message }])
def help(self): return format_slack_message( 'Use `/staffbot` to staff or restaff a Task within Orchestra.', attachments=[{ 'pretext': '`/staffbot staff <task-id>`', 'text': ('Ask qualified experts to work on' ' the given `<task-id>`.'), 'mrkdwn_in': ['text', 'pretext'], }, { 'pretext': '`/staffbot restaff <task-id> <username>`', 'text': ('Remove the given `<username>` from' ' the task and find another qualified expert'), 'mrkdwn_in': ['text', 'pretext'], }])
def help(self): return format_slack_message( 'Use `/staffbot` to staff or restaff a Task within Orchestra.', attachments=[ { 'pretext': '`/staffbot staff <task-id>`', 'text': ('Ask qualified experts to work on' ' the given `<task-id>`.'), 'mrkdwn_in': ['text', 'pretext'], }, { 'pretext': '`/staffbot restaff <task-id> <username>`', 'text': ('Remove the given `<username>` from' ' the task and find another qualified expert'), 'mrkdwn_in': ['text', 'pretext'], } ])
def restaff(self, task_id, username, request_cause=StaffBotRequest.RequestCause.USER.value): """ This function handles restaffing a request for the given task_id. The current user for the given username is removed, and a new user is found. """ command = 'restaff {} {}'.format(task_id, username) try: error_msg = None worker = Worker.objects.filter( Q(user__username=username) | Q(slack_username=username)) if worker.exists(): worker = worker.first() else: error_msg = self.worker_does_not_exist.format(username) return format_slack_message( command, attachments=[{ 'color': 'danger', 'title': 'Error', 'text': error_msg }]) task = Task.objects.get(id=task_id) task_assignment = TaskAssignment.objects.get(worker=worker, task=task) required_role_counter = task_assignment.assignment_counter except Task.DoesNotExist: error_msg = self.task_does_not_exist_error.format(task_id) except TaskAssignment.DoesNotExist: error_msg = (self.task_assignment_does_not_exist_error .format(username, task_id)) except TaskAssignmentError as error: error_msg = self.task_assignment_error.format(task_id, error) if error_msg is not None: logger.exception(error_msg) return format_slack_message( command, attachments=[{ 'color': 'danger', 'title': 'Error', 'text': error_msg }]) StaffBotRequest.objects.create( task=task, required_role_counter=required_role_counter, request_cause=request_cause) slack_message = self.restaffing_success.format(task_id) message_experts_slack_group(task.project.slack_group_id, slack_message) return format_slack_message( command, attachments=[{ 'color': 'good', 'title': 'Success', 'text': slack_message }])
def message_experts_slack_group(slack_channel, text): slack = OrchestraSlackService(settings.SLACK_EXPERTS_API_KEY) slack_message = format_slack_message(text) slack.chat.post_message(slack_channel, slack_message)