Search for emails or texts, depending on term

The caseworking view is going to have a page which displays emails and
text messages combined together.

In order for the search to work on this page the user needs to be able
to search for an email or a text message. This commit makes it guess
what to search for when the `notification_type` isn’t known (basically
by saying ‘if the search term is only digits they’re probably looking
searching by phone number’).
This commit is contained in:
Chris Hill-Scott
2018-06-13 16:04:49 +01:00
parent 6d91867dcf
commit 27faf7912b
2 changed files with 32 additions and 6 deletions

View File

@@ -1,4 +1,5 @@
import functools import functools
import string
from datetime import ( from datetime import (
datetime, datetime,
timedelta, timedelta,
@@ -425,7 +426,10 @@ def dao_update_notifications_by_reference(references, update_dict):
@statsd(namespace="dao") @statsd(namespace="dao")
def dao_get_notifications_by_to_field(service_id, search_term, notification_type, statuses=None): def dao_get_notifications_by_to_field(service_id, search_term, notification_type=None, statuses=None):
if notification_type is None:
notification_type = guess_notification_type(search_term)
if notification_type == SMS_TYPE: if notification_type == SMS_TYPE:
normalised = try_validate_and_format_phone_number(search_term) normalised = try_validate_and_format_phone_number(search_term)
@@ -440,6 +444,7 @@ def dao_get_notifications_by_to_field(service_id, search_term, notification_type
normalised = validate_and_format_email_address(search_term) normalised = validate_and_format_email_address(search_term)
except InvalidEmailError: except InvalidEmailError:
normalised = search_term.lower() normalised = search_term.lower()
else: else:
raise InvalidRequest("Only email and SMS can use search by recipient", 400) raise InvalidRequest("Only email and SMS can use search by recipient", 400)
@@ -597,3 +602,10 @@ def notifications_not_yet_sent(should_be_sending_after_seconds, notification_typ
Notification.status == NOTIFICATION_CREATED Notification.status == NOTIFICATION_CREATED
).all() ).all()
return notifications return notifications
def guess_notification_type(search_term):
if set(search_term) & set(string.ascii_letters + '@'):
return EMAIL_TYPE
else:
return SMS_TYPE

View File

@@ -1553,20 +1553,34 @@ def test_dao_get_notifications_by_to_field_search_ignores_spaces(sample_template
assert notification3.id in notification_ids assert notification3.id in notification_ids
def test_dao_get_notifications_by_to_field_only_searches_for_notification_type( @pytest.mark.parametrize('phone_search', (
notify_db_session '077', '7-7', '+44(0)7711 111111'
))
@pytest.mark.parametrize('email_search', (
'example', 'eXaMpLe',
))
def test_dao_get_notifications_by_to_field_only_searches_one_notification_type(
notify_db_session,
phone_search,
email_search,
): ):
service = create_service() service = create_service()
sms_template = create_template(service=service) sms_template = create_template(service=service)
email_template = create_template(service=service, template_type='email') email_template = create_template(service=service, template_type='email')
sms = create_notification(template=sms_template, to_field='0771111111', normalised_to='0771111111') sms = create_notification(template=sms_template, to_field='07711111111', normalised_to='447711111111')
email = create_notification( email = create_notification(
template=email_template, to_field='077@example.com', normalised_to='077@example.com' template=email_template, to_field='077@example.com', normalised_to='077@example.com'
) )
results = dao_get_notifications_by_to_field(service.id, "077", notification_type='sms') results = dao_get_notifications_by_to_field(service.id, phone_search, notification_type='sms')
assert len(results) == 1 assert len(results) == 1
assert results[0].id == sms.id assert results[0].id == sms.id
results = dao_get_notifications_by_to_field(service.id, "077", notification_type='email') results = dao_get_notifications_by_to_field(service.id, phone_search) # should assume SMS
assert len(results) == 1
assert results[0].id == sms.id
results = dao_get_notifications_by_to_field(service.id, '077', notification_type='email')
assert len(results) == 1
assert results[0].id == email.id
results = dao_get_notifications_by_to_field(service.id, email_search) # should assume email
assert len(results) == 1 assert len(results) == 1
assert results[0].id == email.id assert results[0].id == email.id