mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
Removed useless code
This commit is contained in:
@@ -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',
|
||||
)
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
"""."""
|
||||
|
||||
@@ -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">×</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
@@ -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,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>
|
||||
@@ -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",
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user