autoload -U add-zsh-hook
add-zsh-hook chpwd __python_change_venv

function __python_change_venv() {
  local _path=$(pwd)
  local _paths=("${_path}")

  while [[ "${_path}" != "${HOME}" ]] && [[ "${_path}" != "/" ]]; do
    _path="${_path:h}"
    _paths+=("${_path}")
  done

  for _path in ${_paths}; do
    local _venv_config=$(find "${_path}" -maxdepth 2 -mindepth 2 -name pyvenv.cfg 2>/dev/null | head -n1)
    if [[ ${_venv_config} != "" ]]; then
      local _venv_path="${_venv_config:h}"
      source "${_venv_path}/bin/activate"
      break
    fi
  done

  if [[ "${VIRTUAL_ENV}" == "" ]]; then
    source "${DEFAULT_PYTHON_VENV}/bin/activate"
  fi
}