From 44088c72846d387468da67d18c8b49e6914fec14 Mon Sep 17 00:00:00 2001 From: tonio Date: Thu, 28 Jan 2010 17:33:47 +0100 Subject: [PATCH] "Reply" functionality. Not fully working. --- extensions/webmail/main.py | 78 ++++++++++++------- extensions/webmail/templates/compose.html | 4 +- extensions/webmail/templates/index.html | 21 +++-- extensions/webmail/templatetags/webextras.py | 16 +++- extensions/webmail/urls.py | 1 + static/pics/reply-all.png | Bin 0 -> 868 bytes static/pics/reply.png | Bin 0 -> 693 bytes 7 files changed, 85 insertions(+), 35 deletions(-) create mode 100644 static/pics/reply-all.png create mode 100644 static/pics/reply.png diff --git a/extensions/webmail/main.py b/extensions/webmail/main.py index 228ffb6c2..00cdb3ebb 100644 --- a/extensions/webmail/main.py +++ b/extensions/webmail/main.py @@ -9,8 +9,8 @@ from django.core.urlresolvers import reverse from django.conf.urls.defaults import include from django.contrib.auth.decorators import login_required from mailng.admin.models import Mailbox -from mailng.lib import events, parameters -from mailng.lib import _render +from mailng.lib import events, parameters, _render +from mailng.lib.email_listing import Email from imap_listing import * from forms import * from templatetags.webextras import * @@ -39,8 +39,8 @@ def menu(**kwargs): def userlogin(**kwargs): kwargs["request"].session["password"] = kwargs["password"] -def getctx(status, **kwargs): - callername = sys._getframe(1).f_code.co_name +def getctx(status, level=1, **kwargs): + callername = sys._getframe(level).f_code.co_name ctx = {"status" : status, "callback" : callername} for kw, v in kwargs.iteritems(): ctx[kw] = v @@ -104,6 +104,32 @@ def getmailcontent(request, folder, mail_id): email = Email(msg, mode="html", links="1") return email.render(request) +@login_required +def move(request): + for arg in ["msgset", "to"]: + if not request.GET.has_key(arg): + return + folder, id = request.GET["msgset"].split("/") + mbc = IMAPconnector(request) + mbc.move(id, folder, request.GET["to"]) + return HttpResponse(simplejson.dumps({"status" : "ok"}), + mimetype="application/json") + +@login_required +def empty(request, name): + mbc = IMAPconnector(request) + mbc.empty(name) + return folder(request, name, False) + +def render_compose(request, form, bodyheader=None, body=None): + menu = compose_menu("", request.session["folder"], request.session["page"], + request.user.get_all_permissions()) + content = render_to_string("webmail/compose.html", { + "form" : form, "bodyheader" : bodyheader, "body" : body + }) + ctx = getctx("ok", level=2, menu=menu, listing=content) + return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") + @login_required def compose(request): if request.method == "POST": @@ -124,27 +150,27 @@ def compose(request): form = ComposeMailForm() form.fields["from_"].initial = request.user.username - menu = compose_menu("", request.session["folder"], request.session["page"], - request.user.get_all_permissions()) - content = render_to_string("webmail/compose.html", { - "form" : form - }) - ctx = getctx("ok", menu=menu, listing=content) - return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") + return render_compose(request, form) @login_required -def move(request): - for arg in ["msgset", "to"]: - if not request.GET.has_key(arg): - return - folder, id = request.GET["msgset"].split("/") - mbc = IMAPconnector(request) - mbc.move(id, folder, request.GET["to"]) - return HttpResponse(simplejson.dumps({"status" : "ok"}), - mimetype="application/json") - -@login_required -def empty(request, name): - mbc = IMAPconnector(request) - mbc.empty(name) - return folder(request, name, False) +def reply(request, folder, mail_id): + if request.method == "POST": + return + msg = fetchmail(request, folder, mail_id, True) + email = Email(msg) + lines = email.body.split('\n') + body = "" + for l in lines: + if body != "": + body += "\n" + body += ">%s" % l + form = ComposeMailForm() + form.fields["from_"].initial = request.user.username + form.fields["to"].initial = msg["From"] + m = re.match("re\s*:\s*.+", msg["Subject"].lower()) + if m: + form.fields["subject"].initial = msg["Subject"] + else: + form.fields["subject"].initial = "Re: %s" % msg["Subject"] + textheader = msg["From"] + " " + _("wrote:") + return render_compose(request, form, textheader, body) diff --git a/extensions/webmail/templates/compose.html b/extensions/webmail/templates/compose.html index 86450e4da..ef6a5e458 100644 --- a/extensions/webmail/templates/compose.html +++ b/extensions/webmail/templates/compose.html @@ -43,6 +43,8 @@
{% include "common/genericform.html" %}
- + diff --git a/extensions/webmail/templates/index.html b/extensions/webmail/templates/index.html index cadaf1d63..6e58764a5 100644 --- a/extensions/webmail/templates/index.html +++ b/extensions/webmail/templates/index.html @@ -106,14 +106,11 @@ tr { register_callback("viewmail", function(resp) { updatelisting(resp, "hidden"); $$("a[name=back]").addEvent("click", loadFolder); + $$("a[name=reply]").addEvent("click", reply); setDivHeight("mailcontent", $("table-container").getSize().y, 0); }); - loadCompose = function(event) { - event.stop(); - location.hash = "compose/"; - } - register_callback("compose", function(resp) { + compose_callback = function(resp) { updatelisting(resp, "hidden"); $$("a[name=back]").addEvent("click", loadFolder); $$("a[name=sendmail]").addEvent("click", function(evt) { @@ -127,7 +124,19 @@ tr { $("composemail").send(); }); setDivHeight("id_body", $("mailheader").getSize().y + 20, 0); - }); + } + + loadCompose = function(event) { + event.stop(); + location.hash = "compose/"; + } + register_callback("compose", compose_callback); + + reply = function(event) { + event.stop(); + location.hash += event.target.get("href"); + } + register_callback("reply", compose_callback); loadFolder = function(event, obj) { if (!$defined(obj)) { diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py index c53b279db..5d2d2578b 100644 --- a/extensions/webmail/templatetags/webextras.py +++ b/extensions/webmail/templatetags/webextras.py @@ -13,7 +13,19 @@ def viewm_menu(selection, folder, mail_id, page_id, perms): {"name" : "back", "url" : folder + "?page=%s" % page_id + "&menu=1", "img" : "/static/pics/back.png", - "label" : _("Back to list")}, + "label" : _("Back")}, + {"name" : "reply", + "url" : "reply/", + "img" : "/static/pics/reply.png", + "label" : _("Reply")}, + {"name" : "reply-all", + "url" : "", + "img" : "/static/pics/reply-all.png", + "label" : _("Reply all")}, + {"name" : "forward", + "url" : "", + "img" : "/static/pics/alias.png", + "label" : _("Forward")}, ] return render_to_string('main/menu.html', @@ -26,7 +38,7 @@ def compose_menu(selection, folder, page_id, perms): {"name" : "back", "url" : folder + "?page=%s" % page_id + "&menu=1", "img" : "/static/pics/back.png", - "label" : _("Back to list")}, + "label" : _("Back")}, {"name" : "sendmail", "url" : "", "img" : "/static/pics/send-receive.png", diff --git a/extensions/webmail/urls.py b/extensions/webmail/urls.py index 7c2988714..7ef16e31b 100644 --- a/extensions/webmail/urls.py +++ b/extensions/webmail/urls.py @@ -6,6 +6,7 @@ urlpatterns = patterns('mailng.extensions.webmail.main', (r'^move/$', "move"), (r'^empty/(?P.+)/', "empty"), (r'^(?P.+)/(?P[\w\-\+]+)/content/$', 'getmailcontent'), + (r'^(?P.+)/(?P[\w\-\+]+)/reply/$', 'reply'), (r'^(?P.+)/(?P[\w\-\+]+)/$', 'viewmail'), (r'^(?P.+)/$', "folder"), ) diff --git a/static/pics/reply-all.png b/static/pics/reply-all.png new file mode 100644 index 0000000000000000000000000000000000000000..2017b0af0be0209dd2670890fde48808e1b33b93 GIT binary patch literal 868 zcmV-q1DpJbP)ZIce>dw2REFiBOtZzt(kPD_Yc|Uf3zS7&?*SK)o2~P3H$H zQpYY7FNQJ(UW!l&V|t;Mrr87;EwkH@vNc%uQ7P?AL#Lj zJUkDt0dV}-(NDDY4=bfmN+Oj)D}}0`l>d39G)l=euGC@b0sj9`Xsy@PR%op;3=D#EN z#;0I6(y*hCdwri%zZ_v};R4DEQEPsP)usfyUj6KjKu-uPtHCgjlOjzrOmJ|lhoQj(0AyyjGqo7uxt^UUUt@gvN}s>4KZX~! zSy*b~$8?@#Ymt5ZF|NuOZ~u_sy|)HfDAd+|Uf0E|SNQ#pD_A+vi8xo_fu$_zxxI7_ zen9T~G~!%=udgQ<8a%+M$r)~x%Y*_pcF;hn8j;Nrl;>gQ;(es{yhD0!FI|UT=j6l! zx7eZ`@uqj}&yi#RLQ;1L~NJB$}@rg-V;>lr4Ye|tH1j|g%mC#CnVNfK<$DhB( u(C{TD&Yq|D@ovT^CT~w@i6@7F_x}Y_oVZhjtC5ia0000UTuL>Xl;KT0w}3p7GEL7SF^n-FX(tptm{(Al(fBT}n& zG9j%pn`yE|F)mzXQH^HV$0Q5`ZGn)tP19t2{4qxx8(9-r0i=`wR903|RUIZC8^^LNEXyJg2yh?}z_Kjv-haUHrY1^*rL6xFq*pY10i@#q zpp>GbqJm&B$ivYnPCgEhUiC=M3eKO+`J*qFajeE1Kx0puXDKeWXlrc&;LFkm zcLv4)$Y!%l&#&<+^#QT5zI6l-kN5B1GMkzy6t83?mj}k^@9hSl^VSn?4^MEe?F7op zkFcrlU%ydTSI?pHasWOptkKyQsUH^qRlHy3)AgqT1ie$72;)~@Cb0t*v-Xlb^?%kbbU*WZ#RJCy-TmlLg5zR b#rE892t`wcq{hbX00000NkvXXu0mjfX%#W& literal 0 HcmV?d00001