Removed useless code

This commit is contained in:
Antoine Nguyen
2025-06-08 15:12:49 +02:00
parent 3b83f52ffa
commit 17fc9db554
11 changed files with 5 additions and 444 deletions
-36
View File
@@ -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.
@@ -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 %}
<script>
window.userProfile = {
abookSynced: {% if abook_synced %}true{% else %}false{% endif %}
};
</script>
{% endif %}
{% render_bundle 'app' 'js' 'CONTACTS' %}
{% endblock %}
{% block container_content %}
<div id="app">
</div>
{% endblock %}
@@ -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',
)
-35
View File
@@ -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):
-32
View File
@@ -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):
"""."""
-122
View File
@@ -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(
"""<div class="alert alert-{{ type }}" role="alert">
<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
{{ msg }}
</div>"""
) # NOQA:E501
return t.render(Context({"type": typ, "msg": msg}))
@register.simple_tag
def render_link(linkdef, mdclass=""):
t = Template(
"""<a href="{{ link.url }}" name="{{ link.name }}" title="{{ link.title }}"
{% if link.modal %}data-toggle="ajaxmodal{% if link.autowidth %}-autowidth{% endif %}"{% endif %}
{% if link.modalcb %}modalcb="{{ link.modalcb }}"{% endif %}
{% if link.closecb %}closecb="{{ link.closecb }}"{% endif %}
class="{{ mdclass }}{% if link.class %} {{ link.class }}{% endif %}"
{% if link.confirm %} onclick="return confirm('{{ link.confirm }}')"{% endif %}
{% for attr, value in link.extra_attributes.items %} {{ attr }}="{{ value }}"{% endfor %}
>
{% if link.img %}<i class="{{ link.img }}"></i>{% endif %}
{{ link.label }}</a>"""
) # NOQA:E501
return t.render(Context({"link": linkdef, "mdclass": mdclass}))
@register.simple_tag
def render_post_link(linkdef, request):
t = Template(
"""<form method="post" action="{{ link.url }}">
{% csrf_token %}
<a class="menu-link" href="#" onclick="this.parentNode.submit()">{% if link.img %}<i class="{{ link.img }}"></i>{% endif %}{{ link.label }}</a>
</form>"""
)
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 %}
<span class="label label-{% if tag.color %}{{ tag.color }}{% else %}default{% endif %}">
<a href="#" class="filter {{ tag.type }}" name="{{ tag.name }}">{{ tag.label }}</a>
</span>
{% 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)
+3 -175
View File
@@ -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]
+1 -1
View File
@@ -1,6 +1,6 @@
{% extends "registration/base.html" %}
{% load i18n lib_tags form_tags static %}
{% load i18n form_tags static %}
{% block extra_css %}
<link rel="stylesheet" type="text/css" href="{% static 'css/login.css' %}" />
@@ -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 %}
<link rel="stylesheet" type="text/css" href="{% static 'css/login.css' %}" />
@@ -1,8 +0,0 @@
{% load form_tags %}
{% render_field form.service %}
<div id="backend_settings">
{% for field in form.setting_fields %}
{% render_field field hidden=True %}
{% endfor %}
</div>
-2
View File
@@ -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",
)