diff --git a/extensions/webmail/forms.py b/extensions/webmail/forms.py index 21c2bd86f..a57423774 100644 --- a/extensions/webmail/forms.py +++ b/extensions/webmail/forms.py @@ -4,5 +4,6 @@ from django.utils.translation import ugettext as _ class ComposeMailForm(forms.Form): from_ = forms.CharField(label=_("From")) to = forms.CharField(label=_("To"), widget=forms.Textarea()) + cc = forms.CharField(label=_("Cc"), widget=forms.Textarea()) subject = forms.CharField(label=_("Subject"), max_length=255) diff --git a/extensions/webmail/imap_listing.py b/extensions/webmail/imap_listing.py index 8656cda15..92c84d1d4 100644 --- a/extensions/webmail/imap_listing.py +++ b/extensions/webmail/imap_listing.py @@ -9,7 +9,7 @@ from email.header import decode_header import email.utils from django.utils.translation import ugettext as _ from mailng.lib import decode, tables, imap_utf7, Singleton -from mailng.lib.email_listing import MBconnector, EmailListing +from mailng.lib.email_listing import MBconnector, EmailListing, Email from mailng.lib import tables, imap_utf7, parameters @@ -17,7 +17,8 @@ class WMtable(tables.Table): tableid = "emails" idkey = "imapid" # selection = tables.SelectionColumn("selection", width="20px", first=True) - _1_flags = tables.ImgColumn("flags", width="6%") + _1_flags = tables.ImgColumn("flags", width="4%", + header="") _2_subject = tables.Column("subject", label=_("Subject"), cssclass="draggable", width="50%") _3_from_ = tables.Column("from", width="20%", label=_("From")) @@ -226,3 +227,19 @@ class ImapListing(EmailListing): for fd in folders: md_folders += [{"name" : fd}] return md_folders + +class ImapEmail(Email): + def __init__(self, msg, **kwargs): + Email.__init__(self, msg, **kwargs) + + fields = ["Subject", "From", "To", "Cc", "Date"] + for f in fields: + label = f + if not f in msg.keys(): + f = f.upper() + if not f in msg.keys(): + continue + try: + self.headers += [{"name" : label, "value" : getattr(IMAPheader, "parse_%s" % f.lower())(msg[f])}] + except AttributeError: + self.headers += [{"name" : label, "value" : msg[f]}] diff --git a/extensions/webmail/main.py b/extensions/webmail/main.py index 2f5a3c058..69bf4d0db 100644 --- a/extensions/webmail/main.py +++ b/extensions/webmail/main.py @@ -2,6 +2,7 @@ import time import sys from django.http import HttpResponse +from django.template import Template, Context from django.template.loader import render_to_string from django.utils import simplejson from django.utils.translation import ugettext as _ @@ -10,10 +11,10 @@ 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, _render, _render_error -from mailng.lib.email_listing import Email from imap_listing import * from forms import * from templatetags.webextras import * +from imap_listing import ImapEmail def init(): events.register("UserMenuDisplay", menu) @@ -65,6 +66,9 @@ def folder(request, name, updatenav=True): request.session["page"] = pageid if order: request.session["navparams"]["order"] = order + else: + # Internal usage + order = request.session["navparams"]["order"] lst = ImapListing(request.user.username, request.session["password"], name, folder=name, order=order) @@ -98,42 +102,45 @@ def fetchmail(request, folder, mail_id, all=False): @login_required def viewmail(request, folder, mail_id=None): - header = fetchmail(request, folder, mail_id) - if header: - from templatetags.webextras import viewm_menu - try: - pageid = request.session["page"] - except KeyError: - pageid = "1" - menu = viewm_menu("", request.session, mail_id, - request.user.get_all_permissions()) - folder, imapid = header["imapid"].split("/") - mailcontent = render_to_string("webmail/viewmail.html", { - "header" : header, "folder" : folder, "imapid" : imapid - }) - ctx = getctx("ok", menu=menu, listing=mailcontent) - return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") + from templatetags.webextras import viewm_menu + + content = Template(""" + +""").render(Context({"url" : reverse(getmailcontent, args=[folder, mail_id])})) + menu = viewm_menu("", request.session, mail_id, + request.user.get_all_permissions()) + ctx = getctx("ok", menu=menu, listing=content) + return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @login_required def getmailcontent(request, folder, mail_id): - from mailng.lib.email_listing import Email - - msg = fetchmail(request, folder, mail_id, True) - if "class" in msg.keys() and msg["class"] == "unseen": - IMAPconnector(request).msgseen(msg["imapid"]) - email = Email(msg, mode="html", links="1") - return email.render(request) + msg = fetchmail(request, folder, mail_id, True) + if "class" in msg.keys() and msg["class"] == "unseen": + IMAPconnector(request).msgseen(msg["imapid"]) + email = ImapEmail(msg, mode="html", links="1") + try: + pageid = request.session["page"] + except KeyError: + pageid = "1" + folder, imapid = msg["imapid"].split("/") + return _render(request, "webmail/viewmail.html", { + "headers" : email.render_headers(), "folder" : folder, + "imapid" : imapid, "mailbody" : email.body, "pre" : email.pre + }) @login_required def move(request): for arg in ["msgset", "to"]: if not request.GET.has_key(arg): return - folder, id = request.GET["msgset"].split("/") + msgset = [] + fdname = "" + for item in request.GET["msgset"].split(","): + fdname, id = item.split("/") + msgset += [id] mbc = IMAPconnector(request) - mbc.move(id, folder, request.GET["to"]) - return HttpResponse(simplejson.dumps({"status" : "ok"}), - mimetype="application/json") + mbc.move(",".join(msgset), fdname, request.GET["to"]) + return folder(request, fdname, False) @login_required def empty(request, name): @@ -176,7 +183,7 @@ def reply(request, folder, mail_id): if request.method == "POST": return msg = fetchmail(request, folder, mail_id, True) - email = Email(msg) + email = ImapEmail(msg) lines = email.body.split('\n') body = "" for l in lines: diff --git a/extensions/webmail/templates/compose.html b/extensions/webmail/templates/compose.html index ef6a5e458..01bb05acd 100644 --- a/extensions/webmail/templates/compose.html +++ b/extensions/webmail/templates/compose.html @@ -2,11 +2,11 @@ diff --git a/extensions/webmail/templates/headers.html b/extensions/webmail/templates/headers.html index 244d108df..4c06206cc 100644 --- a/extensions/webmail/templates/headers.html +++ b/extensions/webmail/templates/headers.html @@ -1,5 +1,5 @@ -
| {{ hdr.name }} | {{ hdr.value }} |
|---|---|
| {{ hdr.name }} | {{ hdr.value }} |
{% endif %}{{ mailbody }}{% if pre %}{% endif %}
+
+
diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py
index 826424f01..b371fa337 100644
--- a/extensions/webmail/templatetags/webextras.py
+++ b/extensions/webmail/templatetags/webextras.py
@@ -70,7 +70,7 @@ def listing_menu(selection, folder, perms):
{"name" : "compose",
"url" : reverse(webmail.main.compose),
"img" : "/static/pics/edit.png",
- "label" : _("New message")}
+ "label" : _("New message")},
]
if folder in ["Trash"]:
entries += [
@@ -83,19 +83,3 @@ def listing_menu(selection, folder, perms):
return render_to_string("main/menu.html",
{"selection" : selection, "entries" : entries,
"perms" : perms})
-
-@register.simple_tag
-def render_headers(headers):
- fields = ["Subject", "From", "To", "Cc", "Date"]
- result = []
- for f in fields:
- if not f in headers.keys():
- continue
- try:
- result += [{"name" : f, "value" : getattr(IMAPheader, "parse_%s" % f.lower())(headers[f])}]
- except AttributeError:
- result += [{"name" : f, "value" : headers[f]}]
- return render_to_string("webmail/headers.html", {
- "headers" : result
- })
-
diff --git a/lib/email_listing.py b/lib/email_listing.py
index c6c827fab..c879d1371 100644
--- a/lib/email_listing.py
+++ b/lib/email_listing.py
@@ -3,6 +3,7 @@ import time
import re
import lxml
import lxml.html
+from lxml import etree
from django.template.loader import render_to_string
from django.template import Template, Context
from mailng.lib import _render, decode
@@ -124,6 +125,7 @@ class Email(object):
def __init__(self, msg, mode="plain", links="0"):
self.attached_map = {}
contents = {"html" : "", "plain" : ""}
+ self.headers = []
for part in msg.walk():
if part.get_content_maintype() == 'multipart':
continue
@@ -166,6 +168,11 @@ class Email(object):
return map[m.group(1)]
return url
+ def render_headers(self):
+ return render_to_string("webmail/headers.html", {
+ "headers" : self.headers
+ })
+
def render(self, request):
return _render(request, 'common/getmailcontent.html', {
"body" : self.body, "pre" : self.pre
@@ -182,6 +189,11 @@ class Email(object):
html.rewrite_links(lambda x: None)
else:
html.rewrite_links(self.map_cid)
- body = lxml.html.tostring(html)
+ body = html.find("body")
+ if not body:
+ body = lxml.html.tostring(html)
+ else:
+ body = lxml.html.tostring(body)
+ body = re.sub("<(/?)body", lambda m: "<%sdiv" % m.group(1), body)
body = Template(decode(body)).render({})
return (False, body)
diff --git a/lib/tables.py b/lib/tables.py
index 938df9cad..3a3e07f33 100644
--- a/lib/tables.py
+++ b/lib/tables.py
@@ -5,6 +5,8 @@ from django.template import Template, Context
from django.template.loader import render_to_string
class Column:
+ sortable = True
+
def __init__(self, name, **kwargs):
self.name = name
for k, v in kwargs.iteritems():
@@ -26,8 +28,13 @@ class SelectionColumn(Column):
% (self.name, value)
class ImgColumn(Column):
+ sortable = False
+
def __str__(self):
- return ""
+ try:
+ return getattr(self, "header")
+ except AttributeError:
+ return ""
def render(self, value):
return "
{% trans "Domains" %}
{% trans "Domains" %}
+
+
{% trans "Settings" %}
-