Code refactored to support refresh of all concerned pages.
This commit is contained in:
tonio
2011-01-03 18:54:51 +01:00
parent 23d5866296
commit 49ea2439e0
3 changed files with 68 additions and 29 deletions
+6 -3
View File
@@ -418,13 +418,16 @@ class ImapListing(EmailListing):
unicode(or_criterion(criterions, '%s "%s"' % (key, pattern)))
self.mbc.criterions = [unicode("(%s)" % criterions)]
def getquota(self):
@staticmethod
def computequota(mbc):
try:
return int(float(self.mbc.quota_actual) \
/ float(self.mbc.quota_limit) * 100)
return int(float(mbc.quota_actual) \
/ float(mbc.quota_limit) * 100)
except AttributeError:
return -1
def getquota(self):
return ImapListing.computequota(self.mbc)
class ImapEmail(Email):
def __init__(self, msg, user, dformat="DISPLAYMODE", addrfull=False,
+60 -25
View File
@@ -11,7 +11,7 @@ from django.contrib.auth.decorators import login_required
from modoboa.admin.models import Mailbox
from modoboa.lib import parameters, _render, _render_error, \
getctx, is_not_localadmin, _render_to_string
from modoboa.lib.email_listing import parse_search_parameters
from modoboa.lib.email_listing import parse_search_parameters, Paginator
from lib import *
from forms import *
from templatetags.webextras import *
@@ -23,11 +23,58 @@ def __get_current_url(request):
res += "&%s=%s" % (p, request.session[p])
return res
def __render_folders(mbc, request):
return render_to_string("webmail/folders.html", {
"selected" : request.session["folder"],
"folders" : mbc.getfolders(request.user)
})
def __render_common_components(request, folder, lst=None, content=None, menu=None):
"""Render all components that are common to all pages in the webmail
It concerns the main listing, the viewmail and the compose
pages. Components are : main content, folders list, pagination
bar, quota bar.
Two modes are available :
* If lst is provided, do not use content,
* If lst is not provided, do not use content, nor menu.
:param request: a Request object
:param folder: the current folder
:param lst: an ImapListing object
:param content: the HTML that will go into the 'listing' div
:param menu: the current page menu
"""
if lst is not None:
paginator = lst.paginator
mbc = lst.mbc
menu = listing_menu("", folder, request.user)
else:
mbc = IMAPconnector(user=request.user.username,
password=request.session["password"])
paginator = Paginator(mbc.messages_count(folder=folder,
order=request.session["navparams"]["order"]),
int(parameters.get_user(request.user, "MESSAGES_PER_PAGE")))
page = paginator.getpage(request.session["page"])
if page:
navbar = EmailListing.render_navbar(page)
if lst:
listing = lst.fetch(request, page.id_start, page.id_stop)
else:
navbar = ""
if lst:
listing = "<div class='info'>%s</div>" \
% _("This folder contains no messages")
ret = {
"folders" : render_to_string("webmail/folders.html", {
"selected" : request.session["folder"],
"folders" : mbc.getfolders(request.user)
}),
"menu" : menu,
"listing" : listing,
"navbar" : navbar,
"quota" : ImapListing.computequota(mbc)
}
return ret
@login_required
@is_not_localadmin()
@@ -54,23 +101,11 @@ def folder(request, name, updatenav=True):
optparams["criteria"] = request.session["criteria"]
else:
optparams["reset"] = True
optparams["elems_per_page"] = int(parameters.get_user(request.user, "MESSAGES_PER_PAGE"))
optparams["elems_per_page"] = int(parameters.get_user(request.user, "MESSAGES_PER_PAGE"))
lst = ImapListing(request.user, request.session["password"],
baseurl=name, folder=name, order=order,
**optparams)
page = lst.paginator.getpage(request.session["page"])
dico = {"folders" : __render_folders(lst.mbc, request),
"menu" : listing_menu("", name, request.user)}
if page:
dico["listing"] = lst.fetch(request, page.id_start, page.id_stop)
dico["navbar"] = lst.render_navbar(page)
else:
dico["listing"] = "<div class='info'>%s</div>" \
% _("This folder contains no messages")
dico["navbar"] = ""
dico["quota"] = lst.getquota()
dico = __render_common_components(request, folder, lst)
ctx = getctx("ok", **dico)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
@@ -113,8 +148,8 @@ def viewmail(request, folder, mail_id=None):
request.user.get_all_permissions())
mbc = IMAPconnector(user=request.user.username,
password=request.session["password"])
ctx = getctx("ok", menu=menu, listing=content,
folders=__render_folders(mbc, request))
ctx = getctx("ok", **__render_common_components(request, folder,
menu=menu, listing=content))
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
@login_required
@@ -239,9 +274,9 @@ def render_compose(request, form, posturl, email=None, insert_signature=False):
})
mbc = IMAPconnector(user=request.user.username,
password=request.session["password"])
ctx = getctx("ok", level=2, menu=menu, listing=content,
folders=__render_folders(mbc, request),
editor=editor)
ctx = getctx("ok", level=2, editor=editor,
**__render_common_components(request, request.session["folder"],
menu=menu, listing=content))
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
def __html2plaintext(content):
+2 -1
View File
@@ -100,7 +100,8 @@ class EmailListing:
if baseurl:
self.paginator.baseurl = baseurl
def render_navbar(self, page):
@staticmethod
def render_navbar(page):
if page is None:
return ""
context = {"page" : page, "MEDIA_URL" : settings.MEDIA_URL}