Projet

Général

Profil

0001-emails-allow-user-to-define-email-sender-name-44411.patch

Nicolas Roche, 29 juin 2020 12:16

Télécharger (8,67 ko)

Voir les différences:

Subject: [PATCH] emails: allow user to define email sender name (#44411)

 hobo/emails/forms.py                 |  2 ++
 hobo/emails/views.py                 |  2 +-
 hobo/environment/models.py           |  1 +
 hobo/multitenant/settings_loaders.py |  5 ++--
 tests/test_emails.py                 |  5 ++--
 tests/test_settings_loaders.py       | 34 +++++++++++++++++++++++++++-
 6 files changed, 43 insertions(+), 6 deletions(-)
hobo/emails/forms.py
24 24
    def validate(self, value):
25 25
        validate_email(value)
26 26
        validate_email_address(value)
27 27
        validate_email_spf(value)
28 28

  
29 29

  
30 30
class EmailsForm(forms.Form):
31 31
    default_from_email = ValidEmailField(label=_('Default From'))
32
    email_sender_name = forms.CharField(label=_('Sender Name'), required=False,
33
            help_text=_('(defaults to plateform title)'))
32 34
    global_email_prefix = forms.CharField(label=_('Prefix'), required=False,
33 35
            help_text=_('Custom prefix for emails subject (defaults to plateform title)'))
34 36
    email_signature = forms.CharField(label=_('Signature'), required=False,
35 37
            widget=forms.Textarea)
36 38

  
37 39
    def __init__(self, *args, **kwargs):
38 40
        super(EmailsForm, self).__init__(*args, **kwargs)
39 41
        self.fields['email_signature'].widget.attrs = {'rows': 4, 'cols': 80}
hobo/emails/views.py
19 19
from django.views.generic import TemplateView
20 20

  
21 21
from hobo.environment.forms import VariablesFormMixin
22 22
from .forms import EmailsForm
23 23

  
24 24

  
25 25
class HomeView(VariablesFormMixin, TemplateView):
26 26
    template_name = 'hobo/emails_home.html'
27
    variables = ['default_from_email', 'global_email_prefix', 'email_signature']
27
    variables = ['default_from_email', 'email_sender_name', 'global_email_prefix', 'email_signature']
28 28
    form_class = EmailsForm
29 29
    success_message = _('Emails settings have been updated. '
30 30
                        'It will take a few seconds to be effective.')
31 31

  
32 32
home = HomeView.as_view()
hobo/environment/models.py
42 42
SECRET_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
43 43
FLOAT_RE = re.compile(r'^\s*[0-9]+\.[0-9]+\s*')
44 44

  
45 45

  
46 46
AUTO_VARIABLES = (
47 47
        'default_from_email',
48 48
        'global_email_prefix',
49 49
        'email_signature',
50
        'email_sender_name',
50 51
        'global_title',
51 52
        'robots_txt',
52 53
        'meta_description',
53 54
        'meta_keywords',
54 55
)
55 56

  
56 57
class Variable(models.Model):
57 58
    name = models.CharField(max_length=100, verbose_name=_('name'))
hobo/multitenant/settings_loaders.py
178 178
            tenant_settings.TEMPLATE_VARS = {}
179 179

  
180 180
        for key, value in variables.items():
181 181
            # prevent mixing settings and template vars
182 182
            if not key.startswith(SETTING_PREFIX):
183 183
                tenant_settings.TEMPLATE_VARS[key] = value
184 184

  
185 185
        if variables.get('default_from_email'):
186
            if variables.get('global_title'):
186
            from_label = variables.get('email_sender_name') or variables.get('global_title')
187
            if from_label:
187 188
                tenant_settings.DEFAULT_FROM_EMAIL = '"%s" <%s>' % (
188
                        variables['global_title'].replace('"', ' '), variables['default_from_email'])
189
                        from_label.replace('"', ' '), variables['default_from_email'])
189 190
            else:
190 191
                tenant_settings.DEFAULT_FROM_EMAIL = variables['default_from_email']
191 192

  
192 193
        tenant_settings.USER_PROFILE_CONFIG = hobo_json.get('profile')
193 194

  
194 195

  
195 196
class SettingsVars(SettingsDictUpdateMixin, FileBaseSettingsLoader):
196 197
    FILENAME = 'hobo.json'
tests/test_emails.py
174 174
def test_no_spf_validation(client, admin_user, dns_resolver, smtp_server, settings):
175 175
    settings.ALLOWED_SPF_RECORDS = []
176 176
    client.post('/login/', {'username': 'admin', 'password': 'password'})
