markup/webdav.py: more complete functionality

This commit is contained in:
2020-02-28 15:42:35 -08:00
parent 7cf6c0d24f
commit 64ae5709e0

View File

@ -14,6 +14,9 @@ from django.utils.functional import cached_property
from django_http_auth.decorators import http_basic_auth from django_http_auth.decorators import http_basic_auth
from django.http import HttpResponseForbidden, HttpResponseNotAllowed, HttpResponseBadRequest, \
HttpResponseRedirect, Http404, HttpResponse, FileResponse
from djangodav.acls import DavAcl, ReadOnlyAcl, FullAcl from djangodav.acls import DavAcl, ReadOnlyAcl, FullAcl
from djangodav.base.resources import BaseDavResource, MetaEtagMixIn from djangodav.base.resources import BaseDavResource, MetaEtagMixIn
from djangodav.fs.resources import DummyFSDAVResource from djangodav.fs.resources import DummyFSDAVResource
@ -24,6 +27,8 @@ from djangodav.views import DavView
from procat2.models import Catalog from procat2.models import Catalog
from procat2.settings import ASSET_DIR from procat2.settings import ASSET_DIR
from .utils import clean_path, ensure_dir, set_file_perms, WORKDIR
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
fs_encoding = getfilesystemencoding() fs_encoding = getfilesystemencoding()
@ -199,11 +204,38 @@ class CatalogResource(MarkupDavResource):
else: else:
return None return None
def delete(self):
pass
def copy_object(self, destination, depth=0):
dest = destination.get_abs_path()
dest_dir = dirname(dest)
Path(dest_dir).mkdir(parents=True, exist_ok=True)
shutil.copy(self.catalog.pdf_file(), dest)
def move_object(self, destination):
os.rename(self.get_abs_path(), destination.get_abs_path())
def write(self, request, temp_file=None, range_start=None):
autosave_path = url_join(MarkupResource.PATH, 'Autosave', self.path[-1])
autosave = MarkupResource(path=autosave_path, user=self.user)
autosave_dir = autosave.get_abs_path()
log.debug(f'autosave_dir: {autosave_dir}')
ensure_dir(dirname(autosave_dir))
return autosave.write(request, temp_file=None, range_start=None)
def get_acl(self):
return DavAcl(read=True, write=True, delete=False, full=None)
def get_markup_user_path(user):
return os.path.join(ASSET_DIR, 'markup', 'webdav', user.username if user else 'unknown_user')
class MarkupResource(MarkupDavResource, DummyFSDAVResource): class MarkupResource(MarkupDavResource, DummyFSDAVResource):
NAME = 'For Markup' NAME = 'For Markup'
PATH = f'/{NAME}/' PATH = f'/{NAME}/'
SUBDIR = 'markup'
def get_parent(self): def get_parent(self):
parent_path = self.path[:-1] parent_path = self.path[:-1]
@ -222,8 +254,10 @@ class MarkupResource(MarkupDavResource, DummyFSDAVResource):
yield MarkupResource(path=url_join(*(self.path + [child])), user=self.user) yield MarkupResource(path=url_join(*(self.path + [child])), user=self.user)
def get_abs_path(self): def get_abs_path(self):
path = os.path.join(self.get_markup_user_path(), *self.path[1:]) base_dir = os.path.join(get_markup_user_path(self.user), self.SUBDIR)
# log.debug(f'markup folder user is {self.user} and path {self.path}: {path}') ensure_dir(base_dir)
path = os.path.join(base_dir, *self.path[1:])
# log.debug(f'markup: get abs path for {self.path}: base {base_dir}')
return path return path
def write(self, request, temp_file=None, range_start=None): def write(self, request, temp_file=None, range_start=None):
@ -234,15 +268,34 @@ class MarkupResource(MarkupDavResource, DummyFSDAVResource):
class NonsensicalResource(MarkupDavResource): class NonsensicalResource(MarkupDavResource):
NAME = 'Misc'
PATH = f'/{NAME}/'
SUBDIR = 'misc'
def get_abs_path(self):
base_dir = os.path.join(get_markup_user_path(self.user), self.SUBDIR)
ensure_dir(base_dir)
log.debug(f'nonsense: get abs path for {self.path}: base {base_dir}')
path = os.path.join(base_dir, *self.path[1:])
return path
def get_parent(self): def get_parent(self):
log.debug(f'nonsense parent of {self.path}') log.debug(f'nonsense parent of {self.path} is root')
return RootFolderResource(path=RootFolderResource.PATH, user=self.user) return RootFolderResource(path=RootFolderResource.PATH, user=self.user)
def get_children(self): def get_children(self):
return return
yield yield
def delete(self):
return HttpResponseForbidden()
def move(self):
return HttpResponseForbidden()
def copy(self, destination, depth=-1):
return HttpResponseForbidden()
@property @property
def getcontentlength(self): def getcontentlength(self):
return 0 return 0