def _EnqueueUserRecallTasks(self, message_criteria, owner_email): """Efficiently add tasks for each user to recall messages (bulk add). Bulk add() saves roundtrips (rpc calls). Args: message_criteria: String criteria (message-id) to recall. owner_email: String email address of user running this recall. """ if recall_task.RecallTaskModel.IsTaskAborted(self._task_key_id): return cursor = None while True: user_recall_tasks = [] results, cursor, unused_more = ( domain_user.DomainUserToCheckModel.FetchOnePageOfActiveUsersForTask( task_key_id=self._task_key_id, cursor=cursor)) for user in results: user_recall_tasks.append(Task( name='%s_%s_%s' % ( view_utils.CreateSafeUserEmailForTaskName(owner_email), view_utils.CreateSafeUserEmailForTaskName(user.user_email), view_utils.GetCurrentDateTimeForTaskName()), params={'message_criteria': message_criteria, 'task_key_id': self._task_key_id, 'user_email': user.user_email, 'user_key_id': user.key.id()}, target='recall-backend', url='/backend/recall_user_messages')) if not user_recall_tasks: break self._AddUserRecallTasks(user_recall_tasks=user_recall_tasks)
def _EnqueueUserRetrievalTasks(self, message_criteria, owner_email): """Efficiently add tasks to enumerate domain users as a list (bulk add). Bulk add() saves roundtrips (rpc calls). Args: message_criteria: String criteria (message-id) to recall. owner_email: String email address of user running this recall. """ user_retrieval_tasks = [] # Use countdown to space out these requests a little. # There is a 15 request/s quota on the Admin SDK API. limit_requests_s = 15 for prefix_counter, email_prefix in enumerate(PartitionEmailPrefixes()): user_retrieval_tasks.append( Task(countdown=(prefix_counter / limit_requests_s), name='%s_%s_%s' % ( view_utils.CreateSafeUserEmailForTaskName(owner_email), email_prefix, view_utils.GetCurrentDateTimeForTaskName()), params={'email_prefix': email_prefix, 'message_criteria': message_criteria, 'owner_email': owner_email, 'task_key_id': self._task_key_id}, target='recall-backend', url='/backend/retrieve_domain_users')) self._AddUserRetrievalTask(task=user_retrieval_tasks)
def _EnqueueMasterRecallTask(self, owner_email, message_criteria, task_key_id): """Add master recall task with error handling. Args: owner_email: String email address of user running this recall. message_criteria: String criteria (message-id) to recall. task_key_id: Int unique id of the parent task. Raises: re-raises any task queue errors. """ task_name = '%s_%s' % (view_utils.CreateSafeUserEmailForTaskName( owner_email), view_utils.GetCurrentDateTimeForTaskName()) master_task = Task(name=task_name, params={ 'owner_email': owner_email, 'task_key_id': task_key_id, 'message_criteria': message_criteria }, target='0.recall-backend', url='/backend/recall_messages') try: master_task.add(queue_name='recall-messages-queue') except TaskQueueError: view_utils.FailRecallTask( task_key_id=task_key_id, reason_string='Failed to enqueue master task.') raise
def _AddTaskToMonitorUserRecallTasksHaveCompleted(self, owner_email): """Adds final task which monitors user recall tasks for completion. Args: owner_email: String email address of user running this recall. """ self._AddUserRecallTasks(user_recall_tasks=Task( name='%s_monitor_%s' % ( view_utils.CreateSafeUserEmailForTaskName(owner_email), view_utils.GetCurrentDateTimeForTaskName()), params={'task_key_id': self._task_key_id}, target='recall-backend', url='/backend/wait_for_task_completion'))