From c09f344d35b1729787b696c18073a0fb6dc5b2d2 Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Wed, 15 Nov 2017 18:30:27 +0100 Subject: [PATCH] newsletters: send user mobile phone when available (#20098) --- combo/apps/newsletters/forms.py | 7 +++++- combo/apps/newsletters/models.py | 5 +++- combo/apps/newsletters/views.py | 2 +- tests/test_newsletters_cell.py | 41 ++++++++++++++++++++++++++++---- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/combo/apps/newsletters/forms.py b/combo/apps/newsletters/forms.py index 082b0408..440a38cf 100644 --- a/combo/apps/newsletters/forms.py +++ b/combo/apps/newsletters/forms.py @@ -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: diff --git a/combo/apps/newsletters/models.py b/combo/apps/newsletters/models.py index 7831a1bb..22b0349f 100644 --- a/combo/apps/newsletters/models.py +++ b/combo/apps/newsletters/models.py @@ -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) diff --git a/combo/apps/newsletters/views.py b/combo/apps/newsletters/views.py index d3653794..0e6db553 100644 --- a/combo/apps/newsletters/views.py +++ b/combo/apps/newsletters/views.py @@ -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): diff --git a/tests/test_newsletters_cell.py b/tests/test_newsletters_cell.py index d1ae9cb8..9f3857bf 100644 --- a/tests/test_newsletters_cell.py +++ b/tests/test_newsletters_cell.py @@ -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