diff --git a/zimsoap/client.py b/zimsoap/client.py index 355a4ee..87b0f5d 100644 --- a/zimsoap/client.py +++ b/zimsoap/client.py @@ -7,8 +7,6 @@ for pre-authentification. """ - -from os.path import dirname, abspath, join import datetime import urllib import urllib2 @@ -783,6 +781,80 @@ def login(self, user, password): # !!! We need to authenticate with the 'urn:zimbraAccount' namespace self._session.login(user, password, 'urn:zimbraAccount') + def _extract_folders(self, folders, prefix=""): + result = [] + if not "name" in folders: + # log.debug("Unknown Object: %s" % unicode(folders)) + pass + else: + if folders["name"] == "USER_ROOT": + foldername = "/" + folders["name"] = foldername + else: + foldername = "%s/%s" % (prefix, folders["name"]) + prefix = foldername + folders["name"] = foldername + if "folder" in folders: + if "name" in folders["folder"]: + folders["folder"]["name"] = "%s/%s" % (foldername, folders["folder"]["name"]) + result.append(zobjects.Folder.from_dict(folders["folder"])) + else: + for folder in folders["folder"]: + result.extend(self._extract_folders(folder, prefix)) + del folders["folder"] + if "link" in folders: + # No folder or link under a link + if "name" in folders["link"]: + if foldername == "/": + folders["link"]["name"] = "/%s" % (folders["link"]["name"]) + else: + folders["link"]["name"] = "%s/%s" % (foldername, folders["link"]["name"]) + result.append(zobjects.Link.from_dict(folders["link"])) + else: + for link in folders["link"]: + link["name"] = "%s/%s" % (prefix, link["name"]) + if hasattr(link, "folder"): + del link.folder + result.append(zobjects.Link.from_dict(link)) + if "search" in folders: + # No folder or link under a link + if "name" in folders["search"]: + if foldername == "/": + folders["search"]["name"] = "/%s" % (folders["search"]["name"]) + else: + folders["search"]["name"] = "%s/%s" % (foldername, folders["search"]["name"]) + result.append(zobjects.Search.from_dict(folders["search"])) + else: + for search in folders["search"]: + search["name"] = "%s/%s" % (prefix, search["name"]) + result.append(zobjects.Search.from_dict(search)) + result.append(zobjects.Folder.from_dict(folders)) + return result + + def get_folders(self, visible=1, needGranteeName=1, view=None, depth=-1, tr=True): + """ Fetches all folders of an account. + + :param account: an account object, with either id or name attribute set. + :returns: a zobjects.Folders object, filled. + """ + folders = self.request_single('GetFolder', + {"visible": visible, "needGranteeName": needGranteeName, "view": view, + "depth": depth, "tr": tr}) + + return self._extract_folders(folders) + + def get_folder(self, folder, visible=1, needGranteeName=1, view=None, depth=-1, tr=True): + """ Fetches one folder of an account. + + :param folder: an Folder object, with path attribute set. + :returns: a zobjects.Folders object, filled. + """ + resp = self.request_single('GetFolder', {"folder": {"path": folder.path}, "visible": visible, + "needGranteeName": needGranteeName, "view": view, "depth": depth, + "tr": tr}) + + return zobjects.Folder.from_dict(resp) + def create_task(self, subject, desc): """Create a task diff --git a/zimsoap/zobjects.py b/zimsoap/zobjects.py index d20c2e6..5af36b2 100644 --- a/zimsoap/zobjects.py +++ b/zimsoap/zobjects.py @@ -536,4 +536,38 @@ def to_creator(self, subject, desc): return task +class Folder(ZObject): + TAG_NAME = 'folder' + ATTRNAME_PROPERTY = 'id' + SELECTORS = ('uuid', 'l', 'path') + + # Selectors for Folders don't use the standard form + def to_selector(self): + selector = None + for s in self.SELECTORS: + if hasattr(self, s): + selector = s + + if selector is None: + raise ValueError("At least one %s has to be set as attr." \ + % str(self.SELECTORS)) + + val = getattr(self, selector) + + return {selector: val} + + def get_unread(self): + if hasattr(self, "u"): + return self.u + else: + return 0 + +class Link(Folder): + TAG_NAME = 'link' + ATTRNAME_PROPERTY = 'id' + + +class Search(Folder): + TAG_NAME = 'search' + ATTRNAME_PROPERTY = 'id'