mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
A hierarchy delimiter is not always the same.
This code will behave better but it is far from perfect. see #435
This commit is contained in:
@@ -146,6 +146,7 @@ class IMAPconnector(object):
|
||||
unseen_pattern = re.compile(r'[^\(]+\(UNSEEN (\d+)\)')
|
||||
|
||||
def __init__(self, user=None, password=None):
|
||||
self.__hdelimiter = None
|
||||
self.criterions = []
|
||||
self.address = parameters.get_admin("IMAP_SERVER")
|
||||
self.port = int(parameters.get_admin("IMAP_PORT"))
|
||||
@@ -220,6 +221,23 @@ class IMAPconnector(object):
|
||||
bodystruct[5], int(bodystruct[6]))
|
||||
return (None, None, 0)
|
||||
|
||||
@property
|
||||
def hdelimiter(self):
|
||||
"""Return the default hierachy delimiter.
|
||||
|
||||
This is a simple way to retrieve the default delimiter (see
|
||||
http://www.imapwiki.org/ClientImplementation/MailboxList).
|
||||
|
||||
:return: a string
|
||||
"""
|
||||
if self.__hdelimiter is None:
|
||||
data = self._cmd("LIST", "", "")
|
||||
m = self.list_response_pattern.match(data[0])
|
||||
if m is None:
|
||||
raise WebmailError(_("Failed to retrieve hierarchy delimiter"))
|
||||
self.__hdelimiter = m.group('delimiter')
|
||||
return self.__hdelimiter
|
||||
|
||||
def refresh(self, user, password):
|
||||
"""Check if current connection needs a refresh
|
||||
|
||||
@@ -378,7 +396,7 @@ class IMAPconnector(object):
|
||||
newmboxes += [descr]
|
||||
|
||||
if re.search("\%s" % delimiter, name):
|
||||
parts = name.split(".")
|
||||
parts = name.split(delimiter)
|
||||
if not descr.has_key("path"):
|
||||
descr["path"] = parts[0]
|
||||
descr["sub"] = []
|
||||
@@ -392,7 +410,9 @@ class IMAPconnector(object):
|
||||
|
||||
@capability('LIST-EXTENDED', '_listmboxes_simple')
|
||||
def _listmboxes(self, topmailbox, mailboxes, until_mailbox=None):
|
||||
pattern = ("%s.%%" % topmailbox.encode("imap4-utf-7")) if len(topmailbox) else "%"
|
||||
pattern = "%s%s%%" % (topmailbox.encode("imap4-utf-7"), self.hdelimiter) \
|
||||
if len(topmailbox) else "%"
|
||||
print pattern
|
||||
resp = self._cmd("LIST", "", pattern, "RETURN", "(CHILDREN)")
|
||||
newmboxes = []
|
||||
for mb in resp:
|
||||
@@ -452,7 +472,7 @@ class IMAPconnector(object):
|
||||
{"name" : parameters.get_user(user, "TRASH_FOLDER"),
|
||||
"class" : "icon-trash"}]
|
||||
if until_mailbox:
|
||||
name, parent = separate_mailbox(until_mailbox)
|
||||
name, parent = separate_mailbox(until_mailbox, self.hdelimiter)
|
||||
if parent:
|
||||
until_mailbox = parent
|
||||
self._listmboxes(topmailbox, md_mailboxes, until_mailbox)
|
||||
@@ -536,7 +556,7 @@ class IMAPconnector(object):
|
||||
|
||||
def create_folder(self, name, parent=None):
|
||||
if parent is not None:
|
||||
name = "%s.%s" % (parent, name)
|
||||
name = "%s%s%s" % (parent, self.hdelimiter, name)
|
||||
typ, data = self.m.create(self._encode_mbox_name(name))
|
||||
if typ == "NO":
|
||||
raise WebmailError(data[0])
|
||||
@@ -659,7 +679,7 @@ def separate_mailbox(fullname, sep="."):
|
||||
If a separator is found in ``fullname``, this function returns the
|
||||
corresponding name and parent mailbox name.
|
||||
"""
|
||||
if fullname.count("."):
|
||||
if sep in fullname:
|
||||
parts = fullname.split(sep)
|
||||
name = parts[-1]
|
||||
parent = sep.join(parts[0:len(parts) - 1])
|
||||
|
||||
@@ -15,7 +15,8 @@ Webmail.prototype = {
|
||||
submboxes_url: "",
|
||||
delattachment_url: "",
|
||||
ro_mboxes: ["INBOX"],
|
||||
trash: ""
|
||||
trash: "",
|
||||
hdelimiter: '.'
|
||||
},
|
||||
|
||||
initialize: function(options) {
|
||||
@@ -217,7 +218,7 @@ Webmail.prototype = {
|
||||
}
|
||||
|
||||
var $link = $('a[href="' + mailbox + '"]');
|
||||
var parts = mailbox.split('.');
|
||||
var parts = mailbox.split(this.options.hdelimiter);
|
||||
var dname = " " + parts[parts.length - 1];
|
||||
var $i = $link.children("i");
|
||||
|
||||
@@ -285,7 +286,7 @@ Webmail.prototype = {
|
||||
'class': "block",
|
||||
href: mailbox
|
||||
});
|
||||
var parts = mailbox.split(".");
|
||||
var parts = mailbox.split(this.options.hdelimiter);
|
||||
var linkcontent = "<i class='icon-folder-close'></i> ";
|
||||
var displayname = linkcontent + parts[parts.length - 1];
|
||||
|
||||
@@ -401,18 +402,18 @@ Webmail.prototype = {
|
||||
* to access this mailbox are also loaded)
|
||||
*/
|
||||
load_and_select_mailbox: function(mailbox) {
|
||||
if (mailbox.indexOf(".") == -1) {
|
||||
if (mailbox.indexOf(this.options.hdelimiter) == -1) {
|
||||
this.select_mailbox(mailbox);
|
||||
return;
|
||||
}
|
||||
this.reset_mb_selection();
|
||||
|
||||
var parts = mailbox.split(".");
|
||||
var parts = mailbox.split(this.options.hdelimiter);
|
||||
var curmb = parts[0], lastmb = "";
|
||||
|
||||
for (var i = 1; i < parts.length; i++) {
|
||||
lastmb = curmb;
|
||||
curmb += "." + parts[i];
|
||||
curmb += this.options.hdelimiter + parts[i];
|
||||
|
||||
var $link = $('a[href="' + curmb + '"]');
|
||||
var $container = $('li[name="' + lastmb + '"]');
|
||||
@@ -535,7 +536,7 @@ Webmail.prototype = {
|
||||
return;
|
||||
}
|
||||
$parent = $ul;
|
||||
mailbox = $parent.attr("name") + "." + mailbox;
|
||||
mailbox = $parent.attr("name") + this.hdelimiter + mailbox;
|
||||
} else {
|
||||
$parent = $("#mboxes_container").children("ul");
|
||||
}
|
||||
@@ -548,8 +549,8 @@ Webmail.prototype = {
|
||||
* If needed, the mailbox will be moved to its new location.
|
||||
*/
|
||||
rename_mailbox: function(oldname, newname, oldparent, newparent) {
|
||||
var oldpattern = (oldparent) ? oldparent + "." + oldname : oldname;
|
||||
var newpattern = (newparent) ? newparent + "." + newparent : newname;
|
||||
var oldpattern = (oldparent) ? oldparent + this.hdelimiter + oldname : oldname;
|
||||
var newpattern = (newparent) ? newparent + this.hdelimiter + newparent : newname;
|
||||
var $link = $("#folders").find('a[href="' + oldpattern + '"]');
|
||||
|
||||
if (oldname != newname) {
|
||||
@@ -562,7 +563,7 @@ Webmail.prototype = {
|
||||
this.navobject.setparam("mbox", newname).update(false, true);
|
||||
}
|
||||
if (oldparent != newparent) {
|
||||
var newlocation = (newparent) ? newparent + "." + newname : newname;
|
||||
var newlocation = (newparent) ? newparent + this.hdelimiter + newname : newname;
|
||||
this.remove_mbox_from_tree($link.parent("li"));
|
||||
this.add_mailbox_to_tree(newparent, newname);
|
||||
if (this.navobject.getparam("action") == "listmailbox") {
|
||||
|
||||
@@ -20,7 +20,8 @@ $(document).ready(function() {
|
||||
deflocation: "{{ deflocation }}",
|
||||
defcallback: "{{ defcallback }}",
|
||||
ro_mboxes: {% tolist ro_mboxes %},
|
||||
trash: "{{ trash }}"
|
||||
trash: "{{ trash }}",
|
||||
hdelimiter: '{{ hdelimiter }}'
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -504,6 +504,7 @@ def index(request):
|
||||
if not request.is_ajax():
|
||||
request.session["lastaction"] = None
|
||||
imapc = get_imapconnector(request)
|
||||
response["hdelimiter"] = imapc.hdelimiter
|
||||
response["mboxes"] = render_mboxes_list(request, imapc)
|
||||
imapc.getquota(curmbox)
|
||||
response["refreshrate"] = \
|
||||
|
||||
Reference in New Issue
Block a user