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_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
|
||||||
|
|||||||
Reference in New Issue
Block a user