def get_calendar_page(request, page_id=None): """Return a page containing calendars.""" sort_order, sort_dir = get_sort_order(request.GET, "name") calfilter = request.GET.get("calfilter", None) searchquery = request.GET.get("searchquery", None) page_id = request.GET.get("page", 1) if request.user.group == "SimpleUsers": mbox = request.user.mailbox_set.all()[0] cals = UserCalendar.objects.filter(mailbox=mbox) if searchquery is not None: cals = cals.filter(name__icontains=searchquery) cals = cals.select_related().all() else: ucals = [] if calfilter is None or calfilter == "user": ucals = UserCalendar.objects.get_for_admin(request.user) if searchquery is not None: ucals = ucals.filter(name__icontains=searchquery) scals = [] if calfilter is None or calfilter == "shared": scals = SharedCalendar.objects.get_for_admin(request.user) if searchquery is not None: scals = scals.filter(name__icontains=searchquery) cals = chain(ucals, scals) cals = sorted( cals, key=lambda c: getattr(c, sort_order), reverse=sort_dir == '-' ) return get_listing_page(cals, page_id)
def _domains(request): sort_order, sort_dir = get_sort_order(request.GET, "name") filters = dict( (flt, request.GET.get(flt, None)) for flt in ['domfilter', 'searchquery'] + events.raiseQueryEvent('ExtraDomainFilters') ) request.session['domains_filters'] = filters domainlist = get_domains(request.user, **filters) if sort_order == 'name': domainlist = sorted( domainlist, key=lambda d: getattr(d, sort_order), reverse=sort_dir == '-' ) else: domainlist = sorted(domainlist, key=lambda d: d.tags[0], reverse=sort_dir == '-') context = { "handle_mailboxes": parameters.get_admin( "HANDLE_MAILBOXES", raise_error=False), "auto_account_removal": parameters.get_admin("AUTO_ACCOUNT_REMOVAL") } page = get_listing_page(domainlist, request.GET.get("page", 1)) if page is None: context["length"] = 0 else: context["rows"] = _render_to_string( request, "admin/domains_table.html", { 'domains': page.object_list, } ) context["pages"] = [page.number] return render_to_json_response(context)
def _identities(request): filters = dict((fname, request.GET.get(fname, None)) for fname in ['searchquery', 'idtfilter', 'grpfilter']) request.session['identities_filters'] = filters idents_list = get_identities(request.user, **filters) sort_order, sort_dir = get_sort_order(request.GET, "identity", ["identity", "name_or_rcpt", "tags"]) if sort_order in ["identity", "name_or_rcpt"]: objects = sorted(idents_list, key=lambda o: getattr(o, sort_order), reverse=sort_dir == '-') else: objects = sorted(idents_list, key=lambda o: o.tags[0], reverse=sort_dir == '-') context = { "handle_mailboxes": parameters.get_admin("HANDLE_MAILBOXES", raise_error=False) } page = get_listing_page(objects, request.GET.get("page", 1)) if page is None: context["length"] = 0 else: context["headers"] = _render_to_string(request, "admin/identity_headers.html", {}) context["rows"] = _render_to_string(request, "admin/identities_table.html", {"identities": page.object_list}) context["pages"] = [page.number] return render_to_json_response(context)
def _identities(request): filters = dict((fname, request.GET.get(fname, None)) for fname in ['searchquery', 'idtfilter', 'grpfilter']) request.session['identities_filters'] = filters idents_list = get_identities(request.user, **filters) sort_order, sort_dir = get_sort_order(request.GET, "identity", ["identity", "name_or_rcpt", "tags"]) if sort_order in ["identity", "name_or_rcpt"]: objects = sorted(idents_list, key=lambda o: getattr(o, sort_order), reverse=sort_dir == '-') else: objects = sorted(idents_list, key=lambda o: o.tags[0], reverse=sort_dir == '-') context = { "handle_mailboxes": request.localconfig.parameters.get_value( "handle_mailboxes", raise_exception=False) } page = get_listing_page(objects, request.GET.get("page", 1)) if page is None: context["length"] = 0 else: context["headers"] = render_to_string( "admin/identity_headers.html", {}, request) context["rows"] = render_to_string( "admin/identities_table.html", { "identities": page.object_list }, request ) context["pages"] = [page.number] return render_to_json_response(context)
def list_quotas(request): from modoboa.lib.dbutils import db_type sort_order, sort_dir = get_sort_order(request.GET, "address") mboxes = Mailbox.objects.get_for_admin( request.user, request.GET.get("searchquery", None)) mboxes = mboxes.exclude(quota=0) if sort_order in ["address", "quota", "quota_value__bytes"]: mboxes = mboxes.order_by("%s%s" % (sort_dir, sort_order)) elif sort_order == "quota_usage": where = "admin_mailbox.address||'@'||admin_domain.name" db_type = db_type() if db_type == "postgres": select = '(admin_quota.bytes::float / (CAST(admin_mailbox.quota AS BIGINT) * 1048576)) * 100' else: select = 'admin_quota.bytes / (admin_mailbox.quota * 1048576) * 100' if db_type == "mysql": where = "CONCAT(admin_mailbox.address,'@',admin_domain.name)" mboxes = mboxes.extra(select={'quota_usage': select}, where=["admin_quota.username=%s" % where], tables=["admin_quota", "admin_domain"], order_by=["%s%s" % (sort_dir, sort_order)]) else: raise BadRequest(_("Invalid request")) page = get_listing_page(mboxes, request.GET.get("page", 1)) context = {} if page is None: context["length"] = 0 else: context["headers"] = _render_to_string(request, "admin/quota_headers.html", {}) context["rows"] = _render_to_string(request, "admin/quotas.html", {"mboxes": page}) context["pages"] = [page.number] return render_to_json_response(context)
def list_logs(request): """List all Maillog entries.""" sort_order, sort_dir = get_sort_order(request.GET, "date") search = request.GET.get("searchquery") if not request.user.is_superuser: domains = Domain.objects.get_for_admin(request.user) logs = ml_models.Maillog.objects.filter( Q(from_domain__in=domains) | Q(to_domain__in=domains)) else: logs = ml_models.Maillog.objects.all() logs = logs.order_by("{}{}".format(sort_dir, sort_order)) if search: logs = logs.filter( Q(sender__icontains=search) | Q(rcpt__icontains=search) | Q(queue_id__icontains=search) | Q(status__icontains=search)) page = get_listing_page(logs, request.GET.get("page", 1)) context = { "headers": render_to_string("admin/domains_log_headers.html", {}, request) } if page is None: context["length"] = 0 else: context["rows"] = render_to_string("admin/domains_logs.html", {"logs": page}, request) context["pages"] = [page.number] return render_to_json_response(context)
def list_quotas(request, tplname="admin/quotas.html"): from modoboa.lib.dbutils import db_type sort_order, sort_dir = get_sort_order(request.GET, "address") mboxes = Mailbox.objects.get_for_admin( request.user, request.GET.get("searchquery", None) ) mboxes = mboxes.exclude(quota=0) if sort_order in ["address", "quota", "quota_value__bytes"]: mboxes = mboxes.order_by("%s%s" % (sort_dir, sort_order)) elif sort_order == "quota_usage": if db_type() == "postgres": select = '(admin_quota.bytes::float / (CAST(admin_mailbox.quota AS BIGINT) * 1048576)) * 100' else: select = 'admin_quota.bytes / (admin_mailbox.quota * 1048576) * 100' mboxes = mboxes.extra( select={'quota_usage': select}, where=["admin_quota.mbox_id=admin_mailbox.id"], tables=["admin_quota"], order_by=["%s%s" % (sort_dir, sort_order)] ) else: raise BadRequest(_("Invalid request")) page = get_listing_page(mboxes, request.GET.get("page", 1)) return render_to_json_response({ "page": page.number, "paginbar": pagination_bar(page), "table": _render_to_string(request, tplname, { "mboxes": page }) })
def list_quotas(request): sort_order, sort_dir = get_sort_order(request.GET, "name") domains = Domain.objects.get_for_admin(request.user) domains = domains.exclude(quota=0) if sort_order in ["name", "quota"]: domains = domains.order_by("{}{}".format(sort_dir, sort_order)) elif sort_order == "allocated_quota": domains = ( domains.annotate(allocated_quota=Sum("mailbox__quota")) .order_by("{}{}".format(sort_dir, sort_order)) ) page = get_listing_page(domains, request.GET.get("page", 1)) context = { "headers": render_to_string( "admin/domains_quota_headers.html", {}, request ) } if page is None: context["length"] = 0 else: context["rows"] = render_to_string( "admin/domains_quotas.html", {"domains": page}, request ) context["pages"] = [page.number] return render_to_json_response(context)
def _identities(request): filters = { fname: request.GET.get(fname, None) for fname in ["searchquery", "idtfilter", "grpfilter"] } request.session["identities_filters"] = filters idents_list = get_identities(request.user, **filters) sort_order, sort_dir = get_sort_order(request.GET, "identity", ["identity", "name_or_rcpt", "tags"]) if sort_order in ["identity", "name_or_rcpt"]: objects = sorted(idents_list, key=lambda o: getattr(o, sort_order), reverse=sort_dir == "-") else: objects = sorted(idents_list, key=lambda o: o.tags[0]["label"], reverse=sort_dir == "-") context = { "handle_mailboxes": request.localconfig.parameters.get_value( "handle_mailboxes", raise_exception=False) } page = get_listing_page(objects, request.GET.get("page", 1)) context["headers"] = render_to_string( "admin/identity_headers.html", {}, request) if page is None: context["length"] = 0 else: context["rows"] = render_to_string( "admin/identities_table.html", { "identities": page.object_list }, request ) context["pages"] = [page.number] return render_to_json_response(context)
def _domains(request): sort_order, sort_dir = get_sort_order(request.GET, "name") filters = dict((flt, request.GET.get(flt, None)) for flt in ['domfilter', 'searchquery'] + events.raiseQueryEvent('ExtraDomainFilters')) request.session['domains_filters'] = filters domainlist = get_domains(request.user, **filters) if sort_order == 'name': domainlist = sorted(domainlist, key=lambda d: getattr(d, sort_order), reverse=sort_dir == '-') else: domainlist = sorted(domainlist, key=lambda d: d.tags[0], reverse=sort_dir == '-') context = { "handle_mailboxes": parameters.get_admin("HANDLE_MAILBOXES", raise_error=False), "auto_account_removal": parameters.get_admin("AUTO_ACCOUNT_REMOVAL") } page = get_listing_page(domainlist, request.GET.get("page", 1)) if page is None: context["length"] = 0 else: context["rows"] = _render_to_string(request, "admin/domains_table.html", { 'domains': page.object_list, }) context["pages"] = [page.number] return render_to_json_response(context)
def get_calendar_page(request, page_id=None): """Return a page containing calendars.""" sort_order, sort_dir = get_sort_order(request.GET, "name") calfilter = request.GET.get("calfilter", None) searchquery = request.GET.get("searchquery", None) page_id = request.GET.get("page", 1) if request.user.group == "SimpleUsers": mbox = request.user.mailbox cals = UserCalendar.objects.filter(mailbox=mbox) if searchquery is not None: cals = cals.filter(name__icontains=searchquery) cals = cals.select_related().all() else: ucals = [] if calfilter is None or calfilter == "user": ucals = UserCalendar.objects.get_for_admin(request.user) if searchquery is not None: ucals = ucals.filter(name__icontains=searchquery) scals = [] if calfilter is None or calfilter == "shared": scals = SharedCalendar.objects.get_for_admin(request.user) if searchquery is not None: scals = scals.filter(name__icontains=searchquery) cals = chain(ucals, scals) cals = sorted(cals, key=lambda c: getattr(c, sort_order), reverse=sort_dir == '-') return get_listing_page(cals, page_id)
def list_quotas(request): from modoboa.lib.db_utils import db_type sort_order, sort_dir = get_sort_order(request.GET, "address") mboxes = Mailbox.objects.get_for_admin( request.user, request.GET.get("searchquery", None) ) mboxes = mboxes.exclude(quota=0) if sort_order in ["address", "quota"]: mboxes = mboxes.order_by("%s%s" % (sort_dir, sort_order)) elif sort_order == "quota_value__bytes": where = "admin_mailbox.address||'@'||admin_domain.name" mboxes = mboxes.extra( select={"quota_value__bytes": "admin_quota.bytes"}, where=["admin_quota.username=%s" % where], tables=["admin_quota", "admin_domain"], order_by=["%s%s" % (sort_dir, sort_order)] ) elif sort_order == "quota_usage": where = "admin_mailbox.address||'@'||admin_domain.name" db_type = db_type() if db_type == "postgres": select = ( "(admin_quota.bytes::float / (CAST(admin_mailbox.quota " "AS BIGINT) * 1048576)) * 100" ) else: select = ( "admin_quota.bytes / (admin_mailbox.quota " "* 1048576) * 100" ) if db_type == "mysql": where = "CONCAT(admin_mailbox.address,'@',admin_domain.name)" mboxes = mboxes.extra( select={'quota_usage': select}, where=["admin_quota.username=%s" % where], tables=["admin_quota", "admin_domain"], order_by=["%s%s" % (sort_dir, sort_order)] ) else: raise BadRequest(_("Invalid request")) page = get_listing_page(mboxes, request.GET.get("page", 1)) context = { "headers": _render_to_string( request, "admin/quota_headers.html", {} ) } if page is None: context["length"] = 0 else: context["rows"] = _render_to_string( request, "admin/quotas.html", { "mboxes": page } ) context["pages"] = [page.number] return render_to_json_response(context)
def _domains(request): sort_order, sort_dir = get_sort_order(request.GET, "name") extra_filters = signals.extra_domain_filters.send(sender="_domains") if extra_filters: extra_filters = reduce(lambda a, b: a + b, [result[1] for result in extra_filters]) filters = { flt: request.GET.get(flt, None) for flt in ["domfilter", "searchquery"] + extra_filters } request.session["domains_filters"] = filters domainlist = get_domains(request.user, **filters) if sort_order == "name": domainlist = sorted(domainlist, key=lambda d: getattr(d, sort_order), reverse=sort_dir == "-") else: domainlist = sorted(domainlist, key=lambda d: d.tags[0]["name"], reverse=sort_dir == "-") context = { "handle_mailboxes": request.localconfig.parameters.get_value("handle_mailboxes", raise_exception=False), "auto_account_removal": request.localconfig.parameters.get_value("auto_account_removal"), } page = get_listing_page(domainlist, request.GET.get("page", 1)) parameters = request.localconfig.parameters dns_checks = { "enable_mx_checks": parameters.get_value("enable_mx_checks"), "enable_spf_checks": parameters.get_value("enable_spf_checks"), "enable_dkim_checks": parameters.get_value("enable_dkim_checks"), "enable_dmarc_checks": parameters.get_value("enable_dmarc_checks"), "enable_autoconfig_checks": (parameters.get_value("enable_autoconfig_checks")), "enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks") } context["headers"] = render_to_string("admin/domain_headers.html", dns_checks, request) if page is None: context["length"] = 0 else: tpl_context = {"domains": page.object_list} tpl_context.update(dns_checks) context["rows"] = render_to_string("admin/domains_table.html", tpl_context, request) context["pages"] = [page.number] return render_to_json_response(context)
def get_logs_page(request, page_id=None): """Return a page of logs.""" sort_order, sort_dir = get_sort_order( request.GET, "date_created", allowed_values=['date_created', 'level', 'logger', 'message']) if page_id is None: page_id = request.GET.get("page", None) if page_id is None: return None return get_listing_page( Log.objects.all().order_by("%s%s" % (sort_dir, sort_order)), page_id)
def _domains(request): sort_order, sort_dir = get_sort_order(request.GET, "name") extra_filters = signals.extra_domain_filters.send(sender="_domains") if extra_filters: extra_filters = reduce( lambda a, b: a + b, [result[1] for result in extra_filters]) filters = { flt: request.GET.get(flt, None) for flt in ["domfilter", "searchquery"] + extra_filters } request.session["domains_filters"] = filters domainlist = get_domains(request.user, **filters) if sort_order == "name": domainlist = sorted( domainlist, key=lambda d: getattr(d, sort_order), reverse=sort_dir == "-" ) else: domainlist = sorted(domainlist, key=lambda d: d.tags[0]["name"], reverse=sort_dir == "-") context = { "handle_mailboxes": request.localconfig.parameters.get_value( "handle_mailboxes", raise_exception=False), "auto_account_removal": request.localconfig.parameters.get_value( "auto_account_removal"), } page = get_listing_page(domainlist, request.GET.get("page", 1)) parameters = request.localconfig.parameters dns_checks = { "enable_mx_checks": parameters.get_value("enable_mx_checks"), "enable_spf_checks": parameters.get_value("enable_spf_checks"), "enable_dkim_checks": parameters.get_value("enable_dkim_checks"), "enable_dmarc_checks": parameters.get_value("enable_dmarc_checks"), "enable_autoconfig_checks": ( parameters.get_value("enable_autoconfig_checks")), "enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks") } context["headers"] = render_to_string( "admin/domain_headers.html", dns_checks, request ) if page is None: context["length"] = 0 else: tpl_context = {"domains": page.object_list} tpl_context.update(dns_checks) context["rows"] = render_to_string( "admin/domains_table.html", tpl_context, request ) context["pages"] = [page.number] return render_to_json_response(context)
def get_logs_page(request, page_id=None): """Return a page of logs.""" sort_order, sort_dir = get_sort_order( request.GET, "date_created", allowed_values=['date_created', 'level', 'logger', 'message'] ) if page_id is None: page_id = request.GET.get("page", None) if page_id is None: return None return get_listing_page( Log.objects.all().order_by("%s%s" % (sort_dir, sort_order)), page_id )
def logs(request, tplname="core/logs.html"): from modoboa.lib.templatetags.lib_tags import pagination_bar sort_order, sort_dir = get_sort_order( request.GET, "date_created", allowed_values=["date_created", "level", "logger", "message"] ) page = get_listing_page(Log.objects.all().order_by("%s%s" % (sort_dir, sort_order)), request.GET.get("page", 1)) return ajax_simple_response( { "status": "ok", "content": render_to_string(tplname, {"logs": page.object_list}), "page": page.number, "paginbar": pagination_bar(page), } )
def _identities(request): filters = dict((fname, request.GET.get(fname, None)) for fname in ["searchquery", "idtfilter", "grpfilter"]) request.session["identities_filters"] = filters idents_list = get_identities(request.user, **filters) sort_order, sort_dir = get_sort_order(request.GET, "identity", ["identity", "name_or_rcpt", "tags"]) if sort_order in ["identity", "name_or_rcpt"]: objects = sorted(idents_list, key=lambda o: getattr(o, sort_order), reverse=sort_dir == "-") else: objects = sorted(idents_list, key=lambda o: o.tags[0], reverse=sort_dir == "-") context = {"handle_mailboxes": parameters.get_admin("HANDLE_MAILBOXES", raise_error=False)} page = get_listing_page(objects, request.GET.get("page", 1)) if page is None: context["length"] = 0 else: context["headers"] = _render_to_string(request, "admin/identity_headers.html", {}) context["rows"] = _render_to_string(request, "admin/identities_table.html", {"identities": page.object_list}) context["pages"] = [page.number] return render_to_json_response(context)
def _domains(request): sort_order, sort_dir = get_sort_order(request.GET, "name") extra_filters = reduce( lambda a, b: a + b, [result[1] for result in signals.extra_domain_filters.send(sender="_domains")] ) filters = dict( (flt, request.GET.get(flt, None)) for flt in ["domfilter", "searchquery"] + extra_filters ) request.session['domains_filters'] = filters domainlist = get_domains(request.user, **filters) if sort_order == 'name': domainlist = sorted( domainlist, key=lambda d: getattr(d, sort_order), reverse=sort_dir == '-' ) else: domainlist = sorted(domainlist, key=lambda d: d.tags[0], reverse=sort_dir == '-') context = { "handle_mailboxes": request.localconfig.parameters.get_value( "handle_mailboxes", raise_exception=False), "auto_account_removal": request.localconfig.parameters.get_value( "auto_account_removal"), } page = get_listing_page(domainlist, request.GET.get("page", 1)) if page is None: context["length"] = 0 else: parameters = request.localconfig.parameters context["rows"] = render_to_string( "admin/domains_table.html", { "domains": page.object_list, "enable_mx_checks": parameters.get_value("enable_mx_checks"), "enable_dnsbl_checks": ( parameters.get_value("enable_dnsbl_checks")) }, request ) context["pages"] = [page.number] return render_to_json_response(context)
def _domains(request): sort_order, sort_dir = get_sort_order(request.GET, "name") extra_filters = reduce( lambda a, b: a + b, [result[1] for result in signals.extra_domain_filters.send(sender="_domains")] ) filters = dict( (flt, request.GET.get(flt, None)) for flt in ["domfilter", "searchquery"] + extra_filters ) request.session['domains_filters'] = filters domainlist = get_domains(request.user, **filters) if sort_order == 'name': domainlist = sorted( domainlist, key=lambda d: getattr(d, sort_order), reverse=sort_dir == '-' ) else: domainlist = sorted(domainlist, key=lambda d: d.tags[0], reverse=sort_dir == '-') context = { "handle_mailboxes": request.localconfig.parameters.get_value( "handle_mailboxes", raise_exception=False), "auto_account_removal": request.localconfig.parameters.get_value( "auto_account_removal"), } page = get_listing_page(domainlist, request.GET.get("page", 1)) if page is None: context["length"] = 0 else: parameters = request.localconfig.parameters context["rows"] = _render_to_string( request, "admin/domains_table.html", { "domains": page.object_list, "enable_mx_checks": parameters.get_value("enable_mx_checks"), "enable_dnsbl_checks": ( parameters.get_value("enable_dnsbl_checks")) } ) context["pages"] = [page.number] return render_to_json_response(context)
def logs(request, tplname="core/logs.html"): from modoboa.lib.templatetags.lib_tags import pagination_bar sort_order, sort_dir = get_sort_order( request.GET, "date_created", allowed_values=['date_created', 'level', 'logger', 'message']) page = get_listing_page( Log.objects.all().order_by("%s%s" % (sort_dir, sort_order)), request.GET.get("page", 1)) return render_to_json_response({ "content": render_to_string(tplname, { "logs": page.object_list, }), "page": page.number, "paginbar": pagination_bar(page), })
def _identities(request): filters = dict((fname, request.GET.get(fname, None)) for fname in ['searchquery', 'idtfilter', 'grpfilter']) request.session['identities_filters'] = filters idents_list = get_identities(request.user, **filters) sort_order, sort_dir = get_sort_order(request.GET, "identity", ["identity", "name_or_rcpt", "tags"]) if sort_order in ["identity", "name_or_rcpt"]: objects = sorted(idents_list, key=lambda o: getattr(o, sort_order), reverse=sort_dir == '-') else: objects = sorted(idents_list, key=lambda o: o.tags[0], reverse=sort_dir == '-') page = get_listing_page(objects, request.GET.get("page", 1)) return render_to_json_response({ "table": _render_to_string(request, "admin/identities_table.html", { "identities": page.object_list, "tableid": "objects_table" }), "handle_mailboxes": parameters.get_admin("HANDLE_MAILBOXES", raise_error=False), "page": page.number, "paginbar": pagination_bar(page) })