emails: allow configuring known/valid domains for typo fixes (#44663)

This commit is contained in:
Frédéric Péters 2020-07-03 08:04:21 +02:00
parent c81b3b1fb2
commit a95f583c3e
6 changed files with 46 additions and 7 deletions

View File

@ -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()

View File

@ -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

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -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();