def archive(call: APICall, company_id, request: ArchiveRequest): archived = 0 tasks = TaskBLL.assert_exists( company_id, task_ids=request.tasks, only=("id", "execution", "status", "project", "system_tags"), ) for task in tasks: try: TaskBLL.dequeue_and_change_status( task, company_id, request.status_message, request.status_reason, ) except APIError: # dequeue may fail if the task was not enqueued pass task.update( status_message=request.status_message, status_reason=request.status_reason, system_tags=sorted( set(task.system_tags) | {EntityVisibility.archived.value} ), last_change=datetime.utcnow(), ) archived += 1 call.result.data_model = ArchiveResponse(archived=archived)
def archive_task( task: Union[str, Task], company_id: str, status_message: str, status_reason: str, ) -> int: """ Deque and archive task Return 1 if successful """ if isinstance(task, str): task = TaskBLL.get_task_with_access( task, company_id=company_id, only=( "id", "execution", "status", "project", "system_tags", "enqueue_status", ), requires_write_access=True, ) try: TaskBLL.dequeue_and_change_status( task, company_id, status_message, status_reason, ) except APIError: # dequeue may fail if the task was not enqueued pass return task.update( status_message=status_message, status_reason=status_reason, add_to_set__system_tags=EntityVisibility.archived.value, last_change=datetime.utcnow(), )
def delete_task( task_id: str, company_id: str, move_to_trash: bool, force: bool, return_file_urls: bool, delete_output_models: bool, status_message: str, status_reason: str, ) -> Tuple[int, Task, CleanupResult]: task = TaskBLL.get_task_with_access( task_id, company_id=company_id, requires_write_access=True ) if ( task.status != TaskStatus.created and EntityVisibility.archived.value not in task.system_tags and not force ): raise errors.bad_request.TaskCannotBeDeleted( "due to status, use force=True", task=task.id, expected=TaskStatus.created, current=task.status, ) try: TaskBLL.dequeue_and_change_status( task, company_id=company_id, status_message=status_message, status_reason=status_reason, ) except APIError: # dequeue may fail if the task was not enqueued pass cleanup_res = cleanup_task( task, force=force, return_file_urls=return_file_urls, delete_output_models=delete_output_models, ) if move_to_trash: collection_name = task._get_collection_name() archived_collection = "{}__trash".format(collection_name) task.switch_collection(archived_collection) try: # A simple save() won't do due to mongoengine caching (nothing will be saved), so we have to force # an insert. However, if for some reason such an ID exists, let's make sure we'll keep going. task.save(force_insert=True) except Exception: pass task.switch_collection(collection_name) task.delete() update_project_time(task.project) return 1, task, cleanup_res
def dequeue(call: APICall, company_id, request: UpdateRequest): task = TaskBLL.get_task_with_access( request.task, company_id=company_id, only=("id", "execution", "status", "project"), requires_write_access=True, ) res = DequeueResponse( **TaskBLL.dequeue_and_change_status( task, company_id, status_message=request.status_message, status_reason=request.status_reason, ) ) res.dequeued = 1 call.result.data_model = res
def dequeue_task( task_id: str, company_id: str, status_message: str, status_reason: str, ) -> Tuple[int, dict]: query = dict(id=task_id, company=company_id) task = Task.get_for_writing(**query) if not task: raise errors.bad_request.InvalidTaskId(**query) res = TaskBLL.dequeue_and_change_status( task, company_id, status_message=status_message, status_reason=status_reason, ) return 1, res