diff --git a/extensions/webmail/imap_listing.py b/extensions/webmail/imap_listing.py index 4f16e3ea0..cc1cea565 100644 --- a/extensions/webmail/imap_listing.py +++ b/extensions/webmail/imap_listing.py @@ -212,9 +212,13 @@ class IMAPconnector(object): result[name] = None return result - def msgseen(self, imapid): - folder, id = imapid.split("/") - self.m.store(id, "+FLAGS", "\\Seen") + def msg_unread(self, folder, msgset): + self.m.select(self._encodefolder(folder), True) + self.m.store(msgset, "-FLAGS", "\\Seen") + + def msg_read(self, folder, msgset): + self.m.select(self._encodefolder(folder), True) + self.m.store(msgset, "+FLAGS", "\\Seen") def msgforwarded(self, folder, imapid): self.m.select(self._encodefolder(folder), True) diff --git a/extensions/webmail/main.py b/extensions/webmail/main.py index 2e537c56f..1da4e8db6 100644 --- a/extensions/webmail/main.py +++ b/extensions/webmail/main.py @@ -129,7 +129,7 @@ def viewmail(request, folder, mail_id=None): def getmailcontent(request, folder, mail_id): msg = fetchmail(request, folder, mail_id, True) if "class" in msg.keys() and msg["class"] == "unseen": - IMAPconnector(request).msgseen(msg["imapid"]) + IMAPconnector(request).msg_read(*msg["imapid"].split("/")) email = ImapEmail(msg, mode="html", links="1") try: pageid = request.session["page"] @@ -182,6 +182,21 @@ def delete(request, fdname, mail_id): mbc.move(mail_id, fdname, "Trash") return folder(request, fdname, False) +@login_required +def mark(request, name): + if not request.GET.has_key("status") or not request.GET.has_key("ids"): + return + mbc = IMAPconnector(request) + ids = request.GET["ids"].split(',') + msgset = [] + for id in ids: + msgset.append(id.split("/")[1]) + try: + getattr(mbc, "msg_%s" % request.GET["status"])(name, ",".join(msgset)) + except AttributeError: + pass + return folder(request, name, False) + @login_required def empty(request, name): mbc = IMAPconnector(request) diff --git a/extensions/webmail/templates/index.html b/extensions/webmail/templates/index.html index 29bc90f4e..cdfe872aa 100644 --- a/extensions/webmail/templates/index.html +++ b/extensions/webmail/templates/index.html @@ -259,6 +259,22 @@ ul.visible { } }); + buildmarkrequest = function(evt) { + evt.stop(); + if (!selectedRows.length) { + return; + } + var ids = new Array(); + selectedRows.each(function(item, index) { + ids.include(item.get("id")); + }); + current_anchor.parse_string(evt.target.get("href"), true); + current_anchor.updateparams("ids=" + ids.join()); + current_anchor.update(); + } + $$("a[name=mark-read]").addEvent("click", buildmarkrequest); + $$("a[name=mark-unread]").addEvent("click", buildmarkrequest); + $$("tr").each(function(item) { new Drag.Move(item, { droppables: ".droppable", diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py index 4ee9340df..2193cb17f 100644 --- a/extensions/webmail/templatetags/webextras.py +++ b/extensions/webmail/templatetags/webextras.py @@ -65,9 +65,11 @@ def listing_menu(selection, folder, perms): "class" : "menubardropdown", "menu" : [ {"name" : "mark-read", - "label" : _("As read")}, + "label" : _("As read"), + "url" : reverse(webmail.main.mark, args=[folder]) + "?status=read"}, {"name" : "mark-unread", - "label" : _("As unread")} + "label" : _("As unread"), + "url" : reverse(webmail.main.mark, args=[folder]) + "?status=unread"} ] } ] diff --git a/extensions/webmail/urls.py b/extensions/webmail/urls.py index 7bab03060..ec679a88d 100644 --- a/extensions/webmail/urls.py +++ b/extensions/webmail/urls.py @@ -4,7 +4,8 @@ urlpatterns = patterns('mailng.extensions.webmail.main', (r'^$', "index"), (r'^compose/$', "compose"), (r'^move/$', "move"), - (r'^empty/(?P.+)/', "empty"), + (r'^mark/(?P.+)/$', "mark"), + (r'^empty/(?P.+)/$', "empty"), (r'^(?P.+)/(?P[\w\-\+]+)/part/$', 'getattachment'), (r'^(?P.+)/(?P[\w\-\+]+)/delete/$', 'delete'), (r'^(?P.+)/(?P[\w\-\+]+)/content/$', 'getmailcontent'),