Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • dariah-de/textgridrep/repdav
1 result
Show changes
...@@ -32,7 +32,7 @@ config = { ...@@ -32,7 +32,7 @@ config = {
"host": os.getenv("host") or "localhost", "host": os.getenv("host") or "localhost",
"port": int(os.getenv("port") or "8080"), "port": int(os.getenv("port") or "8080"),
"provider_mapping": { "provider_mapping": {
"/": {"class": "repdav.textgrid_dav_provider.TextgridResourceProvider"}, "/": {"class": "repdav.textgrid_named_dav_provider.TextgridNamedResourceProvider"},
}, },
"verbose": 4, "verbose": 4,
"http_authenticator": { "http_authenticator": {
......
...@@ -264,6 +264,7 @@ class TextgridResource(DAVNonCollection): ...@@ -264,6 +264,7 @@ class TextgridResource(DAVNonCollection):
return self._info[self.name]["format"] return self._info[self.name]["format"]
def get_content(self): def get_content(self):
_logger.debug("Called TextgridResource.get_content(self) with path: %s", self.path)
config = TextgridConfig() config = TextgridConfig()
crud = TextgridCRUD(config.crud) crud = TextgridCRUD(config.crud)
return io.BytesIO(crud.read_data(self.path.split("/")[-1], self._sid).content) return io.BytesIO(crud.read_data(self.path.split("/")[-1], self._sid).content)
......
import io
import logging
import threading
from pprint import pformat
from tgclients.config import TextgridConfig
from tgclients.crud import TextgridCRUD
from tgclients.metadata import TextgridMetadata
from tgclients.auth import TextgridAuth
from wsgidav.util import join_uri
from repdav.stream_tools import FileLikeQueue
from repdav.textgrid_dav_provider import (
TextgridAggregation,
TextgridProject,
TextgridResource,
TextgridResourceProvider,
TextgridRoot,
)
_logger = logging.getLogger(__name__)
# ============================================================================
# TextgridNamedResourceProvider
# ============================================================================
class TextgridNamedResourceProvider(TextgridResourceProvider):
"""DAV provider that serves Textgrid resources."""
def get_resource_inst(self, path, environ):
_logger.debug(
"Called TextgridNamedResourceProvider.get_resource_inst(self, %s, %s).",
path,
pformat(environ),
)
self._count_get_resource_inst += 1
root = TextgridNamedRoot("/", environ)
# an instance of _DAVResource (i.e. either DAVCollection or DAVNonCollection)
return root.resolve("/", path)
class TextgridNamedRoot(TextgridRoot):
"""Top level collection that incorporates Textgrid projects.
This is implemented as READ-ONLY as projects may not be created with webDAV.
"""
def __init__(self, path, environ):
# TODO: do not overwrite but move to parent class
super().__init__(path, environ)
config = TextgridConfig()
self._auth = TextgridAuth(config)
def get_member_names(self):
_logger.debug("Called TextgridNamedRoot.get_member_names(self).")
projects = []
for project in tuple(self._auth.list_assigned_projects(self._sid)):
projects.append(
self._auth.get_project_description(project).name + " [" + project + "]"
)
_logger.debug("MY PROJECTS: %s", projects)
return projects
def get_member(self, name):
_logger.debug("Called TextgridRoot.get_member(self, %s).", name)
return TextgridNamedProject(join_uri(self.path, name), self.environ)
class TextgridNamedProject(TextgridProject):
def __init__(self, path, environ):
_logger.debug("Called TextgridNamedProject.__init__(self, %s, environ).", path)
super().__init__(path, environ)
self._tgmeta = TextgridMetadata()
def get_member_names(self):
_logger.debug("Called TextgridNamedProject.get_member_names(self).")
# names = []
# the item keys are textgrid uris but we want the resource titles only
# for _, member_dict in self._resources.items():
# names.append(member_dict.get("title"))
# return names
#
# path resolution has to be rewritten before we can work with resource titles
name = self.path.split("/")[-1]
project_id = name[name.rfind("[") + 1 : name.rfind("]")]
response = self._tgsearch.list_project_root(project_id, self._sid)
names = []
for result in response.result:
names.append(self._tgmeta.filename_from_metadata(result))
return names
def get_member(self, name):
_logger.debug("Called TextgridNamedProject.get_member(self, %s).", name)
tguri = "textgrid:" + self._tgmeta.id_from_filename(name)
response = self._tgsearch.info(tguri, self._sid)
info = {
name: {
"title": response.result[0].object_value.generic.provided.title,
"format": response.result[0].object_value.generic.provided.format,
"extent": response.result[0].object_value.generic.generated.extent,
}
}
_logger.info("INFO: %s", info)
if "aggregation" in info[name]["format"]:
return TextgridNamedAggregation(
join_uri(self.path, name), self.environ, info, self._tgmeta
)
return TextgridNamedResource(
join_uri(self.path, name), self.environ, info, self._tgmeta
)
class TextgridNamedAggregation(TextgridAggregation):
def __init__(self, path, environ, info, tgmeta):
_logger.debug(
"Called TextgridNamedAggregation.__init__(self, %s, environ, info).", path
)
super().__init__(path, environ, info)
self._tgmeta = tgmeta
def get_member_names(self):
_logger.debug("Called TextgridNamedAggregation.get_member_names(self).")
tguri = "textgrid:" + self._tgmeta.id_from_filename(self.path.split("/")[-1])
response = self._tgsearch.list_aggregation(tguri, self._sid)
names = []
for result in response.result:
names.append(self._tgmeta.filename_from_metadata(result))
return names
def get_member(self, name):
_logger.debug("Called TextgridNamedAggregation.get_member(self, %s).", name)
tguri = "textgrid:" + self._tgmeta.id_from_filename(name)
response = self._tgsearch.info(tguri, self._sid)
info = {
name: {
"title": response.result[0].object_value.generic.provided.title,
"format": response.result[0].object_value.generic.provided.format,
"extent": response.result[0].object_value.generic.generated.extent,
}
}
_logger.info("INFO: %s", info)
if "aggregation" in info[name]["format"]:
return TextgridNamedAggregation(
join_uri(self.path, name), self.environ, info, self._tgmeta
)
return TextgridNamedResource(
join_uri(self.path, name), self.environ, info, self._tgmeta
)
class TextgridNamedResource(TextgridResource):
"""Non-Aggregation resources."""
def __init__(self, path, environ, info, tgmeta):
_logger.debug("Called TextgridNamedResource.__init__(self, %s, environ).", path)
super().__init__(path, environ, info)
self._tgmeta = tgmeta
config = TextgridConfig()
self._crud = TextgridCRUD(config.crud)
def get_content(self):
_logger.debug(
"Called TextgridNamedResource.get_content(self) with path: %s", self.path
)
# TODO: make tguri (super!) class member
tguri = "textgrid:" + self._tgmeta.id_from_filename(self.path.split("/")[-1])
return io.BytesIO(self._crud.read_data(tguri, self._sid).content)
def begin_write(self, content_type=None):
_logger.debug(
"Called TextgridResource.begin_write(self, content_type=%s).", content_type
)
queue = FileLikeQueue(int(self._size))
tguri = "textgrid:" + self._tgmeta.id_from_filename(self.path.split("/")[-1])
metadata = self._crud.read_metadata(tguri, self._sid).content
def worker():
_logger.debug("Called TextgridResource.begin_write.worker().")
self._crud.update_resource(self._sid, tguri, queue, metadata)
thread = threading.Thread(target=worker)
thread.setDaemon(True)
thread.start()
self.upload_thread = thread
return queue