Warning
This document is for an in-development version of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.files.sources.webdav
from typing import (
Annotated,
Optional,
Union,
)
from pydantic import (
Field,
)
from galaxy.files.models import FilesSourceRuntimeContext
from galaxy.util.config_templates import TemplateExpansion
from ._fsspec import (
CacheOptionsDictType,
FsspecBaseFileSourceConfiguration,
FsspecBaseFileSourceTemplateConfiguration,
FsspecFilesSource,
)
try:
from webdav4.fsspec import WebdavFileSystem
except ImportError:
WebdavFileSystem = None
class WebDavFileSourceTemplateConfiguration(FsspecBaseFileSourceTemplateConfiguration):
root: Optional[Union[str, TemplateExpansion]] = None
base_url: Union[str, TemplateExpansion]
login: Optional[Union[str, TemplateExpansion]] = None
password: Optional[Union[str, TemplateExpansion]] = None
class WebDavFileSourceConfiguration(FsspecBaseFileSourceConfiguration):
root: Optional[str] = None
base_url: Annotated[
str,
Field(
title="WebDAV base URL",
description="The fully-qualified WebDAV endpoint URL used to access this file source.",
),
]
login: Optional[str] = None
password: Optional[str] = None
[docs]
class WebDavFilesSource(FsspecFilesSource[WebDavFileSourceTemplateConfiguration, WebDavFileSourceConfiguration]):
plugin_type = "webdav"
required_module = WebdavFileSystem
required_package = "webdav4"
template_config_class = WebDavFileSourceTemplateConfiguration
resolved_config_class = WebDavFileSourceConfiguration
@staticmethod
def _webdav_endpoint(base_url: str, root: Optional[str]) -> str:
# WebDAV "root" is the service endpoint path (for example Nextcloud's
# /remote.php/dav/files/user), not a directory prefix inside the file source.
base_url = base_url.strip().rstrip("/")
if not base_url:
raise ValueError("base_url is required for WebDAV file source")
root = root.strip().strip("/") if root else ""
if root:
return f"{base_url}/{root}"
return base_url
def _open_fs(
self,
context: FilesSourceRuntimeContext[WebDavFileSourceConfiguration],
cache_options: CacheOptionsDictType,
):
if WebdavFileSystem is None:
raise self.required_package_exception
config = context.config
auth = (config.login, config.password) if config.login or config.password else None
return WebdavFileSystem(self._webdav_endpoint(config.base_url, config.root), auth=auth)
def _to_filesystem_path(self, path: str, config: WebDavFileSourceConfiguration) -> str:
if path in ("", "/"):
return ""
return path.lstrip("/")
def _adapt_entry_path(self, filesystem_path: str, config: WebDavFileSourceConfiguration) -> str:
if not filesystem_path or filesystem_path == "/":
return "/"
return filesystem_path if filesystem_path.startswith("/") else f"/{filesystem_path}"
__all__ = ("WebDavFilesSource",)