From e33359c318092cf47487f4ce2747136ce0ef189b Mon Sep 17 00:00:00 2001 From: Seth Ladygo Date: Tue, 10 Mar 2020 22:38:53 -0700 Subject: [PATCH] markup: add autosave dir for accidental my cats writes --- markup/webdav.py | 51 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/markup/webdav.py b/markup/webdav.py index a839c8c..17b7f99 100644 --- a/markup/webdav.py +++ b/markup/webdav.py @@ -58,6 +58,8 @@ def resource_factory(**kwargs): return MarkupResource(**kwargs) elif path == ReadmeResource.PATH: return ReadmeResource(**kwargs) + elif is_autosave_path(path): + return AutosaveResource(**kwargs) else: return NonsensicalResource(**kwargs) @@ -67,6 +69,9 @@ def is_my_cats_catalog(path): def is_markup_catalog(path): return re.search(fr'^{MarkupResource.PATH}', path, re.I) +def is_autosave_path(path): + return re.search(fr'^{AutosaveResource.PATH}', path, re.I) + class MarkupDavResource(MetaEtagMixIn, BaseDavResource): @@ -91,7 +96,8 @@ class RootFolderResource(MarkupDavResource): def get_children(self): children = [CatalogFolderResource(user=self.user), MarkupResource(user=self.user), - ReadmeResource(user=self.user) + ReadmeResource(user=self.user), + AutosaveResource(user=self.user) ] for child in children: yield child @@ -226,10 +232,9 @@ class CatalogResource(MarkupDavResource): 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_path = url_join(AutosaveResource.PATH, self.path[-1]) + autosave = AutosaveResource(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) @@ -269,7 +274,6 @@ class MarkupResource(MarkupDavResource, DummyFSDAVResource): 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): @@ -349,3 +353,40 @@ class ReadmeResource(MarkupDavResource, DummyFSDAVResource): def get_abs_path(self): return os.path.join(BASE_DIR, 'markup', self.NAME) + +class AutosaveResource(MarkupDavResource, DummyFSDAVResource): + NAME = 'Autosave' + PATH = f'/{NAME}/' + SUBDIR = 'autosave' + + def __init__(self, path=PATH, user=None): + super().__init__(path=path, user=user) + + def get_parent(self): + parent_path = self.path[:-1] + if len(parent_path): + return AutosaveResource(path=self.construct_path(parent_path, True), user=self.user) + else: + return RootFolderResource(user=self.user) + + def get_children(self): + path = self.get_abs_path() + if os.path.isdir(path): + for child in os.listdir(path): + is_unicode = isinstance(child, str) + if not is_unicode: + child = child.decode(fs_encoding) + yield AutosaveResource(path=url_join(*(self.path + [child])), user=self.user) + + def get_abs_path(self): + 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:]) + return path + + def write(self, request, temp_file=None, range_start=None): + super().write(request, temp_file=temp_file, range_start=range_start) + process_markup_pdf.delay(self.get_abs_path(), self.user.username) + + def get_acl(self): + return FullAcl()