0001-emails-allow-user-to-define-email-sender-name-44411.patch
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/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 |
- |