imports optimization

This commit is contained in:
Jean-Philippe Caruana
2013-02-07 18:54:50 +01:00
parent cc3a82b8cd
commit abd31aa908
7 changed files with 72 additions and 78 deletions
+9 -10
View File
@@ -2,7 +2,6 @@
from django.utils.translation import ugettext as _, ugettext_lazy
from django.core.urlresolvers import reverse
from modoboa.lib import events, parameters
from modoboa.lib.webutils import static_url
from modoboa.extensions import ModoExtension, exts_pool
class Webmail(ModoExtension):
@@ -11,23 +10,23 @@ class Webmail(ModoExtension):
version = "1.0"
description = ugettext_lazy("Simple IMAP webmail")
needs_media = True
def load(self):
parameters.register_app(uparams_opts=dict(needs_mailbox=True))
parameters.register_admin("IMAP_SERVER", type="string",
parameters.register_admin("IMAP_SERVER", type="string",
deflt="127.0.0.1",
help=ugettext_lazy("Address of your IMAP server"))
parameters.register_admin("IMAP_SECURED", type="list_yesno",
parameters.register_admin("IMAP_SECURED", type="list_yesno",
deflt="no",
help=ugettext_lazy("Use a secured connection to access IMAP server"))
parameters.register_admin("IMAP_PORT", type="int", deflt="143",
help=ugettext_lazy("Listening port of your IMAP server"))
parameters.register_admin("SMTP_SERVER", type="string",
parameters.register_admin("SMTP_SERVER", type="string",
deflt="127.0.0.1",
help=ugettext_lazy("Address of your SMTP server"))
parameters.register_admin("SMTP_SECURED_MODE", type="list",
values=[("none", ugettext_lazy("None")),
parameters.register_admin("SMTP_SECURED_MODE", type="list",
values=[("none", ugettext_lazy("None")),
("starttls", "STARTTLS"),
("ssl", "SSL/TLS")],
deflt="none",
@@ -39,7 +38,7 @@ class Webmail(ModoExtension):
help=ugettext_lazy("Server needs authentication"))
parameters.register_admin("MAX_ATTACHMENT_SIZE", type="int", deflt=2048,
help=ugettext_lazy("Maximum attachment size in bytes (or KB, MB, GB if specified)"))
parameters.register_user("MESSAGES_PER_PAGE", type="int", deflt=40,
label=ugettext_lazy("Number of displayed emails per page"),
help=ugettext_lazy("Sets the maximum number of messages displayed in a page"))
@@ -101,7 +100,7 @@ def userlogout(request):
password=request.session["password"])
except Exception, e:
return
# The following statement may fail under Python 2.6...
try:
m.logout()
+2 -1
View File
@@ -1,3 +1,4 @@
# coding: utf-8
from django import forms
from django.utils.translation import ugettext_lazy as _
@@ -9,7 +10,7 @@ class ComposeMailForm(forms.Form):
subject = forms.CharField(label=_("Subject"), max_length=255, required=False)
origmsgid = forms.CharField(label="", widget=forms.HiddenInput(), required=False)
class FolderForm(forms.Form):
oldname = forms.CharField(label="", widget=forms.HiddenInput(), required=False)
name = forms.CharField()
+27 -28
View File
@@ -1,31 +1,30 @@
# coding: utf-8
import sys, os
import re
import time
from datetime import datetime, timedelta
import email
import lxml
import chardet
from django.core.files.uploadhandler import FileUploadHandler, StopUpload, SkipFile
from django.http import HttpResponse
from django.core.files.uploadhandler import FileUploadHandler, SkipFile
from django.utils.translation import ugettext as _, ugettext_lazy
from django.conf import settings
from modoboa.lib import u2u_decode, tables, imap_utf7, parameters
from modoboa.lib.webutils import static_url, size2integer
from modoboa.lib.connections import ConnectionsManager
from modoboa.lib.email_listing import MBconnector, EmailListing
from modoboa.lib.emailutils import *
import os
import re
from modoboa.lib import u2u_decode, tables, parameters
from modoboa.lib.webutils import size2integer
from modoboa.lib.email_listing import EmailListing
from modoboa.lib.emailutils import *
from imaputils import *
from exceptions import *
class WMtable(tables.Table):
tableid = "emails"
styles = "table-condensed"
idkey = "imapid"
select = tables.ImgColumn(
"select", cssclass="draggable left", width="2%",
"select", cssclass="draggable left", width="2%",
defvalue="%spics/grippy.png" % settings.STATIC_URL,
header="<input type='checkbox' name='toggleselect' id='toggleselect' />"
)
@@ -112,7 +111,7 @@ class ImapListing(EmailListing):
deflocation = "INBOX/"
defcallback = "wm_updatelisting"
reset_wm_url = False
def __init__(self, user, password, **kwargs):
self.user = user
self.mbc = IMAPconnector(user=user.username, password=password)
@@ -165,7 +164,7 @@ class ImapEmail(Email):
('Subject', True),
]
def __init__(self, mbox, mailid, request, dformat="DISPLAYMODE", addrfull=False,
def __init__(self, mbox, mailid, request, dformat="DISPLAYMODE", addrfull=False,
links=0):
mformat = parameters.get_user(request.user, "DISPLAYMODE")
self.dformat = parameters.get_user(request.user, dformat)
@@ -179,7 +178,7 @@ class ImapEmail(Email):
self.mailid = mailid
headers = msg['BODY[HEADER.FIELDS (%s)]' % self.headers_as_text]
fallback_fmt = "html" if self.dformat == "plain" else "plain"
self.bs = BodyStructure(msg['BODYSTRUCTURE'])
data = None
@@ -206,7 +205,7 @@ class ImapEmail(Email):
getattr(self, "viewmail_%s" % mformat)(bodyc, links=links)
else:
self.body = None
self._find_attachments()
msg = email.message_from_string(headers)
@@ -257,7 +256,7 @@ class ImapEmail(Email):
att.has_key("disposition") and len(att["disposition"]) > 1:
params = att["disposition"][1]
key = "filename"
if key and params:
for pos, value in enumerate(params):
if value == key:
@@ -311,7 +310,7 @@ class Modifier(ImapEmail):
def _modify_html(self):
pass
class ReplyModifier(Modifier):
headernames = ImapEmail.headernames + \
[("Reply-To", True),
@@ -358,13 +357,13 @@ class ReplyModifier(Modifier):
body += "\n"
body += ">%s" % l
self.body = body
class ForwardModifier(Modifier):
def __init__(self, mbox, mailid, request, form, **kwargs):
super(ForwardModifier, self).__init__(
mbox, mailid, request, dformat="EDITOR", **kwargs
)
self._header()
form.fields["from_"].initial = request.user.username
form.fields["subject"].initial = "Fwd: %s" % self.Subject
@@ -488,7 +487,7 @@ def find_images_in_body(body):
% (ct, os.path.basename(fname)))
p["Content-Disposition"] = "inline"
parts.append(p)
return lxml.html.tostring(html), parts
def set_compose_session(request):
@@ -557,7 +556,7 @@ def html2plaintext(content):
if p is None:
continue
plaintext += p + "\n"
return plaintext
def get_current_url(request):
@@ -603,7 +602,7 @@ def send_mail(request, posturl=None):
"""
from email.mime.multipart import MIMEMultipart
from forms import ComposeMailForm
from modoboa.lib.webutils import getctx, ajax_simple_response, _render_to_string
from modoboa.lib.webutils import _render_to_string
from modoboa.auth.lib import get_password
form = ComposeMailForm(request.POST)
@@ -623,13 +622,13 @@ def send_mail(request, posturl=None):
submsg.attach(MIMEText(textbody.encode(charset),
_subtype="plain", _charset=charset))
body, images = find_images_in_body(body)
submsg.attach(MIMEText(body.encode(charset), _subtype=editormode,
submsg.attach(MIMEText(body.encode(charset), _subtype=editormode,
_charset=charset))
msg.attach(submsg)
for img in images:
msg.attach(img)
else:
text = MIMEText(body.encode(charset),
text = MIMEText(body.encode(charset),
_subtype=editormode, _charset=charset)
if len(request.session["compose_mail"]["attachments"]):
msg = MIMEMultipart()
@@ -686,7 +685,7 @@ def send_mail(request, posturl=None):
del request.session["compose_mail"]
return True, dict(url=get_current_url(request))
listing = _render_to_string(request, "webmail/compose.html",
listing = _render_to_string(request, "webmail/compose.html",
{"form" : form, "noerrors" : True,
"body" : request.POST["id_body"].strip(),
"posturl" : posturl})
@@ -698,19 +697,19 @@ class AttachmentUploadHandler(FileUploadHandler):
Simple upload handler to limit the size of the attachments users
can upload.
"""
def __init__(self, request=None):
super(AttachmentUploadHandler, self).__init__(request)
self.total_upload = 0
self.toobig = False
self.maxsize = size2integer(parameters.get_admin("MAX_ATTACHMENT_SIZE"))
def receive_data_chunk(self, raw_data, start):
self.total_upload += len(raw_data)
if self.total_upload >= self.maxsize:
self.toobig = True
raise SkipFile()
return raw_data
def file_complete(self, file_size):
return None
+1 -2
View File
@@ -1,5 +1,4 @@
# coding: utf-8
from modoboa.lib.webutils import ajax_response, _render_error
from modoboa.extensions.webmail.exceptions import *
@@ -10,6 +9,6 @@ class WebmailErrorMiddleware(object):
json = request.GET.get("json", False) if request.method == "GET" \
else request.POST.get("json", False)
if json:
return ajax_response(request, status="ko",
return ajax_response(request, status="ko",
respmsg=str(exception), norefresh=True)
return _render_error(request, user_context=dict(error=str(exception)))
@@ -5,15 +5,13 @@ from django.utils.translation import ugettext as _
from django.core.urlresolvers import reverse
from django.conf import settings
from modoboa.extensions import webmail
from modoboa.extensions.webmail.lib import IMAPheader
from modoboa.extensions.webmail.imaputils import separate_mailbox
from modoboa.lib import parameters
from modoboa.lib.webutils import static_url
register = template.Library()
@register.simple_tag
def viewmail_menu(selection, folder, user, mail_id=None):
def viewmail_menu(selection, folder, user, mail_id=None):
entries = [
{"name" : "reply",
"url" : "action=reply&mbox=%s&mailid=%s" % (folder, mail_id),
@@ -34,21 +32,21 @@ def viewmail_menu(selection, folder, user, mail_id=None):
{"name" : "display_options",
"label" : _("Display options"),
"menu" : [
{"name" : "activate_links",
{"name" : "activate_links",
"label" : _("Activate links")},
{"name" : "disable_links",
{"name" : "disable_links",
"label" : _("Disable links")}
]
}
]
menu = render_to_string('common/buttons_list.html',
{"selection" : selection, "entries" : entries,
menu = render_to_string('common/buttons_list.html',
{"selection" : selection, "entries" : entries,
"user" : user, "extraclasses" : "pull-left"})
entries = [{"name" : "close",
"title" : _("Close this message"),
"img" : "icon-remove"}]
menu += render_to_string('common/buttons_list.html',
menu += render_to_string('common/buttons_list.html',
{"entries" : entries, "extraclasses" : "pull-right"})
return menu
@@ -65,8 +63,8 @@ def compose_menu(selection, backurl, user):
"img" : "icon-envelope",
"label" : _("Send")},
]
return render_to_string('common/buttons_list.html',
{"selection" : selection, "entries" : entries,
return render_to_string('common/buttons_list.html',
{"selection" : selection, "entries" : entries,
"user" : user})
@register.simple_tag
@@ -136,7 +134,7 @@ def print_mailboxes(tree, selected=None, withunseen=False, selectonly=False):
ul_state = "hidden"
div_state = "collapsed"
result += "<div class='clickbox %s'></div>" % div_state
cssclass = "block"
extra_attrs = ""
if withunseen and mbox.has_key("unseen"):
@@ -148,7 +146,7 @@ def print_mailboxes(tree, selected=None, withunseen=False, selectonly=False):
<i class="%s"></i>
%s
</a>
""" % (mbox.has_key("path") and mbox["path"] or mbox["name"], cssclass,
""" % (mbox.has_key("path") and mbox["path"] or mbox["name"], cssclass,
'selectfolder' if selectonly else 'loadfolder', extra_attrs, iclass, label)
if mbox.has_key("sub") and len(mbox["sub"]):
result += "<ul name='%s' class='nav nav-list %s'>" % (mbox["path"], ul_state) \
+4 -3
View File
@@ -1,3 +1,4 @@
# coding: utf-8
from django.conf.urls.defaults import *
urlpatterns = patterns(
@@ -6,7 +7,7 @@ urlpatterns = patterns(
(r'^submailboxes', "submailboxes"),
(r'^getmailcontent', 'getmailcontent'),
(r'^unseenmsgs', 'check_unseen_messages'),
(r'^delete/$', 'delete'),
(r'^move/$', "move"),
(r'^mark/(?P<name>.+)/$', "mark"),
@@ -15,8 +16,8 @@ urlpatterns = patterns(
(r'^newfolder/$', "newfolder"),
(r'^editfolder/$', 'editfolder'),
(r'^delfolder/$', 'delfolder'),
(r'^attachments/$', 'attachments'),
(r'^delattachment/$', 'delattachment'),
(r'^getattachment/$', 'getattachment'),
)
)
+19 -22
View File
@@ -1,15 +1,12 @@
# coding: utf-8
from django.http import HttpResponse, Http404
from django.http import HttpResponse
from django.template import Template, Context
from django.utils.translation import ugettext as _
from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import login_required
from modoboa.lib import parameters
from modoboa.lib.webutils import _render, _render_error, \
getctx, _render_to_string, ajax_response, ajax_simple_response
from modoboa.lib.email_listing import parse_search_parameters
from modoboa.lib.webutils import _render, _render_to_string, ajax_response, ajax_simple_response
from modoboa.lib.decorators import needs_mailbox
from modoboa.auth.lib import *
from lib import *
from forms import *
from templatetags import webextras
@@ -18,7 +15,7 @@ from templatetags import webextras
@needs_mailbox()
def getattachment(request):
"""Fetch a message attachment
FIXME: par manque de caching, le bodystructure du message est
redemandé pour accéder aux headers de cette pièce jointe.
@@ -30,7 +27,7 @@ def getattachment(request):
pnum = request.GET.get("partnumber", None)
if not mbox or not mailid or not pnum:
raise WebmailError(_("Invalid request"))
headers = {"Content-Type" : "text/plain",
"Content-Transfer-Encoding" : None}
imapc = get_imapconnector(request)
@@ -51,7 +48,7 @@ def getattachment(request):
resp["Content-Disposition"] = cd
resp["Content-Length"] = partdef["size"]
return resp
@login_required
@needs_mailbox()
def move(request):
@@ -115,11 +112,11 @@ def compact(request, name):
@login_required
@needs_mailbox()
def newfolder(request, tplname="webmail/folder.html"):
mbc = IMAPconnector(user=request.user.username,
mbc = IMAPconnector(user=request.user.username,
password=request.session["password"])
ctx = {"title" : _("Create a new mailbox"),
"formid" : "mboxform",
"action" : reverse(newfolder),
"action" : reverse(newfolder),
"action_label" : _("Create"),
"action_classes" : "submit",
"withunseen" : False,
@@ -134,11 +131,11 @@ def newfolder(request, tplname="webmail/folder.html"):
return ajax_simple_response(dict(
status="ok", respmsg=_("Mailbox created"), newmb=form.cleaned_data["name"], parent=pf
))
ctx["form"] = form
ctx["selected"] = None
return ajax_response(request, status="ko", template=tplname, **ctx)
ctx["form"] = FolderForm()
ctx["selected"] = None
return _render(request, tplname, ctx)
@@ -146,7 +143,7 @@ def newfolder(request, tplname="webmail/folder.html"):
@login_required
@needs_mailbox()
def editfolder(request, tplname="webmail/folder.html"):
mbc = IMAPconnector(user=request.user.username,
mbc = IMAPconnector(user=request.user.username,
password=request.session["password"])
ctx = {"title" : _("Edit mailbox"),
"formid" : "mboxform",
@@ -197,7 +194,7 @@ def delfolder(request):
name = request.GET.get("name", None)
if name is None:
raise WebmailError(_("Bad request"))
mbc = IMAPconnector(user=request.user.username,
mbc = IMAPconnector(user=request.user.username,
password=request.session["password"])
mbc.delete_folder(name)
if request.session.has_key("mbox"):
@@ -217,7 +214,7 @@ def attachments(request, tplname="webmail/attachments.html"):
fobj = request.FILES["attachment"]
tmpname = save_attachment(fobj)
request.session["compose_mail"]["attachments"] \
+= [{"fname" : str(fobj),
+= [{"fname" : str(fobj),
"content-type" : fobj.content_type,
"size" : fobj.size,
"tmpname" : os.path.basename(tmpname)}]
@@ -287,7 +284,7 @@ def render_mboxes_list(request, imapc):
def set_nav_params(request):
if not request.session.has_key("navparams"):
request.session["navparams"] = {}
request.session["pageid"] = \
int(request.GET.get("page", 1))
if not request.GET.get("order", False):
@@ -320,7 +317,7 @@ def listmailbox(request, defmailbox="INBOX", update_session=True):
lst = ImapListing(request.user, request.session["password"],
baseurl="?action=listmailbox&mbox=%s&" % mbox,
folder=mbox,
folder=mbox,
elems_per_page=int(parameters.get_user(request.user, "MESSAGES_PER_PAGE")),
**request.session["navparams"])
return lst.render(request, request.session["pageid"])
@@ -348,7 +345,7 @@ def render_compose(request, form, posturl, email=None, insert_signature=False):
attachments = request.session["compose_mail"]["attachments"]
if len(attachments):
short_att_list = "(%s)" \
% ", ".join(map(lambda att: att["fname"],
% ", ".join(map(lambda att: att["fname"],
attachments[:2] + [{"fname" : "..."}] \
if len(attachments) > 2 else attachments))
else:
@@ -412,7 +409,7 @@ def getmailcontent(request):
raise WebmailError(_("Invalid request"))
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),
"headers" : email.render_headers(folder=mbox, mail_id=mailid),
"folder" : mbox, "imapid" : mailid, "mailbody" : email.body if email.body else ""
})
@@ -484,7 +481,7 @@ def index(request):
if action is not None:
if not globals().has_key(action):
raise WebmailError(_("Undefined action"))
response = globals()[action](request)
response = globals()[action](request)
else:
if request.is_ajax():
raise WebmailError(_("Bad request"))
@@ -499,11 +496,11 @@ def index(request):
response["refreshrate"] = \
int(parameters.get_user(request.user, "REFRESH_INTERVAL"))
response["quota"] = ImapListing.computequota(imapc)
response["ro_mboxes"] = ["INBOX", "Junk",
response["ro_mboxes"] = ["INBOX", "Junk",
parameters.get_user(request.user, "SENT_FOLDER"),
parameters.get_user(request.user, "TRASH_FOLDER"),
parameters.get_user(request.user, "DRAFTS_FOLDER")]
return _render(request, "webmail/index.html", response)
if action in ["reply", "forward"]: