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 000000000..2017b0af0 Binary files /dev/null and b/static/pics/reply-all.png differ diff --git a/static/pics/reply.png b/static/pics/reply.png new file mode 100644 index 000000000..a61974159 Binary files /dev/null and b/static/pics/reply.png differ