From 17fc9db554eb995b777af144a17988ef294e5ac6 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 8 Jun 2025 09:56:38 +0200 Subject: [PATCH] Removed useless code --- modoboa/admin/models/domain.py | 36 ---- .../templates/modoboa_contacts/index.html | 30 --- .../core/commands/templates/settings.py.tpl | 2 - modoboa/lib/middleware.py | 35 ---- modoboa/lib/templatetags/form_tags.py | 32 ---- modoboa/lib/templatetags/lib_tags.py | 122 ------------ modoboa/lib/web_utils.py | 178 +----------------- modoboa/templates/registration/login.html | 2 +- .../registration/twofactor_code_verify.html | 2 +- .../templates/transport/_transport_form.html | 8 - test_project/test_project/settings.py | 2 - 11 files changed, 5 insertions(+), 444 deletions(-) delete mode 100644 modoboa/contacts/templates/modoboa_contacts/index.html delete mode 100644 modoboa/lib/templatetags/lib_tags.py delete mode 100644 modoboa/transport/templates/transport/_transport_form.html 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( - """""" - ) # 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( - """
-{% csrf_token %} -{% if link.img %}{% endif %}{{ link.label }} -
""" - ) - 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", )