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 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