mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
@@ -122,7 +122,10 @@ def get_static_content(target):
|
||||
function arform_cb() {
|
||||
$('#id_untildate').datepicker();
|
||||
$(".submit").one('click', function(e) {
|
||||
simple_ajax_form_post(e, arform_cb);
|
||||
simple_ajax_form_post(e, {
|
||||
error_cb: arform_cb,
|
||||
formid: "arform"
|
||||
});
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -18,7 +18,8 @@ def autoreply(request, tplname="common/generic_modal_form.html"):
|
||||
title=_("Auto-reply message"),
|
||||
action=reverse(autoreply),
|
||||
formid="arform",
|
||||
submit_label=_("Update")
|
||||
action_label=_("Update"),
|
||||
action_classes="submit"
|
||||
)
|
||||
mb = Mailbox.objects.get(user=request.user.id)
|
||||
try:
|
||||
|
||||
@@ -10,6 +10,7 @@ class ComposeMailForm(forms.Form):
|
||||
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()
|
||||
|
||||
class AttachmentForm(forms.Form):
|
||||
|
||||
@@ -11,7 +11,7 @@ from imapclient.response_parser import parse_fetch_response
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.connections import *
|
||||
from modoboa.lib.webutils import static_url
|
||||
from exceptions import ImapError
|
||||
from exceptions import ImapError, WebmailError
|
||||
from fetch_parser import *
|
||||
|
||||
#imaplib.Debug = 4
|
||||
@@ -347,7 +347,7 @@ class IMAPconnector(object):
|
||||
@capability('LIST-EXTENDED', '_listfolders_simple')
|
||||
def _listfolders(self, topmailbox='', md_mailboxes=[]):
|
||||
pattern = ("%s.%%" % topmailbox.encode("imap4-utf-7")) if len(topmailbox) else "%"
|
||||
resp = self._cmd("LSUB", "", pattern, "RETURN", "(CHILDREN)")
|
||||
resp = self._cmd("LIST", "", pattern, "RETURN", "(CHILDREN)")
|
||||
result = []
|
||||
for mb in resp:
|
||||
flags, delimiter, name, childinfo = \
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
{% load i18n %}
|
||||
{% load webextras %}
|
||||
<ul class="nav nav-list">
|
||||
{% if titlebar %}
|
||||
<li class="nav-header">
|
||||
<a href="{% url modoboa.extensions.webmail.views.newfolder %}">
|
||||
<i class="icon-plus"></i>
|
||||
{% trans "Folders" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% print_folders folders selected withunseen withmenu %}
|
||||
</ul>
|
||||
{% load i18n webextras %}
|
||||
<div id="mboxes_container">
|
||||
<ul class="nav nav-list">
|
||||
<li class="nav-header">{% trans "Folders" %}</li>
|
||||
{% print_folders folders selected withunseen %}
|
||||
</ul>
|
||||
</div>
|
||||
<div id="mboxactions">{% mboxes_menu %}</div>
|
||||
|
||||
@@ -74,7 +74,8 @@ def compose_menu(selection, backurl, user):
|
||||
def listmailbox_menu(selection, folder, user):
|
||||
entries = [
|
||||
{"name" : "compose",
|
||||
"url" : "compose",
|
||||
"url" : "compose",
|
||||
"img" : "icon-edit",
|
||||
"label" : _("New message"),
|
||||
"class" : "btn"},
|
||||
{"name" : "mark",
|
||||
@@ -118,7 +119,11 @@ def listmailbox_menu(selection, folder, user):
|
||||
))
|
||||
|
||||
@register.simple_tag
|
||||
def print_folders(folders, selected=None, withunseen=False, withmenu=False):
|
||||
def print_folders(folders, selected=None, withunseen=False, selectonly=False):
|
||||
"""Display a tree of mailboxes and sub-mailboxes
|
||||
|
||||
|
||||
"""
|
||||
result = ""
|
||||
|
||||
for fd in folders:
|
||||
@@ -136,22 +141,46 @@ def print_folders(folders, selected=None, withunseen=False, withmenu=False):
|
||||
ul_state = "hidden"
|
||||
div_state = "collapsed"
|
||||
result += "<div class='clickbox %s'></div>" % div_state
|
||||
# if withmenu:
|
||||
# result += "<img src='%spics/go-down.png' class='footer' />" \
|
||||
# % settings.MEDIA_URL
|
||||
|
||||
cssclass = "block"
|
||||
if withunseen and fd.has_key("unseen"):
|
||||
label += " (%d)" % fd["unseen"]
|
||||
cssclass += " unseen"
|
||||
iclass = fd["class"] if fd.has_key("class") else "icon-folder-close"
|
||||
result += """<a href='%s' class='%s' name='loadfolder'>
|
||||
result += """<a href='%s' class='%s' name='%s'>
|
||||
<i class="%s"></i>
|
||||
%s
|
||||
</a>
|
||||
""" % (fd.has_key("path") and fd["path"] or fd["name"], cssclass, iclass, label)
|
||||
""" % (fd.has_key("path") and fd["path"] or fd["name"], cssclass,
|
||||
'selectfolder' if selectonly else 'loadfolder', iclass, label)
|
||||
if fd.has_key("sub") and len(fd["sub"]):
|
||||
result += "<ul name='%s' class='%s'>" % (fd["path"], ul_state) \
|
||||
+ print_folders(fd["sub"], selected, withunseen, withmenu) + "</ul>\n"
|
||||
+ print_folders(fd["sub"], selected, withunseen, selectonly) + "</ul>\n"
|
||||
result += "</li>\n"
|
||||
return result
|
||||
|
||||
@register.simple_tag
|
||||
def mboxes_menu():
|
||||
entries = [
|
||||
{"name" : "newmbox",
|
||||
"url" : reverse(webmail.views.newfolder),
|
||||
"img" : "icon-plus",
|
||||
"label" : "",
|
||||
"modal" : True,
|
||||
"modalcb" : "webmail.mboxform_cb",
|
||||
"class" : "btn btn-mini"},
|
||||
{"name" : "editmbox",
|
||||
"url" : reverse(webmail.views.editfolder),
|
||||
"img" : "icon-edit",
|
||||
"label" : "",
|
||||
"class" : "btn btn-mini"},
|
||||
{"name" : "removembox",
|
||||
"url" : reverse(webmail.views.delfolder),
|
||||
"img" : "icon-remove",
|
||||
"label" : "",
|
||||
"class" : "btn btn-mini"}
|
||||
]
|
||||
|
||||
return render_to_string('common/buttons_list.html', dict(
|
||||
entries=entries, css="nav"
|
||||
))
|
||||
|
||||
+28
-26
@@ -1,4 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# coding: utf-8
|
||||
import time
|
||||
import sys
|
||||
from django.http import HttpResponse, Http404, HttpResponseRedirect
|
||||
@@ -64,7 +64,6 @@ def __render_common_components(request, folder_name, lst=None, content=None, men
|
||||
"titlebar" : True,
|
||||
"selected" : request.session["folder"],
|
||||
"folders" : mbc.getfolders(request.user),
|
||||
"withmenu" : True,
|
||||
"withunseen" : True
|
||||
}),
|
||||
"menu" : menu,
|
||||
@@ -229,20 +228,22 @@ def separate_folder(fullname, sep="."):
|
||||
|
||||
@login_required
|
||||
@needs_mailbox()
|
||||
def newfolder(request, tplname="webmail/folder.html"):
|
||||
def newfolder(request, tplname="webmail/folder2.html"):
|
||||
mbc = IMAPconnector(user=request.user.username,
|
||||
password=request.session["password"])
|
||||
ctx = {"title" : _("Create a new folder"),
|
||||
"fname" : "newfolder",
|
||||
"submit_label" : _("Create"),
|
||||
"withmenu" : False,
|
||||
"withunseen" : False}
|
||||
"formid" : "mboxform",
|
||||
"action" : reverse(newfolder),
|
||||
"action_label" : _("Create"),
|
||||
"action_classes" : "submit",
|
||||
"withunseen" : False,
|
||||
"selectonly" : True}
|
||||
|
||||
ctx["folders"] = mbc.getfolders(request.user)
|
||||
if request.method == "POST":
|
||||
form = FolderForm(request.POST)
|
||||
if form.is_valid():
|
||||
pf = request.POST.has_key("parent_folder") \
|
||||
and request.POST["parent_folder"] or None
|
||||
pf = request.POST.get("parent_folder", None)
|
||||
mbc.create_folder(form.cleaned_data["name"], pf)
|
||||
return ajax_response(request, ajaxnav=True, respmsg=_("Folder created"))
|
||||
|
||||
@@ -256,14 +257,16 @@ def newfolder(request, tplname="webmail/folder.html"):
|
||||
|
||||
@login_required
|
||||
@needs_mailbox()
|
||||
def editfolder(request, tplname="webmail/folder.html"):
|
||||
def editfolder(request, tplname="webmail/folder2.html"):
|
||||
mbc = IMAPconnector(user=request.user.username,
|
||||
password=request.session["password"])
|
||||
ctx = {"title" : _("Edit folder"),
|
||||
"fname" : "editfolder",
|
||||
"submit_label" : _("Update"),
|
||||
"withmenu" : False,
|
||||
"withunseen" : False}
|
||||
ctx = {"title" : _("Edit mailbox"),
|
||||
"formid" : "mboxform",
|
||||
"action" : reverse(editfolder),
|
||||
"action_label" : _("Update"),
|
||||
"action_classes" : "submit",
|
||||
"withunseen" : False,
|
||||
"selectonly" : True}
|
||||
ctx["folders"] = mbc.getfolders(request.user)
|
||||
if request.method == "POST":
|
||||
form = FolderForm(request.POST)
|
||||
@@ -285,12 +288,12 @@ def editfolder(request, tplname="webmail/folder.html"):
|
||||
ctx["form"] = form
|
||||
return ajax_response(request, status="ko", template=tplname, **ctx)
|
||||
|
||||
if not request.GET.has_key("name") or request.GET["name"] == "":
|
||||
return
|
||||
name = request.GET["name"]
|
||||
ctx["oldname"] = name
|
||||
name, parent = separate_folder(name)
|
||||
name = request.GET.get("name", None)
|
||||
if name is None:
|
||||
raise WebmailError(_("Invalid request"))
|
||||
shortname, parent = separate_folder(name)
|
||||
ctx["form"] = FolderForm()
|
||||
ctx["form"].fields["oldname"].initial = shortname
|
||||
ctx["form"].fields["name"].initial = name
|
||||
ctx["selected"] = parent
|
||||
return _render(request, tplname, ctx)
|
||||
@@ -298,16 +301,17 @@ def editfolder(request, tplname="webmail/folder.html"):
|
||||
@login_required
|
||||
@needs_mailbox()
|
||||
def delfolder(request):
|
||||
if not request.GET.has_key("name") or request.GET["name"] == "":
|
||||
return
|
||||
name = request.GET.get("name", None)
|
||||
if name is None:
|
||||
raise WebmailError(_("Bad request"))
|
||||
mbc = IMAPconnector(user=request.user.username,
|
||||
password=request.session["password"])
|
||||
mbc.delete_folder(request.GET["name"])
|
||||
mbc.delete_folder(name)
|
||||
return ajax_response(request)
|
||||
|
||||
@login_required
|
||||
@needs_mailbox()
|
||||
def attachments(request, tplname="webmail/attachments2.html"):
|
||||
def attachments(request, tplname="webmail/attachments.html"):
|
||||
if request.method == "POST":
|
||||
csuploader = AttachmentUploadHandler()
|
||||
request.upload_handlers.insert(0, csuploader)
|
||||
@@ -383,10 +387,8 @@ def render_mboxes_list(request, imapc):
|
||||
"""
|
||||
curmbox = request.session.get("mbox", "INBOX")
|
||||
return _render_to_string(request, "webmail/folders.html", {
|
||||
"titlebar" : True,
|
||||
"selected" : curmbox,
|
||||
"folders" : imapc.getfolders(request.user),
|
||||
"withmenu" : True,
|
||||
"withunseen" : True
|
||||
})
|
||||
|
||||
|
||||
@@ -126,6 +126,5 @@ def render_link(linkdef, mdclass=None):
|
||||
class="{{ mdclass }}{% if link.class %} {{ link.class }}{% endif %}"
|
||||
{% if link.confirm %} onclick="return confirm('{{ link.confirm }}')"{% endif %}>
|
||||
{% if link.img %}<i class="{{ link.img }}"></i>{% endif %}
|
||||
{{ link.label }}
|
||||
</a>""")
|
||||
{{ link.label }}</a>""")
|
||||
return t.render(Context(dict(link=linkdef, mdclass=mdclass)))
|
||||
|
||||
+3
-11
@@ -35,18 +35,10 @@ def _render_error(request, errortpl="error", user_context={}):
|
||||
context_instance=template.RequestContext(request))
|
||||
|
||||
def render_actions(actions):
|
||||
t = template.Template("""
|
||||
{% for a in actions %}
|
||||
<a href="{{ a.url }}" name="{{ a.name }}"
|
||||
{% if a.modal %}data-toggle="ajaxmodal"{% endif %}
|
||||
{% if a.modalcb %}modalcb="{{ a.modalcb }}"{% endif %}
|
||||
{% if a.confirm %}onclick="return confirm('{{ a.confirm }}')"{% endif %}>
|
||||
<i class="{{ a.img }}" title="{{ a.title }}"></i></a>
|
||||
{% endfor %}
|
||||
t = template.Template("""{% load libextras %}
|
||||
{% for a in actions %}{% render_link a %}{% endfor %}
|
||||
""")
|
||||
return t.render(template.Context({
|
||||
"actions" : actions
|
||||
}))
|
||||
return t.render(template.Context(dict(actions=actions)))
|
||||
|
||||
def _ctx_ok(url):
|
||||
return {"status" : "ok", "url" : url}
|
||||
|
||||
@@ -18,7 +18,7 @@ body {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
#pagination_bar {
|
||||
.navbar-text {
|
||||
color: #999999 !important;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user