markup/webdav.py: more complete functionality
This commit is contained in:
@ -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
|
||||
|
||||
Reference in New Issue
Block a user