From 64ae5709e085acbe0bfad94bbb4d5bae6dfdf9dd Mon Sep 17 00:00:00 2001 From: Seth Ladygo Date: Fri, 28 Feb 2020 15:42:35 -0800 Subject: [PATCH] markup/webdav.py: more complete functionality --- markup/webdav.py | 59 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/markup/webdav.py b/markup/webdav.py index a8ce76b..82ff310 100644 --- a/markup/webdav.py +++ b/markup/webdav.py @@ -14,6 +14,9 @@ from django.utils.functional import cached_property 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.base.resources import BaseDavResource, MetaEtagMixIn from djangodav.fs.resources import DummyFSDAVResource @@ -24,6 +27,8 @@ from djangodav.views import DavView from procat2.models import Catalog from procat2.settings import ASSET_DIR +from .utils import clean_path, ensure_dir, set_file_perms, WORKDIR + log = logging.getLogger(__name__) fs_encoding = getfilesystemencoding() @@ -199,11 +204,38 @@ class CatalogResource(MarkupDavResource): else: 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): NAME = 'For Markup' PATH = f'/{NAME}/' + SUBDIR = 'markup' def get_parent(self): parent_path = self.path[:-1] @@ -222,8 +254,10 @@ class MarkupResource(MarkupDavResource, DummyFSDAVResource): yield MarkupResource(path=url_join(*(self.path + [child])), user=self.user) def get_abs_path(self): - path = os.path.join(self.get_markup_user_path(), *self.path[1:]) - # log.debug(f'markup folder user is {self.user} and path {self.path}: {path}') + base_dir = os.path.join(get_markup_user_path(self.user), self.SUBDIR) + 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 def write(self, request, temp_file=None, range_start=None): @@ -234,15 +268,34 @@ class MarkupResource(MarkupDavResource, DummyFSDAVResource): 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): - 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) def get_children(self): return yield + def delete(self): + return HttpResponseForbidden() + + def move(self): + return HttpResponseForbidden() + + def copy(self, destination, depth=-1): + return HttpResponseForbidden() + @property def getcontentlength(self): return 0