diff --git a/extensions/webmail/lib.py b/extensions/webmail/lib.py index 4978049c7..c35fcd776 100644 --- a/extensions/webmail/lib.py +++ b/extensions/webmail/lib.py @@ -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, diff --git a/extensions/webmail/views.py b/extensions/webmail/views.py index c88612260..2c652a7cb 100644 --- a/extensions/webmail/views.py +++ b/extensions/webmail/views.py @@ -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 = "