mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
wip: Big webmail refactoring
This commit is contained in:
@@ -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')
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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
@@ -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"]:
|
||||
|
||||
Reference in New Issue
Block a user