From 8b52b32a7ec8a499281fbf32f87be20994645037 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 19 Mar 2012 15:18:36 +0100 Subject: [PATCH] wip: Big webmail refactoring --- extensions/webmail/imaputils.py | 22 ++- extensions/webmail/static/js/webmail.js | 7 +- .../webmail/templates/webmail/index.html | 2 +- extensions/webmail/templatetags/webextras.py | 2 +- extensions/webmail/urls.py | 3 +- extensions/webmail/views.py | 172 ++---------------- 6 files changed, 38 insertions(+), 170 deletions(-) diff --git a/extensions/webmail/imaputils.py b/extensions/webmail/imaputils.py index e231ec01e..cec5e83ab 100644 --- a/extensions/webmail/imaputils.py +++ b/extensions/webmail/imaputils.py @@ -470,20 +470,20 @@ class IMAPconnector(object): raise WebmailError(data[0]) return True - def getquota(self, folder): + def getquota(self, mailbox): if not "QUOTA" in self.m.capabilities: self.quota_limit = self.quota_actual = None return - status, data = self.m.getquotaroot(self._encodefolder(folder)) - if status == "OK": - quotadef = data[1][0] - m = re.match("[^\s]+ \(STORAGE (\d+) (\d+)\)", quotadef) - if not m: - print "Problem while parsing quota def" - return - self.quota_limit = int(m.group(2)) - self.quota_actual = int(m.group(1)) + data = self._cmd("GETQUOTAROOT", self._encodefolder(mailbox)) + print data + quotadef = data[1][0] + m = re.match("[^\s]+ \(STORAGE (\d+) (\d+)\)", quotadef) + if not m: + print "Problem while parsing quota def" + return + self.quota_limit = int(m.group(2)) + self.quota_actual = int(m.group(1)) def fetchpart(self, uid, mbox, partnum): self.select_mailbox(mbox, False) @@ -517,6 +517,8 @@ class IMAPconnector(object): msg['class'] = 'unseen' if r'\Answered' in data[int(uid)]['FLAGS']: msg['img_flags'] = static_url('pics/answered.png') + if r'$Forwarded' in data[int(uid)]['FLAGS']: + msg['img_flags'] = static_url('pics/forwarded.png') bs = BodyStructure(data[int(uid)]['BODYSTRUCTURE']) if bs.has_attachments(): msg['img_withatts'] = static_url('pics/attachment.png') diff --git a/extensions/webmail/static/js/webmail.js b/extensions/webmail/static/js/webmail.js index 5f57c1073..6ec536852 100644 --- a/extensions/webmail/static/js/webmail.js +++ b/extensions/webmail/static/js/webmail.js @@ -23,6 +23,7 @@ var Webmail = new Class({ this.init_folders_buttons(); this.init_folders_browsing(); + this.init_quota_bar(); /* FIXME: à faire uniquement pour le mode pushState */ /*this.init_emails_table();*/ @@ -35,6 +36,7 @@ var Webmail = new Class({ current_anchor.register_callback("reply", this.compose_callback.bind(this)); current_anchor.register_callback("replyall", this.compose_callback.bind(this)); current_anchor.register_callback("forward", this.compose_callback.bind(this)); + current_anchor.register_callback("delete", this.delete_callback); this.gspinner = new Spinner("document.body", { message: gettext("Loading, please wait..."), @@ -478,7 +480,9 @@ var Webmail = new Class({ $$("a[name=delete]").addEvent("click", function(event) { var lnk = event.target; event.stop(); - this.simple_request(lnk.get("href")); + this.simple_request(lnk.get("href"), undefined, function(resp) { + history.go(-1); + }); }.bind(this)); $$("a[name=activate_links]").addEvent("click", function(evt) { evt.stop(); @@ -620,7 +624,6 @@ var Webmail = new Class({ profile: "gray", spinner: true }); - params["json"] = "1"; new Request.JSON({ url : url, onSuccess : function(response) { diff --git a/extensions/webmail/templates/webmail/index.html b/extensions/webmail/templates/webmail/index.html index 5931fc72b..3f1208fc6 100644 --- a/extensions/webmail/templates/webmail/index.html +++ b/extensions/webmail/templates/webmail/index.html @@ -225,6 +225,6 @@ function wm_updatelisting(resp) { {% block menu %}{{ menu }}{% endblock %} {% block footer %}
{% trans "Mailbox quota" %}
-
+
{{ quota }}
{{ block.super }} {% endblock %} diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py index 0a27bdbf6..43a03a12a 100644 --- a/extensions/webmail/templatetags/webextras.py +++ b/extensions/webmail/templatetags/webextras.py @@ -31,7 +31,7 @@ def viewmail_menu(selection, folder, user, mail_id=None): "label" : _("Forward")}, {"name" : "delete", "img" : static_url("pics/remove.png"), - "url" : "action=delete&mbox=%s&mailid=%s" % (folder, mail_id), + "url" : reverse(webmail.views.delete) + "?mbox=%s&mailid=%s" % (folder, mail_id), "label" : _("Delete")}, {"name" : "display_options", "label" : _("Display options"), diff --git a/extensions/webmail/urls.py b/extensions/webmail/urls.py index 17a146d4d..64a27c006 100644 --- a/extensions/webmail/urls.py +++ b/extensions/webmail/urls.py @@ -13,6 +13,7 @@ urlpatterns = patterns( (r'^getmailcontent', 'getmailcontent'), # (r'^compose/$', "compose"), + (r'^delete/$', 'delete'), (r'^move/$', "move"), (r'^mark/(?P.+)/$', "mark"), (r'^empty/(?P.+)/$', "empty"), @@ -25,7 +26,7 @@ urlpatterns = patterns( (r'^delattachment/$', 'delattachment'), (r'^(?P.+)/(?P[\w\-\+]+)/part/$', 'getattachment'), - (r'^(?P.+)/(?P[\w\-\+]+)/delete/$', 'delete'), + #(r'^(?P.+)/(?P[\w\-\+]+)/delete/$', 'delete'), #(r'^(?P.+)/(?P[\w\-\+]+)/content/$', 'getmailcontent'), (r'^(?P.+)/(?P[\w\-\+]+)/forward/$', 'forward'), # (r'^(?P.+)/(?P[\w\-\+]+)/reply/$', 'reply'), diff --git a/extensions/webmail/views.py b/extensions/webmail/views.py index ee551b267..604d1dac0 100644 --- a/extensions/webmail/views.py +++ b/extensions/webmail/views.py @@ -123,60 +123,6 @@ def index(request): return _render_error(request, user_context={"error" : exp}) return lst.render(request) -def fetchmail(request, mbox, mailid, all=False): - imapc = get_imapconnector(request) - res = imapc.fetchmail(mbox, mailid) - - return res - # res = IMAPconnector(user=request.user.username, - # password=request.session["password"]).fetch(start=mail_id, - # folder=folder, - # all=all) - # if len(res): - # return res[0] - # return None - -# @login_required -# @is_not_localadmin() -# def viewmail(request, folder, mail_id=None): -# from templatetags.webextras import viewm_menu - -# if request.GET.has_key("links"): -# links = int(request.GET["links"]) -# else: -# links = parameters.get_user(request.user, "ENABLE_LINKS") == "yes" and 1 or 0 -# url = reverse(getmailcontent, args=[folder, mail_id]) + ("?links=%d" % links) -# content = Template(""" -# -# """).render(Context({"url" : url})) -# menu = viewm_menu("", get_current_url(request), folder, mail_id, -# request.user.get_all_permissions()) -# mbc = IMAPconnector(user=request.user.username, -# password=request.session["password"]) -# ctx = getctx("ok", **__render_common_components(request, folder, -# menu=menu, content=content)) -# return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") - - -@login_required -@needs_mailbox() -def viewmail(request, folder, mail_id=None): - from templatetags.webextras import viewm_menu - - #content = fetchmail(request, mbox, mailid, True) - - # if "class" in msg.keys() and msg["class"] == "unseen": - # IMAPconnector(user=request.user.username, - # password=request.session["password"]).msg_read(folder, mail_id) - - email = ImapEmail(mbox, mailid, request, links=request.GET["links"]) - return _render(request, "common/viewmail.html", { - "headers" : email.render_headers(folder=mbox, mail_id=mailid), - "folder" : mbox, "imapid" : mailid, "mailbody" : email.body - }) - - - @login_required @needs_mailbox() def getattachment(request, folder, mail_id): @@ -226,12 +172,15 @@ def move(request): @login_required @needs_mailbox() -def delete(request, fdname, mail_id): - mbc = IMAPconnector(user=request.user.username, - password=request.session["password"]) - mbc.move(mail_id, fdname, parameters.get_user(request.user, "TRASH_FOLDER")) - ctx = getctx("ok", next=get_current_url(request)) - return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") +def delete(request): + mbox = request.GET.get("mbox", None) + mailid = request.GET.get("mailid", None) + if mbox is None or mailid is None: + raise WebmailError(_("Invalid request")) + mbc = get_imapconnector(request) + mbc.move(mailid, mbox, parameters.get_user(request.user, "TRASH_FOLDER")) + resp = dict(status="ok") + return ajax_simple_response(resp) @login_required @needs_mailbox() @@ -265,98 +214,6 @@ def compact(request, name): imapc.compact(name) return ajax_simple_response(dict(status="ok")) -# def render_compose(request, form, posturl, email=None, insert_signature=False): -# menu = compose_menu("", get_current_url(request), -# request.user.get_all_permissions()) -# editor = parameters.get_user(request.user, "EDITOR") -# if email is None: -# body = "" -# textheader = "" -# else: -# body = email.body -# textheader = email.textheader -# if insert_signature: -# signature = EmailSignature(request.user) -# body += str(signature) -# randid = None -# if not request.GET.has_key("id"): -# if request.session.has_key("compose_mail"): -# clean_attachments(request.session["compose_mail"]["attachments"]) -# randid = set_compose_session(request) -# elif not request.session.has_key("compose_mail") \ -# or request.session["compose_mail"]["id"] != request.GET["id"]: -# randid = set_compose_session(request) - -# attachments = request.session["compose_mail"]["attachments"] -# if len(attachments): -# short_att_list = "(%s)" \ -# % ", ".join(map(lambda att: att["fname"], -# attachments[:2] + [{"fname" : "..."}] \ -# if len(attachments) > 2 else attachments)) -# else: -# short_att_list = "" -# content = _render_to_string(request, "webmail/compose.html", { -# "form" : form, "bodyheader" : textheader, -# "body" : body, "posturl" : posturl, -# "attachments" : attachments, "short_att_list" : short_att_list -# }) -# mbc = IMAPconnector(user=request.user.username, -# password=request.session["password"]) -# ctx = getctx("ok", level=2, editor=editor, -# **__render_common_components(request, request.session["folder"], -# menu=menu, content=content)) -# if randid is not None: -# ctx["id"] = randid -# return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") - -# @login_required -# @is_not_localadmin() -# def compose(request): -# if request.method == "POST": -# status, resp = send_mail(request, posturl=reverse(compose)) -# return resp - -# form = ComposeMailForm() -# form.fields["from_"].initial = request.user.username -# return render_compose(request, form, reverse(compose), insert_signature=True) - -# @login_required -# @needs_mailbox() -# def reply(request, folder, mail_id): -# msg = fetchmail(request, folder, mail_id, True) -# if request.method == "POST": -# status, resp = send_mail(request, origmsg=msg, -# posturl=reverse(reply, args=[folder, mail_id])) -# if status: -# IMAPconnector(user=request.user.username, -# password=request.session["password"]).msg_answered(folder, -# mail_id) -# return resp - -# form = ComposeMailForm() -# email = ReplyModifier(msg, request.user, form, request.GET.has_key("all"), -# addrfull=True, links="1") -# return render_compose(request, form, reverse(reply, args=[folder, mail_id]), -# email) - -# @login_required -# @needs_mailbox() -# def forward(request, folder, mail_id): -# if request.method == "POST": -# status, response = send_mail(request, -# posturl=reverse(forward, args=[folder, mail_id])) -# if status: -# IMAPconnector(user=request.user.username, -# password=request.session["password"]).msgforwarded(folder, -# mail_id) -# return response - -# msg = fetchmail(request, folder, mail_id, True) -# form = ComposeMailForm() -# email = ForwardModifier(msg, request.user, form, addrfull=True, links="1") -# return render_compose(request, form, reverse(forward, args=[folder, mail_id]), -# email) - def separate_folder(fullname, sep="."): """Split a folder name @@ -641,7 +498,7 @@ def forward(request): def msg_forwarded(mbox, mailid): get_imapconnector(request).msg_forwarded(mbox, mailid) - return compose_and_send(request, "reply", msg_forwarded) + return compose_and_send(request, "forward", msg_forwarded) @login_required @needs_mailbox() @@ -650,7 +507,7 @@ def getmailcontent(request): mailid = request.GET.get("mailid", None) if mbox is None or mailid is None: raise WebmailError(_("Invalid request")) - email = ImapEmail(mbox, mailid, request, links=request.GET["links"]) + email = ImapEmail(mbox, mailid, request, links=int(request.GET["links"])) return _render(request, "common/viewmail.html", { "headers" : email.render_headers(folder=mbox, mail_id=mailid), "folder" : mbox, "imapid" : mailid, "mailbody" : email.body @@ -660,8 +517,12 @@ def viewmail(request): mailid = request.GET.get("mailid", None) if mailid is None: raise WebmailError(_("Invalid request")) + links = request.GET.get("links", None) + if links is None: + links = 1 if parameters.get_user(request.user, "ENABLE_LINKS") == "yes" else 0 + else: + links = int(links) - links = 1 url = reverse(getmailcontent) + "?mbox=%s&mailid=%s&links=%d" % \ (request.session["mbox"], mailid, links) content = Template(""" @@ -720,6 +581,7 @@ def newindex(request): response["refreshrate"] = \ int(parameters.get_user(request.user, "REFRESH_INTERVAL")) * 1000 response["mboxes"] = render_mboxes_list(request, imapc) + response["quota"] = ImapListing.computequota(imapc) return _render(request, "webmail/index.html", response) if action in ["reply", "forward"]: