diff --git a/modoboa/postfix_autoreply/api/v2/serializers.py b/modoboa/postfix_autoreply/api/v2/serializers.py index 53956f5b8..5de9f763f 100644 --- a/modoboa/postfix_autoreply/api/v2/serializers.py +++ b/modoboa/postfix_autoreply/api/v2/serializers.py @@ -8,6 +8,21 @@ from rest_framework import serializers from modoboa.postfix_autoreply import models +class PostfixAutoreplySettingsSerializer(serializers.Serializer): + """A serializer for global parameters.""" + + # General + autoreplies_timeout = serializers.IntegerField(default=86400) + default_subject = serializers.CharField(default="I'm off") + default_content = serializers.CharField( + default="""I'm currently off. I'll answer as soon as I come back. + +Best regards, +%(name)s +""" + ) + + class ARMessageSerializer(serializers.ModelSerializer): """A serializer for ARmessage.""" diff --git a/modoboa/postfix_autoreply/app_settings.py b/modoboa/postfix_autoreply/app_settings.py new file mode 100644 index 000000000..a4503e1ff --- /dev/null +++ b/modoboa/postfix_autoreply/app_settings.py @@ -0,0 +1,49 @@ +"""Postfix autoreply forms.""" + +import collections + +from django.utils.translation import gettext_lazy as _ + +POSTFIX_AUTOREPLY_PARAMETERS_STRUCT = collections.OrderedDict( + [ + ( + "general", + { + "label": _("General"), + "params": collections.OrderedDict( + [ + ( + "autoreplies_timeout", + { + "label": _("Automatic reply timeout"), + "help_text": _( + "Timeout in seconds between two auto-replies to the same recipient" + ), + }, + ), + ( + "default_subject", + { + "label": _("Default subject"), + "help_text": _( + "Default subject used when an auto-reply message is created automatically" + ), + }, + ), + ( + "default_content", + { + "label": _("Default subject"), + "help_text": _( + "Default content used when an auto-reply message is created " + "automatically. The '%(name)s' macro will be replaced by the " + "user's full name." + ), + }, + ), + ] + ), + }, + ), + ] +) diff --git a/modoboa/postfix_autoreply/apps.py b/modoboa/postfix_autoreply/apps.py index fa382fc8b..4097127d6 100644 --- a/modoboa/postfix_autoreply/apps.py +++ b/modoboa/postfix_autoreply/apps.py @@ -7,11 +7,22 @@ from django.utils.translation import gettext_lazy def load_settings(): from modoboa.parameters import tools as param_tools from modoboa.postfix_autoreply import forms + from . import app_settings + from .api.v2 import serializers param_tools.registry.add( "global", forms.ParametersForm, gettext_lazy("Automatic replies") ) + param_tools.registry.add2( + "global", + "postfix_autoreply", + gettext_lazy("Automatic replies"), + app_settings.POSTFIX_AUTOREPLY_PARAMETERS_STRUCT, + serializers.PostfixAutoreplySettingsSerializer, + False, + ) + class PostfixAutoreplyConfig(AppConfig): """App configuration.""" diff --git a/modoboa/sievefilters/api/v2/serializers.py b/modoboa/sievefilters/api/v2/serializers.py index 92784eb86..e66472c3f 100644 --- a/modoboa/sievefilters/api/v2/serializers.py +++ b/modoboa/sievefilters/api/v2/serializers.py @@ -10,17 +10,38 @@ from django.utils.translation import gettext as _ from rest_framework import serializers from modoboa.sievefilters import constants, lib +from modoboa.sievefilters.forms import supported_auth_mechs from modoboa.sievefilters.api.v2 import vloaders -class FilterSetSerializer(serializers.Serializer): +class SievefiltersSettingsSerializer(serializers.Serializer): + """A serializer for global parameters.""" + # ManageSieve settings + + server = serializers.CharField(default="127.0.0.1") + port = serializers.IntegerField(default=4190) + starttls = serializers.BooleanField(default=False) + authentication_mech = serializers.ChoiceField( + default="auto", choices=[("auto", _("auto"))] + ) + + # Imap Settings + imap_server = serializers.CharField(default="127.0.0.1") + imap_secured = serializers.BooleanField(default=False) + imap_port = serializers.IntegerField(default=143) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["authentication_mech"].choices = supported_auth_mechs() + + +class FilterSetSerializer(serializers.Serializer): name = serializers.CharField() active = serializers.BooleanField(default=False) class FilterSetContentSerializer(serializers.Serializer): - content = serializers.CharField() def validate_content(self, value: str): @@ -32,20 +53,17 @@ class FilterSetContentSerializer(serializers.Serializer): class ConditionSerializer(serializers.Serializer): - name = serializers.CharField() operator = serializers.CharField() value = serializers.CharField() class ActionSerializer(serializers.Serializer): - name = serializers.CharField() args = serializers.DictField(child=serializers.CharField()) class FilterSerializer(serializers.Serializer): - name = serializers.CharField() enabled = serializers.BooleanField(default=True) match_type = serializers.ChoiceField(choices=constants.MATCH_TYPES) @@ -134,21 +152,18 @@ class FilterSerializer(serializers.Serializer): class OperatorSerializer(serializers.Serializer): - name = serializers.CharField() label = serializers.CharField() type = serializers.CharField() class ConditionTemplateSerializer(serializers.Serializer): - name = serializers.CharField() label = serializers.CharField() operators = OperatorSerializer(many=True) class ActionArgumentSerializer(serializers.Serializer): - name = serializers.CharField() type = serializers.CharField() label = serializers.CharField(required=False) @@ -163,7 +178,6 @@ class ActionArgumentSerializer(serializers.Serializer): class ActionTemplateSerializer(serializers.Serializer): - name = serializers.CharField() label = serializers.CharField() args = ActionArgumentSerializer(many=True, required=False) diff --git a/modoboa/sievefilters/app_settings.py b/modoboa/sievefilters/app_settings.py new file mode 100644 index 000000000..339252e44 --- /dev/null +++ b/modoboa/sievefilters/app_settings.py @@ -0,0 +1,83 @@ +"""Sieve filters forms.""" + +import collections + +from django.utils.translation import gettext_lazy as _ + +SIEVEFILTERS_PARAMETERS_STRUCT = collections.OrderedDict( + [ + ( + "manage_sieve_settings", + { + "label": _("ManageSieve settings"), + "params": collections.OrderedDict( + [ + ( + "server", + { + "label": _("Server address"), + "help_text": _("Address of your MANAGESIEVE server"), + }, + ), + ( + "port", + { + "label": _("Server port"), + "help_text": _( + "Listening port of your MANAGESIEVE server" + ), + }, + ), + ( + "starttls", + { + "label": _("Connect using STARTTLS"), + "help_text": _("Use the STARTTLS extension"), + }, + ), + ( + "authentication_mech", + { + "label": _("Authentication mechanism"), + "help_text": _("Prefered authentication mechanism"), + }, + ), + ] + ), + }, + ), + ( + "imap_settings", + { + "label": _("IMAP settings"), + "params": collections.OrderedDict( + [ + ( + "imap_server", + { + "label": _("Server address"), + "help_text": _("Address of your IMAP server"), + }, + ), + ( + "imap_secured", + { + "label": _("Use a secured connection"), + "help_text": _( + "Use a secured connection to access IMAP server" + ), + }, + ), + ( + "imap_port", + { + "label": _("Server port"), + "help_text": _("Listening port of your IMAP server"), + }, + ), + ] + ), + }, + ), + ] +) diff --git a/modoboa/sievefilters/apps.py b/modoboa/sievefilters/apps.py index 13629688a..163cbbb1c 100644 --- a/modoboa/sievefilters/apps.py +++ b/modoboa/sievefilters/apps.py @@ -7,10 +7,23 @@ from django.utils.translation import gettext_lazy def load_settings(): from modoboa.parameters import tools as param_tools from modoboa.sievefilters import forms + from . import app_settings + from .api.v2 import serializers + # Admin parameters param_tools.registry.add( "global", forms.ParametersForm, gettext_lazy("Sieve filters") ) + param_tools.registry.add2( + "global", + "sievefilters", + gettext_lazy("Sieve filters"), + app_settings.SIEVEFILTERS_PARAMETERS_STRUCT, + serializers.SievefiltersSettingsSerializer, + False, + ) + + # User parameters param_tools.registry.add( "user", forms.UserSettings, gettext_lazy("Message filters") )