wip: Big webmail refactoring

This commit is contained in:
Antoine Nguyen
2012-03-19 15:18:36 +01:00
parent cf124df059
commit 8b52b32a7e
6 changed files with 38 additions and 170 deletions
+12 -10
View File
@@ -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')
+5 -2
View File
@@ -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) {
@@ -225,6 +225,6 @@ function wm_updatelisting(resp) {
{% block menu %}{{ menu }}{% endblock %}
{% block footer %}
<div id="quotalabel">{% trans "Mailbox quota" %}</div>
<div id="quotabox"></div>
<div id="quotabox">{{ quota }}</div>
{{ block.super }}
{% endblock %}
+1 -1
View File
@@ -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"),
+2 -1
View File
@@ -13,6 +13,7 @@ urlpatterns = patterns(
(r'^getmailcontent', 'getmailcontent'),
# (r'^compose/$', "compose"),
(r'^delete/$', 'delete'),
(r'^move/$', "move"),
(r'^mark/(?P<name>.+)/$', "mark"),
(r'^empty/(?P<name>.+)/$', "empty"),
@@ -25,7 +26,7 @@ urlpatterns = patterns(
(r'^delattachment/$', 'delattachment'),
(r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/part/$', 'getattachment'),
(r'^(?P<fdname>.+)/(?P<mail_id>[\w\-\+]+)/delete/$', 'delete'),
#(r'^(?P<fdname>.+)/(?P<mail_id>[\w\-\+]+)/delete/$', 'delete'),
#(r'^(?P<folder>.+)/(?P<mailid>[\w\-\+]+)/content/$', 'getmailcontent'),
(r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/forward/$', 'forward'),
# (r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/reply/$', 'reply'),
+17 -155
View File
@@ -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("""
# <iframe width="100%" frameBorder="0" src="{{ url }}" id="mailcontent"></iframe>
# """).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"]: