diff --git a/tests/test_admin_pages.py b/tests/test_admin_pages.py index 531a851e5..ad28230a3 100644 --- a/tests/test_admin_pages.py +++ b/tests/test_admin_pages.py @@ -4897,6 +4897,12 @@ def test_settings_emails(pub): resp = app.get('/backoffice/settings/emails/') resp = resp.click('General Options') assert 'Warning: all emails are sent to <foo@example.net>' in resp.text + resp.form['from'] = 'test@localhost' + resp = resp.form.submit('submit') + pub.reload_cfg() + assert pub.cfg['emails']['from'] == 'test@localhost' + assert pub.cfg['emails']['well_known_domains'] + assert pub.cfg['emails']['valid_known_domains'] pub.cfg['debug'] = {} pub.write_cfg() diff --git a/tests/test_widgets.py b/tests/test_widgets.py index 45bfb9753..916114bda 100644 --- a/tests/test_widgets.py +++ b/tests/test_widgets.py @@ -5,7 +5,7 @@ import sys import shutil import copy -from quixote import cleanup +from quixote import cleanup, get_response from quixote.http_request import parse_query import mechanize @@ -286,9 +286,12 @@ def test_textwidget(): def test_emailwidget(): + pub.cfg = {'emails': {'check_domain_with_dns': True}} + get_response().javascript_code_parts = [] widget = EmailWidget('test') form = MockHtmlForm(widget) assert 'name="test"' in form.as_html + assert 'WCS_WELL_KNOWN_DOMAINS' in ''.join(get_response().javascript_code_parts) req.form = {} assert widget.parse() is None diff --git a/wcs/qommon/admin/emails.py b/wcs/qommon/admin/emails.py index f1ced55dd..e802dd81a 100644 --- a/wcs/qommon/admin/emails.py +++ b/wcs/qommon/admin/emails.py @@ -116,6 +116,16 @@ class EmailsDirectory(Directory): title = _('Check DNS for domain name'), value = emails.get('check_domain_with_dns', True), hint = _('Use a DNS request to check domain names used in email fields')) + form.add(WidgetList, 'well_known_domains', + title=_('Domains to check for spelling errors'), + element_type=StringWidget, + element_kwargs={'render_br': False}, + value=get_publisher().get_email_well_known_domains()) + form.add(WidgetList, 'valid_known_domains', + title=_('Domains that should not be considered spelling errors'), + element_type=StringWidget, + element_kwargs={'render_br': False}, + value=get_publisher().get_email_valid_known_domains()) form.add_submit('submit', _('Submit')) form.add_submit('cancel', _('Cancel')) @@ -140,7 +150,8 @@ class EmailsDirectory(Directory): else: cfg_submit(form, 'emails', [ 'smtp_server', 'smtp_login', 'smtp_password', 'from', 'reply_to', 'footer', - 'check_domain_with_dns']) + 'check_domain_with_dns', 'well_known_domains', + 'valid_known_domains']) return redirect('.') def _q_index(self): diff --git a/wcs/qommon/form.py b/wcs/qommon/form.py index b66e6aaac..f329b742e 100644 --- a/wcs/qommon/form.py +++ b/wcs/qommon/form.py @@ -898,6 +898,11 @@ class EmailWidget(StringWidget): def add_media(self): get_response().add_javascript(['jquery.js', '../../i18n.js', 'qommon.forms.js']) + get_response().add_javascript_code(''' + const WCS_WELL_KNOWN_DOMAINS = %s; + const WCS_VALID_KNOWN_DOMAINS = %s; + ''' % (json.dumps(get_publisher().get_email_well_known_domains()), + json.dumps(get_publisher().get_email_valid_known_domains()))) def _parse(self, request): StringWidget._parse(self, request) @@ -919,7 +924,7 @@ class EmailWidget(StringWidget): return domain = force_text(domain, 'utf-8', errors='ignore') try: - domain = domain.encode('idna') + domain = force_str(domain.encode('idna')) except UnicodeError: self.error = _('invalid address domain') return diff --git a/wcs/qommon/publisher.py b/wcs/qommon/publisher.py index 19e681ba7..8774743b9 100644 --- a/wcs/qommon/publisher.py +++ b/wcs/qommon/publisher.py @@ -934,6 +934,22 @@ class QommonPublisher(Publisher, object): return [x.strip() for x in modes.split(',')] return ['lazy', 'django-condition'] + def get_email_well_known_domains(self): + emails_cfg = get_cfg('emails', {}) + well_known_domains = emails_cfg.get('well_known_domains') + if not well_known_domains: + well_known_domains = ['gmail.com', 'msn.com', 'hotmail.com', + 'hotmail.fr', 'wanadoo.fr', 'free.fr', 'yahoo.fr', + 'numericable.fr', 'laposte.fr', 'orange.fr', 'yahoo.com'] + return well_known_domains + + def get_email_valid_known_domains(self): + emails_cfg = get_cfg('emails', {}) + valid_known_domains = emails_cfg.get('valid_known_domains') + if not valid_known_domains: + valid_known_domains = ['yopmail.com'] + return valid_known_domains + def get_substitution_variables(self): from . import misc from wcs.variables import LazyDateObject diff --git a/wcs/qommon/static/js/qommon.forms.js b/wcs/qommon/static/js/qommon.forms.js index da1657ed1..847675caa 100644 --- a/wcs/qommon/static/js/qommon.forms.js +++ b/wcs/qommon/static/js/qommon.forms.js @@ -108,11 +108,9 @@ $(function() { }); } // common domains we want to offer suggestions for. - var well_known_domains = ['gmail.com', 'msn.com', 'hotmail.com', 'hotmail.fr', 'wanadoo.fr', - 'free.fr', 'yahoo.fr', 'numericable.fr', 'laposte.fr', 'orange.fr', - 'yahoo.com']; + var well_known_domains = WCS_WELL_KNOWN_DOMAINS; // existing domains we know but don't want to use in suggestion engine. - var known_domains = ['yopmail.com']; + var known_domains = WCS_VALID_KNOWN_DOMAINS; $('input[type=email]').on('change wcs:change', function() { var $email_input = $(this); var val = $email_input.val();