diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py
index e000a5b29..3021f19ac 100644
--- a/modoboa/admin/models/domain.py
+++ b/modoboa/admin/models/domain.py
@@ -108,24 +108,6 @@ class Domain(mixins.MessageLimitMixin, AdminObject):
"""Number of alarms currently opened for this domain."""
return self.alarms.opened().count()
- @property
- def tags(self):
- label = ""
- for dt in constants.DOMAIN_TYPES:
- if self.type == dt[0]:
- label = dt[1]
- result = [{"name": self.type, "label": label, "type": "dom"}]
- if self.transport:
- result.append(
- {
- "name": self.transport.service,
- "label": self.transport.service,
- "type": "srv",
- "color": "info",
- }
- )
- return result
-
@property
def admins(self):
"""Return the domain administrators of this domain.
@@ -268,24 +250,6 @@ class Domain(mixins.MessageLimitMixin, AdminObject):
"""Return the key used to store messages count."""
return self.name
- @property
- def bind_format_dkim_public_key(self):
- """Return DKIM public key using Bind format."""
- record = f"v=DKIM1;k=rsa;p={self.dkim_public_key}"
- # TXT records longer than 255 characters need split into chunks
- # split record into 74 character chunks (+2 for indent, +2 for quotes(")
- # == 78 characters) to make more readable in text editors.
- split_record = []
- while record:
- if len(record) > 74:
- split_record.append(f' "{record[:74]}"')
- record = record[74:]
- else:
- split_record.append(f' "{record}"')
- break
- record = "\n".join(split_record)
- return f"{self.dkim_key_selector}._domainkey.{self.name}. IN TXT (\n{record})"
-
def add_admin(self, account):
"""Add a new administrator to this domain.
diff --git a/modoboa/contacts/templates/modoboa_contacts/index.html b/modoboa/contacts/templates/modoboa_contacts/index.html
deleted file mode 100644
index afb6a3c4f..000000000
--- a/modoboa/contacts/templates/modoboa_contacts/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{% extends "fluid.html" %}
-
-{% load i18n lib_tags static %}
-{% load render_bundle from webpack_loader %}
-
-{% block pagetitle %}{% trans "Contacts" %}{% endblock %}
-
-{% block extra_css %}
- {% if not debug %}
- {% render_bundle 'app' 'css' 'CONTACTS' %}
- {% endif %}
-{% endblock %}
-
-{% block extra_js %}
- {% if sync_enabled %}
-
- {% endif %}
- {% render_bundle 'app' 'js' 'CONTACTS' %}
-{% endblock %}
-
-{% block container_content %}
-
-
-
-
-{% endblock %}
diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl
index a6f1e32e9..67a373831 100644
--- a/modoboa/core/commands/templates/settings.py.tpl
+++ b/modoboa/core/commands/templates/settings.py.tpl
@@ -118,8 +118,6 @@ MIDDLEWARE = (
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'modoboa.core.middleware.LocalConfigMiddleware',
- 'modoboa.lib.middleware.AjaxLoginRedirect',
- 'modoboa.lib.middleware.CommonExceptionCatcher',
'modoboa.lib.middleware.RequestCatcherMiddleware',
)
diff --git a/modoboa/lib/middleware.py b/modoboa/lib/middleware.py
index db93f0fc5..f679b6287 100644
--- a/modoboa/lib/middleware.py
+++ b/modoboa/lib/middleware.py
@@ -1,43 +1,8 @@
"""Custom middlewares."""
-from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin
-from django.utils.encoding import smart_str
from modoboa.lib import signals as lib_signals
-from modoboa.lib.exceptions import ModoboaException
-from modoboa.lib.web_utils import _render_error, ajax_response, render_to_json_response
-
-
-def is_ajax(request):
- return request.META.get("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest"
-
-
-class AjaxLoginRedirect(MiddlewareMixin):
-
- def process_response(self, request, response):
- if is_ajax(request):
- if isinstance(response, HttpResponseRedirect):
- response.status_code = 278
- return response
-
-
-class CommonExceptionCatcher(MiddlewareMixin):
- """Modoboa exceptions catcher."""
-
- def process_exception(self, request, exception):
- if not isinstance(exception, ModoboaException):
- return None
-
- if is_ajax(request) or "/api/" in request.path:
- if exception.http_code is None:
- return ajax_response(
- request, status="ko", respmsg=smart_str(exception), norefresh=True
- )
- return render_to_json_response(
- smart_str(exception), status=exception.http_code
- )
- return _render_error(request, user_context={"error": smart_str(exception)})
class RequestCatcherMiddleware(MiddlewareMixin):
diff --git a/modoboa/lib/templatetags/form_tags.py b/modoboa/lib/templatetags/form_tags.py
index 9d3fa573f..50e6aaeb3 100644
--- a/modoboa/lib/templatetags/form_tags.py
+++ b/modoboa/lib/templatetags/form_tags.py
@@ -47,38 +47,6 @@ def render_field(field, help_display_mode="tooltip", label_width="col-sm-4", **o
return render_to_string("common/generic_field.html", context)
-@register.simple_tag
-def render_fields_group(form, pattern):
- """Render a group of fields."""
- first = forms.BoundField(form, form.fields[pattern], pattern)
- configure_field_classes(first)
- label = first.label
- group = [first]
- cpt = 1
- haserror = len(first.errors) != 0
- while True:
- fname = f"{pattern}_{cpt}"
- if fname not in form.fields:
- break
- bfield = forms.BoundField(form, form.fields[fname], fname)
- if len(bfield.errors):
- haserror = True
- configure_field_classes(bfield)
- group += [bfield]
- cpt += 1
-
- return render_to_string(
- "common/generic_fields_group.html",
- {
- "label": label,
- "help_text": first.help_text,
- "group": group,
- "haserror": haserror,
- "pattern": pattern,
- },
- )
-
-
@register.simple_tag
def render_field_width(field):
"""."""
diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py
deleted file mode 100644
index 3214e457e..000000000
--- a/modoboa/lib/templatetags/lib_tags.py
+++ /dev/null
@@ -1,122 +0,0 @@
-"""Custom template tags."""
-
-from datetime import datetime
-
-from django import template
-from django.template import Context, RequestContext, Template
-from django.utils.safestring import mark_safe
-from django.utils.translation import gettext as _
-
-from modoboa.core import signals as core_signals
-
-register = template.Library()
-
-
-@register.simple_tag
-def join(items, sep=","):
- res = ""
- for k, v in list(items.items()):
- if res != "":
- res += sep
- res += f"{k} : '{v}'"
- return res
-
-
-@register.simple_tag
-def tolist(values):
- return mark_safe("[{}]".format(",".join([f'"{v}"' for v in values])))
-
-
-@register.simple_tag
-def alert(msg, typ):
- t = Template(
- """
-
-{{ msg }}
-
"""
- ) # NOQA:E501
- return t.render(Context({"type": typ, "msg": msg}))
-
-
-@register.simple_tag
-def render_link(linkdef, mdclass=""):
- t = Template(
- """
-{% if link.img %}{% endif %}
-{{ link.label }}"""
- ) # NOQA:E501
- return t.render(Context({"link": linkdef, "mdclass": mdclass}))
-
-
-@register.simple_tag
-def render_post_link(linkdef, request):
- t = Template(
- """"""
- )
- return t.render(RequestContext(request, {"link": linkdef}))
-
-
-@register.simple_tag
-def progress_color(value):
- value = int(value)
- if value < 50:
- return "progress-bar progress-bar-info"
- if value < 80:
- return "progress-bar progress-bar-warning"
- return "progress-bar progress-bar-danger"
-
-
-@register.filter
-def fromunix(value):
- return datetime.fromtimestamp(int(value))
-
-
-@register.simple_tag
-def render_tags(tags):
- t = Template(
- """{% for tag in tags %}
-
- {{ tag.label }}
-
-{% endfor %}
-"""
- ) # NOQA:E501
- return t.render(Context({"tags": tags}))
-
-
-@register.simple_tag
-def extra_static_content(caller, st_type, user):
- """Get extra static content from extensions.
-
- :param str caller: the application (location) responsible for the call
- :param str st_type: content type (css or js)
- :param ``User`` user: connected user
- """
- tpl = template.Template("{% for sc in static_content %}{{ sc|safe }}{% endfor %}")
- static_content = core_signals.extra_static_content.send(
- sender="extra_static_content", caller=caller, st_type=st_type, user=user
- )
- static_content = [result[1] for result in static_content]
- return tpl.render(template.Context({"static_content": static_content}))
-
-
-@register.filter(name="localize_header_name")
-def localize_header_name(headername):
- """Localizes the header names"""
- names = {
- "From": _("From"),
- "To": _("To"),
- "Date": _("Date"),
- "Subject": _("Subject"),
- }
- return names.get(headername, headername)
diff --git a/modoboa/lib/web_utils.py b/modoboa/lib/web_utils.py
index 1f9d4cf1d..76ad31eef 100644
--- a/modoboa/lib/web_utils.py
+++ b/modoboa/lib/web_utils.py
@@ -1,113 +1,11 @@
-"""
-This module contains extra functions/shortcuts used to render HTML.
-"""
+"""Extra functions/shortcuts used to render HTML."""
-import json
import re
-import sys
-
-from django import template
-from django.conf import settings
-from django.http import HttpResponse, JsonResponse
-from django.shortcuts import render
-from django.template.loader import render_to_string
-def _render_error(request, errortpl="error", user_context=None):
- if user_context is None:
- user_context = {}
- return render(request, f"common/{errortpl}.html", user_context)
-
-
-def render_actions(actions):
- t = template.Template(
- """{% load lib_tags %}
-{% for a in actions %}{% render_link a %}{% endfor %}
-"""
- )
- return t.render(template.Context({"actions": actions}))
-
-
-def getctx(status, level=1, callback=None, **kwargs):
- if not callback:
- callername = sys._getframe(level).f_code.co_name
- else:
- callername = callback
- ctx = {"status": status, "callback": callername}
- for kw, v in list(kwargs.items()):
- ctx[kw] = v
- return ctx
-
-
-def ajax_response(
- request,
- status="ok",
- respmsg=None,
- url=None,
- ajaxnav=False,
- norefresh=False,
- template=None,
- **kwargs,
-):
- """Ajax response shortcut
-
- Simple shortcut that sends an JSON response. If a template is
- provided, a 'content' field will be added to the response,
- containing the result of this template rendering.
-
- :param request: a Request object
- :param status: the response status ('ok' or 'ko)
- :param respmsg: the message that will displayed in the interface
- :param url: url to display after receiving this response
- :param ajaxnav:
- :param norefresh: do not refresh the page after receiving this response
- :param template: eventual template's path
- :param kwargs: dict used for template rendering
+def size2integer(value: str, output_unit: str = "B") -> int:
"""
- ctx = {}
- for k, v in list(kwargs.items()):
- ctx[k] = v
- if template is not None:
- content = render_to_string(template, ctx, request)
- elif "content" in kwargs:
- content = kwargs["content"]
- else:
- content = ""
- jsonctx = {"status": status, "content": content}
- if respmsg is not None:
- jsonctx["respmsg"] = respmsg
- if ajaxnav:
- jsonctx["ajaxnav"] = True
- if url is not None:
- jsonctx["url"] = url
- jsonctx["norefresh"] = norefresh
- return JsonResponse(jsonctx)
-
-
-def render_to_json_response(context, **response_kwargs):
- """Simple shortcut to render a JSON response.
-
- :param dict context: response content
- :return: ``HttpResponse`` object
- """
- data = json.dumps(context)
- response_kwargs["content_type"] = "application/json"
- return HttpResponse(data, **response_kwargs)
-
-
-def static_url(path):
- """Returns the correct static url for a given file
-
- :param path: the targeted static media
- """
- if path.startswith("/"):
- path = path[1:]
- return f"{settings.STATIC_URL}{path}"
-
-
-def size2integer(value, output_unit="B"):
- """Try to convert a string representing a size to an integer value
- in bytes or megabytes.
+ Try to convert a string representing a size to an integer value in bytes or megabytes.
Supported formats:
* K|k for KB
@@ -140,73 +38,3 @@ def size2integer(value, output_unit="B"):
else:
raise ValueError(f"Unsupported output unit {output_unit}")
return 0
-
-
-class NavigationParameters:
- """
- Just a simple object to manipulate navigation parameters.
- """
-
- def __init__(self, request, sessionkey):
- self.request = request
- self.sessionkey = sessionkey
- self.parameters = [("pattern", "", True), ("criteria", "from_addr", False)]
-
- def __getitem__(self, key):
- """Retrieve an item."""
- if self.sessionkey not in self.request.session:
- raise KeyError
- return self.request.session[self.sessionkey][key]
-
- def __contains__(self, key):
- """Check if key is present."""
- if self.sessionkey not in self.request.session:
- return False
- return key in self.request.session[self.sessionkey]
-
- def __setitem__(self, key, value):
- """Set a new item."""
- self.request.session[self.sessionkey][key] = value
-
- def _store_page(self):
- """Specific method to store the current page."""
- self["page"] = int(self.request.GET.get("page", 1))
-
- def store(self):
- """Store navigation parameters into session."""
- if self.sessionkey not in self.request.session:
- self.request.session[self.sessionkey] = {}
- self._store_page()
- navparams = self.request.session[self.sessionkey]
- navparams["order"] = self.request.GET.get("sort_order", "-date")
- for param, defvalue, escape in self.parameters:
- value = self.request.GET.get(param, defvalue)
- if value is None:
- if param in navparams:
- del navparams[param]
- continue
- navparams[param] = re.escape(value) if escape else value
- self.request.session.modified = True
-
- def get(self, param, default_value=None):
- """Retrieve a navigation parameter.
-
- Just a simple getter to avoid using the full key name to
- access a parameter.
-
- :param str param: parameter name
- :param defaultvalue: default value if none is found
- :return: parameter's value
- """
- if self.sessionkey not in self.request.session:
- return default_value
- return self.request.session[self.sessionkey].get(param, default_value)
-
- def remove(self, param):
- """Remove a navigation parameter from session.
-
- :param str param: parameter name
- """
- navparams = self.request.session[self.sessionkey]
- if param in navparams:
- del navparams[param]
diff --git a/modoboa/templates/registration/login.html b/modoboa/templates/registration/login.html
index 7d4061731..dddf02825 100644
--- a/modoboa/templates/registration/login.html
+++ b/modoboa/templates/registration/login.html
@@ -1,6 +1,6 @@
{% extends "registration/base.html" %}
-{% load i18n lib_tags form_tags static %}
+{% load i18n form_tags static %}
{% block extra_css %}
diff --git a/modoboa/templates/registration/twofactor_code_verify.html b/modoboa/templates/registration/twofactor_code_verify.html
index 8eab21d6a..df4eec106 100644
--- a/modoboa/templates/registration/twofactor_code_verify.html
+++ b/modoboa/templates/registration/twofactor_code_verify.html
@@ -1,6 +1,6 @@
{% extends "registration/base.html" %}
-{% load i18n core_tags lib_tags form_tags static %}
+{% load i18n core_tags form_tags static %}
{% block extra_css %}
diff --git a/modoboa/transport/templates/transport/_transport_form.html b/modoboa/transport/templates/transport/_transport_form.html
deleted file mode 100644
index 291feb273..000000000
--- a/modoboa/transport/templates/transport/_transport_form.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% load form_tags %}
-
-{% render_field form.service %}
-
- {% for field in form.setting_fields %}
- {% render_field field hidden=True %}
- {% endfor %}
-
diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py
index bdd0dcc51..ba5cd11d7 100644
--- a/test_project/test_project/settings.py
+++ b/test_project/test_project/settings.py
@@ -129,8 +129,6 @@ MIDDLEWARE = (
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"modoboa.core.middleware.LocalConfigMiddleware",
- "modoboa.lib.middleware.AjaxLoginRedirect",
- "modoboa.lib.middleware.CommonExceptionCatcher",
"modoboa.lib.middleware.RequestCatcherMiddleware",
)