def exists(self, path, environ) -> bool: """ Called by wsgidav to check if a certain path is linked to a _DAVResource """ path = normpath(path) working_path = self.reduce_path(path) root_path = environ['http_authenticator.realm'] parent_path = dirname(working_path) if path == root_path: return True user = UserApi(None).get_one_by_email( environ['http_authenticator.username']) workspace = self.get_workspace_from_path(path, WorkspaceApi(user)) if parent_path == root_path or workspace is None: return workspace is not None # TODO bastien: Arnaud avait mis a True, verif le comportement # lorsque l'on explore les dossiers archive et deleted content_api = ContentApi(user, show_archived=False, show_deleted=False) revision_id = re.search( r'/\.history/[^/]+/\((\d+) - [a-zA-Z]+\) ([^/].+)$', path) is_archived = self.is_path_archive(path) is_deleted = self.is_path_delete(path) if revision_id: revision_id = revision_id.group(1) content = content_api.get_one_revision(revision_id) else: content = self.get_content_from_path(working_path, content_api, workspace) return content is not None \ and content.is_deleted == is_deleted \ and content.is_archived == is_archived
def exists(self, path, environ) -> bool: """ Called by wsgidav to check if a certain path is linked to a _DAVResource """ path = normpath(path) working_path = self.reduce_path(path) root_path = environ['http_authenticator.realm'] parent_path = dirname(working_path) if path == root_path: return True user = UserApi(None).get_one_by_email(environ['http_authenticator.username']) workspace = self.get_workspace_from_path(path, WorkspaceApi(user)) if parent_path == root_path or workspace is None: return workspace is not None # TODO bastien: Arnaud avait mis a True, verif le comportement # lorsque l'on explore les dossiers archive et deleted content_api = ContentApi(user, show_archived=False, show_deleted=False) revision_id = re.search(r'/\.history/[^/]+/\((\d+) - [a-zA-Z]+\) ([^/].+)$', path) is_archived = self.is_path_archive(path) is_deleted = self.is_path_delete(path) if revision_id: revision_id = revision_id.group(1) content = content_api.get_one_revision(revision_id) else: content = self.get_content_from_path(working_path, content_api, workspace) return content is not None \ and content.is_deleted == is_deleted \ and content.is_archived == is_archived
def getResourceInst(self, path: str, environ: dict): """ Called by wsgidav whenever a request is called to get the _DAVResource corresponding to the path """ if not self.exists(path, environ): return None path = normpath(path) root_path = environ['http_authenticator.realm'] # If the requested path is the root, then we return a Root resource if path == root_path: return sql_resources.Root(path, environ) user = UserApi(None).get_one_by_email( environ['http_authenticator.username']) workspace_api = WorkspaceApi(user) workspace = self.get_workspace_from_path(path, workspace_api) # If the request path is in the form root/name, then we return a Workspace resource parent_path = dirname(path) if parent_path == root_path: if not workspace: return None return sql_resources.Workspace(path, environ, workspace) # And now we'll work on the path to establish which type or resource is requested content_api = ContentApi(user, show_archived=self._show_archive, show_deleted=self._show_delete) content = self.get_content_from_path(path=path, content_api=content_api, workspace=workspace) # Easy cases : path either end with /.deleted, /.archived or /.history, then we return corresponding resources if path.endswith( SpecialFolderExtension.Archived) and self._show_archive: return sql_resources.ArchivedFolder(path, environ, workspace, content) if path.endswith(SpecialFolderExtension.Deleted) and self._show_delete: return sql_resources.DeletedFolder(path, environ, workspace, content) if path.endswith( SpecialFolderExtension.History) and self._show_history: is_deleted_folder = re.search(r'/\.deleted/\.history$', path) is not None is_archived_folder = re.search(r'/\.archived/\.history$', path) is not None type = HistoryType.Deleted if is_deleted_folder \ else HistoryType.Archived if is_archived_folder \ else HistoryType.Standard return sql_resources.HistoryFolder(path, environ, workspace, content, type) # Now that's more complicated, we're trying to find out if the path end with /.history/file_name is_history_file_folder = re.search(r'/\.history/([^/]+)$', path) is not None if is_history_file_folder and self._show_history: return sql_resources.HistoryFileFolder(path=path, environ=environ, content=content) # And here next step : is_history_file = re.search( r'/\.history/[^/]+/\((\d+) - [a-zA-Z]+\) .+', path) is not None if self._show_history and is_history_file: revision_id = re.search( r'/\.history/[^/]+/\((\d+) - [a-zA-Z]+\) ([^/].+)$', path).group(1) content_revision = content_api.get_one_revision(revision_id) content = self.get_content_from_revision(content_revision, content_api) if content.type == ContentType.File: return sql_resources.HistoryFile(path, environ, content, content_revision) else: return sql_resources.HistoryOtherFile(path, environ, content, content_revision) # And if we're still going, the client is asking for a standard Folder/File/Page/Thread so we check the type7 # and return the corresponding resource if content is None: return None if content.type == ContentType.Folder: return sql_resources.Folder(path, environ, content.workspace, content) elif content.type == ContentType.File: return sql_resources.File(path, environ, content) else: return sql_resources.OtherFile(path, environ, content)
def getResourceInst(self, path: str, environ: dict): """ Called by wsgidav whenever a request is called to get the _DAVResource corresponding to the path """ if not self.exists(path, environ): return None path = normpath(path) root_path = environ['http_authenticator.realm'] # If the requested path is the root, then we return a Root resource if path == root_path: return sql_resources.Root(path, environ) user = UserApi(None).get_one_by_email(environ['http_authenticator.username']) workspace_api = WorkspaceApi(user) workspace = self.get_workspace_from_path(path, workspace_api) # If the request path is in the form root/name, then we return a Workspace resource parent_path = dirname(path) if parent_path == root_path: if not workspace: return None return sql_resources.Workspace(path, environ, workspace) # And now we'll work on the path to establish which type or resource is requested content_api = ContentApi( user, show_archived=False, # self._show_archive, show_deleted=False, # self._show_delete ) content = self.get_content_from_path( path=path, content_api=content_api, workspace=workspace ) # Easy cases : path either end with /.deleted, /.archived or /.history, then we return corresponding resources if path.endswith(SpecialFolderExtension.Archived) and self._show_archive: return sql_resources.ArchivedFolder(path, environ, workspace, content) if path.endswith(SpecialFolderExtension.Deleted) and self._show_delete: return sql_resources.DeletedFolder(path, environ, workspace, content) if path.endswith(SpecialFolderExtension.History) and self._show_history: is_deleted_folder = re.search(r'/\.deleted/\.history$', path) is not None is_archived_folder = re.search(r'/\.archived/\.history$', path) is not None type = HistoryType.Deleted if is_deleted_folder \ else HistoryType.Archived if is_archived_folder \ else HistoryType.Standard return sql_resources.HistoryFolder(path, environ, workspace, content, type) # Now that's more complicated, we're trying to find out if the path end with /.history/file_name is_history_file_folder = re.search(r'/\.history/([^/]+)$', path) is not None if is_history_file_folder and self._show_history: return sql_resources.HistoryFileFolder( path=path, environ=environ, content=content ) # And here next step : is_history_file = re.search(r'/\.history/[^/]+/\((\d+) - [a-zA-Z]+\) .+', path) is not None if self._show_history and is_history_file: revision_id = re.search(r'/\.history/[^/]+/\((\d+) - [a-zA-Z]+\) ([^/].+)$', path).group(1) content_revision = content_api.get_one_revision(revision_id) content = self.get_content_from_revision(content_revision, content_api) if content.type == ContentType.File: return sql_resources.HistoryFile(path, environ, content, content_revision) else: return sql_resources.HistoryOtherFile(path, environ, content, content_revision) # And if we're still going, the client is asking for a standard Folder/File/Page/Thread so we check the type7 # and return the corresponding resource if content is None: return None if content.type == ContentType.Folder: return sql_resources.Folder(path, environ, content.workspace, content) elif content.type == ContentType.File: return sql_resources.File(path, environ, content) else: return sql_resources.OtherFile(path, environ, content)