177 177
    response = client.post('/emails/', {'default_from_email': 'john.doe@example-invalid-spf.com'}, follow=True)
178 178
    assert response.status_code == 200
179 179
    assert 'Emails settings have been updated. It will take a few seconds to be effective.' in force_text(response.content)
180 180

  
181 181

  
182
def test_emails_view(app, admin_user, dns_resolver, smtp_server, settings):
183
    settings.ALLOWED_SPF_RECORDS = ['include:allowed_mx.com']
182
def test_emails_view(app, admin_user, dns_resolver, smtp_server):
184 183
    app = login(app)
185 184
    resp = app.get('/emails/')
186 185
    resp.form['default_from_email'] = 'john.doe@example.com'
187 186
    resp.form['email_signature'] = 'my signature'
188 187
    resp.form['global_email_prefix'] = 'my prefix'
188
    resp.form['email_sender_name'] = 'my name'
189 189
    resp = resp.form.submit()
190 190
    assert Variable.objects.filter(name='default_from_email')[0].value == 'john.doe@example.com'
191 191
    assert Variable.objects.filter(name='email_signature')[0].value == 'my signature'
192 192
    assert Variable.objects.filter(name='global_email_prefix')[0].value == 'my prefix'
193
    assert Variable.objects.filter(name='email_sender_name')[0].value == 'my name'
tests/test_settings_loaders.py
2 2
import os
3 3
import pytest
4 4

  
5 5
from django.conf import UserSettingsHolder
6 6

  
7 7
from hobo.deploy.utils import get_hobo_json
8 8
from hobo.environment.models import Authentic, Combo
9 9
from hobo.multitenant.settings_loaders import Authentic as AuthenticLoader
10
from hobo.multitenant.settings_loaders import BackofficeLoginHint
10
from hobo.multitenant.settings_loaders import BackofficeLoginHint, TemplateVars
11 11
from hobo.profile.models import AttributeDefinition
12 12

  
13 13
pytestmark = pytest.mark.django_db
14 14

  
15 15

  
16 16
def test_authentic_update_settings_from_path(tmpdir):
17 17
    a = Authentic(title='bar', slug='bar', base_url='http://bar.example.net')
18 18
    a.save()
......
93 93

  
94 94
    # call settings loaders
95 95
    tenant_settings = UserSettingsHolder({})
96 96
    assert not getattr(tenant_settings, 'MELLON_LOGIN_HINTS', False)
97 97

  
98 98
    loader = BackofficeLoginHint()
99 99
    loader.update_settings_from_path(tenant_settings, path)
100 100
    assert tenant_settings.MELLON_LOGIN_HINTS == ['always_backoffice']
101

  
102

  
103
def test_email_update_settings_from_path(tmpdir):
104
    tenant_settings = UserSettingsHolder({})
105
    loader = TemplateVars()
106

  
107
    def update_settings(env):
108
        path = os.path.join(str(tmpdir), 'hobo.json')
109
        json.dump(env, open(path, 'w'))
110
        loader.update_settings_from_path(tenant_settings, path)
111

  
112
    tenant_settings.DEFAULT_FROM_EMAIL = 'webmaster@hobo.example.org'
113
    env = {'services': [], 'variables': {}}
114
    update_settings(env)
115
    assert tenant_settings.DEFAULT_FROM_EMAIL == 'webmaster@hobo.example.org'
116
    env['variables']['default_from_email'] = 'john.doe@example.com'
117
    update_settings(env)
118
    assert tenant_settings.DEFAULT_FROM_EMAIL == 'john.doe@example.com'
119
    env['variables']['global_title'] = 'Publik'
120
    update_settings(env)
121
    assert tenant_settings.DEFAULT_FROM_EMAIL == '"Publik" <john.doe@example.com>'
122
    env['variables']['email_sender_name'] = 'Jhon Doe'
123
    update_settings(env)
124
    assert tenant_settings.DEFAULT_FROM_EMAIL == '"Jhon Doe" <john.doe@example.com>'
125
    env['variables']['default_from_email'] = 'foo@example.com'
126
    update_settings(env)
127
    assert tenant_settings.DEFAULT_FROM_EMAIL == '"Jhon Doe" <foo@example.com>'
128

  
129
    # default_from_email needed for '"foo" <bar.example.com>' address format
130
    tenant_settings.DEFAULT_FROM_EMAIL = '<webmaster@hobo.example.org>'
131
    update_settings({'services': [], 'variables': {'global_title': 'Publik'}})
132
    assert tenant_settings.DEFAULT_FROM_EMAIL == '<webmaster@hobo.example.org>'
101
-