def unlock_task_after_mapping(mapped_task: MappedTaskDTO) -> TaskDTO: """ Unlocks the task and sets the task history appropriately """ task = MappingService.get_task_locked_by_user(mapped_task.project_id, mapped_task.task_id, mapped_task.user_id) new_state = TaskStatus[mapped_task.status.upper()] if new_state not in [ TaskStatus.MAPPED, TaskStatus.BADIMAGERY, TaskStatus.READY ]: raise MappingServiceError( 'Can only set status to MAPPED, BADIMAGERY, READY after mapping' ) # Update stats around the change of state last_state = TaskHistory.get_last_status(mapped_task.project_id, mapped_task.task_id, True) StatsService.update_stats_after_task_state_change( mapped_task.project_id, mapped_task.user_id, last_state, new_state) if mapped_task.comment: # Parses comment to see if any users have been @'d MessageService.send_message_after_comment(mapped_task.user_id, mapped_task.comment, task.id, mapped_task.project_id) task.unlock_task(mapped_task.user_id, new_state, mapped_task.comment) return task.as_dto_with_instructions(mapped_task.preferred_locale)
def unlock_tasks_after_validation( validated_dto: UnlockAfterValidationDTO) -> TaskDTOs: """ Unlocks supplied tasks after validation :raises ValidatatorServiceError """ validated_tasks = validated_dto.validated_tasks project_id = validated_dto.project_id user_id = validated_dto.user_id tasks_to_unlock = ValidatorService.get_tasks_locked_by_user( project_id, validated_tasks, user_id) # Unlock all tasks dtos = [] message_sent_to = [] for task_to_unlock in tasks_to_unlock: task = task_to_unlock['task'] if task_to_unlock['comment']: # Parses comment to see if any users have been @'d MessageService.send_message_after_comment( validated_dto.user_id, task_to_unlock['comment'], task.id, validated_dto.project_id) if task_to_unlock[ 'new_state'] == TaskStatus.VALIDATED or task_to_unlock[ 'new_state'] == TaskStatus.INVALIDATED: # All mappers get a notification if their task has been validated or invalidated. # Only once if multiple tasks mapped if task.mapped_by not in message_sent_to: MessageService.send_message_after_validation( task_to_unlock['new_state'], validated_dto.user_id, task.mapped_by, task.id, validated_dto.project_id) message_sent_to.append(task.mapped_by) if task_to_unlock['new_state'] == TaskStatus.VALIDATED: # Set last_validation_date for the mapper to current date task.mapper.last_validation_date = timestamp() # Update stats if user setting task to a different state from previous state prev_status = TaskHistory.get_last_status(project_id, task.id) if prev_status != task_to_unlock['new_state']: StatsService.update_stats_after_task_state_change( validated_dto.project_id, validated_dto.user_id, prev_status, task_to_unlock['new_state']) task_mapping_issues = ValidatorService.get_task_mapping_issues( task_to_unlock) task.unlock_task(validated_dto.user_id, task_to_unlock['new_state'], task_to_unlock['comment'], issues=task_mapping_issues) dtos.append( task.as_dto_with_instructions(validated_dto.preferred_locale)) task_dtos = TaskDTOs() task_dtos.tasks = dtos return task_dtos
def _set_counters_after_invalidated(task_id: int, project: Project, user: User): """ Set counters after user has validated a task """ last_state = TaskHistory.get_last_status(project.id, task_id) if last_state == TaskStatus.BADIMAGERY: project.tasks_bad_imagery -= 1 elif last_state == TaskStatus.MAPPED: project.tasks_mapped -= 1 elif last_state == TaskStatus.VALIDATED: project.tasks_mapped -= 1 project.tasks_validated -= 1 user.tasks_invalidated += 1
def undo_mapping(project_id: int, task_id: int, user_id: int, preferred_locale: str = 'en') -> TaskDTO: """ Allows a user to Undo the task state they updated """ task = MappingService.get_task(task_id, project_id) if not MappingService._is_task_undoable(user_id, task): raise MappingServiceError('Undo not allowed for this user') current_state = TaskStatus(task.task_status) undo_state = TaskHistory.get_last_status(project_id, task_id, True) StatsService.set_counters_after_undo(project_id, user_id, current_state, undo_state) task.unlock_task(user_id, undo_state, f'Undo state from {current_state.name} to {undo_state.name}', True) return task.as_dto_with_instructions(preferred_locale)