newsletters: send user mobile phone when available (#20098)

This commit is contained in:
Serghei Mihai 2017-11-15 18:30:27 +01:00
parent 8e1373022f
commit c09f344d35
4 changed files with 48 additions and 7 deletions

View File

@ -23,7 +23,8 @@ from django.utils.translation import ugettext_lazy as _
class NewslettersManageForm(forms.Form):
def __init__(self, *args, **kwargs):
logger = logging.getLogger(__name__)
self.user = kwargs.pop('user')
self.request = kwargs.pop('request')
self.user = self.request.user
self.instance = kwargs.pop('instance')
self.themes = set()
super(NewslettersManageForm, self).__init__(*args, **kwargs)
@ -39,6 +40,10 @@ class NewslettersManageForm(forms.Form):
self.params = {'email': self.user.email}
if hasattr(self.user, 'saml_identifiers') and self.user.saml_identifiers.exists():
self.params['uuid'] = self.user.saml_identifiers.first().name_id
# get mobile number from mellon session as it is not user attribute
if self.request.session.get('mellon_session'):
self.params['mobile'] = self.request.session['mellon_session'].get('mobile', '')
try:
subscriptions = self.instance.get_subscriptions(**self.params)
except Exception, e:

View File

@ -139,6 +139,9 @@ class NewslettersCell(CellBase):
def set_subscriptions(self, subscriptions, **kwargs):
logger = logging.getLogger(__name__)
# uuid is mandatory to store subscriptions
if 'uuid' not in kwargs:
raise SubscriptionsSaveError
headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
url = get_templated_url(self.url)
try:
@ -160,7 +163,7 @@ class NewslettersCell(CellBase):
def render(self, context):
user = context.get('user')
if user and user.is_authenticated():
form = NewslettersManageForm(instance=self, user=user)
form = NewslettersManageForm(instance=self, request=context['request'])
context['form'] = form
return super(NewslettersCell, self).render(context)

View File

@ -37,7 +37,7 @@ class NewslettersView(FormView):
def get_form_kwargs(self):
kwargs = super(NewslettersView, self).get_form_kwargs()
self.instance = NewslettersCell.objects.get(pk=self.kwargs['pk'])
kwargs.update({'user': self.request.user, 'instance': self.instance})
kwargs.update({'request': self.request, 'instance': self.instance})
return kwargs
def form_invalid(self, form):

View File

@ -4,7 +4,6 @@ import pytest
import mock
import requests
from django.contrib.auth.models import User
from django.template.defaultfilters import slugify
from combo.data.models import Page
@ -152,6 +151,18 @@ def test_failed_set_subscriptions(mock_post, cell):
with pytest.raises(SubscriptionsSaveError):
cell.set_subscriptions(subscriptions, email=USER_EMAIL)
@mock.patch('combo.apps.newsletters.models.requests.post')
def test_set_subscriptions_with_no_uuid(mocked_post, cell):
restrictions = ('sms', 'mail')
cell.transports_restrictions = ','.join(restrictions)
subscriptions = [{'id': '1', 'transports': [{'id': 'mail', 'text': 'mail'}]},
{'id': '8', 'transports': [{'id': 'sms', 'text': 'sms'},
{'id': 'mail', 'text': 'mail'}]}]
mock_json = mock.Mock()
mock_json.json.return_value = {'err': 0, 'data': True}
with pytest.raises(SubscriptionsSaveError):
cell.set_subscriptions(subscriptions)
@mock.patch('combo.apps.newsletters.models.requests.post')
def test_set_subscriptions(mock_post, cell):
restrictions = ('sms', 'mail')
@ -164,7 +175,28 @@ def test_set_subscriptions(mock_post, cell):
mock_json.json.return_value = {'err': 0,
'data': True}
mock_post.return_value = mock_json
cell.set_subscriptions(subscriptions, email=USER_EMAIL)
cell.set_subscriptions(subscriptions, uuid='useruuid', email=USER_EMAIL)
assert 'uuid=useruuid' in mock_post.call_args[0][0]
@mock.patch('combo.apps.newsletters.models.requests.get')
def test_get_subscriptions_with_name_id_and_mobile(mock_get, cell):
restrictions = ('sms', 'mail')
cell.transports_restrictions = ','.join(restrictions)
mock_json = mock.Mock()
mock_json.json.return_value = {'err': 0,
'data': NEWSLETTERS}
mock_get.return_value = mock_json
fake_saml_request = mock.Mock()
fake_saml_request.user = mock.Mock(email=USER_EMAIL)
fake_saml_request.user.saml_identifiers = mock.Mock()
fake_saml_request.user.saml_identifiers.exists.return_value = True
fake_saml_request.user.saml_identifiers.first.return_value = mock.Mock(name_id='nameid')
fake_saml_request.session = {'mellon_session': {'mobile': '0607080900'}}
form = NewslettersManageForm(instance=cell, request=fake_saml_request)
assert 'uuid=nameid' in mock_get.call_args[0][0]
assert 'mobile=0607080900' in mock_get.call_args[0][0]
def mocked_requests_get(*args, **kwargs):
url = args[0]
@ -190,8 +222,9 @@ def test_subscriptions_form(mock_get, cell):
cell.transports_restrictions = ','.join(restrictions)
newsletters = [n['id'] for n in cell.get_newsletters()]
subscriptions = [s['id'] for s in cell.get_subscriptions()]
form = NewslettersManageForm(instance=cell,
user=User(email=USER_EMAIL))
fake_request = mock.Mock(user=mock.Mock(username='username', email=USER_EMAIL),
session={})
form = NewslettersManageForm(instance=cell, request=fake_request)
# test if all newsletters are present
for f_id, field in form.fields.iteritems():
assert f_id in newsletters