From ad7a67da2b8d7c94613e60e5a78f28219e8f1a86 Mon Sep 17 00:00:00 2001 From: Nimisha Asthagiri Date: Thu, 18 Dec 2014 14:21:14 -0500 Subject: [PATCH 1/2] Update segment.io shim for mobile event syntax change. --- common/djangoapps/track/views/segmentio.py | 11 ++++++++++- .../track/views/tests/test_segmentio.py | 16 +++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/common/djangoapps/track/views/segmentio.py b/common/djangoapps/track/views/segmentio.py index 6221064e16..ea65e6a169 100644 --- a/common/djangoapps/track/views/segmentio.py +++ b/common/djangoapps/track/views/segmentio.py @@ -157,6 +157,15 @@ def track_segmentio_event(request): # pylint: disable=too-many-statements ): raise EventValidationError(WARNING_IGNORED_TYPE) + # create and populate application field if it doesn't exist + app_context = segment_properties.get('context', {}) + if 'application' not in app_context: + context['application'] = { + 'name': app_context.get('app_name', ''), + 'version': '' if not segment_context else segment_context.get('app', {}).get('version', '') + } + app_context.pop('app_name', None) + if segment_context: # copy the entire segment's context dict as a sub-field of our custom context dict context['client'] = dict(segment_context) @@ -168,7 +177,7 @@ def track_segmentio_event(request): # pylint: disable=too-many-statements del context['client'][field] # Overlay any context provided in the properties - context.update(segment_properties.get('context', {})) + context.update(app_context) user_id = full_segment_event.get('userId') if not user_id: diff --git a/common/djangoapps/track/views/tests/test_segmentio.py b/common/djangoapps/track/views/tests/test_segmentio.py index 7f90be0e09..78ffc0eb18 100644 --- a/common/djangoapps/track/views/tests/test_segmentio.py +++ b/common/djangoapps/track/views/tests/test_segmentio.py @@ -122,6 +122,7 @@ class SegmentIOTrackingTestCase(EventTrackingTestCase): 'data': kwargs.get('data', {}), 'context': { 'course_id': kwargs.get('course_id') or '', + 'app_name': 'edx.mobile.android', } }, "channel": 'server', @@ -130,6 +131,9 @@ class SegmentIOTrackingTestCase(EventTrackingTestCase): "name": kwargs.get('library_name', 'test-app'), "version": "unknown" }, + "app": { + "version": "1.0.1", + }, 'userAgent': str(sentinel.user_agent), }, "receivedAt": "2014-08-27T16:33:39.100Z", @@ -197,6 +201,10 @@ class SegmentIOTrackingTestCase(EventTrackingTestCase): 'time': datetime.strptime("2014-08-27T16:33:39.215Z", "%Y-%m-%dT%H:%M:%S.%fZ"), 'host': 'testserver', 'context': { + 'application': { + 'name': 'edx.mobile.android', + 'version': '1.0.1', + }, 'user_id': USER_ID, 'course_id': course_id, 'org_id': 'foo', @@ -205,7 +213,10 @@ class SegmentIOTrackingTestCase(EventTrackingTestCase): 'library': { 'name': 'test-app', 'version': 'unknown' - } + }, + 'app': { + 'version': '1.0.1', + }, }, 'received_at': datetime.strptime("2014-08-27T16:33:39.100Z", "%Y-%m-%dT%H:%M:%S.%fZ"), }, @@ -361,6 +372,9 @@ class SegmentIOTrackingTestCase(EventTrackingTestCase): 'name': 'test-app', 'version': 'unknown' }, + 'app': { + 'version': '1.0.1', + }, }, 'application': { 'name': 'edx.mobileapp.android', From 30549bd7adce47a12f327d30e9e0e59f5318ead0 Mon Sep 17 00:00:00 2001 From: Will Daly Date: Mon, 22 Dec 2014 09:39:16 -0500 Subject: [PATCH 2/2] Send the user to the login page if registering with a linked but inactive account --- common/djangoapps/third_party_auth/pipeline.py | 9 +++++++++ .../third_party_auth/tests/specs/base.py | 14 +++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/common/djangoapps/third_party_auth/pipeline.py b/common/djangoapps/third_party_auth/pipeline.py index 0a54701fbd..e46e34c994 100644 --- a/common/djangoapps/third_party_auth/pipeline.py +++ b/common/djangoapps/third_party_auth/pipeline.py @@ -536,6 +536,15 @@ def ensure_user_information( if is_register_2 and user_unset: return redirect(_create_redirect_url(AUTH_DISPATCH_URLS[AUTH_ENTRY_REGISTER_2], strategy)) + # If the user has a linked account, but has not yet activated + # we should send them to the login page. The login page + # will tell them that they need to activate their account. + if is_register and user_inactive: + return redirect(_create_redirect_url(AUTH_DISPATCH_URLS[AUTH_ENTRY_LOGIN], strategy)) + + if is_register_2 and user_inactive: + return redirect(_create_redirect_url(AUTH_DISPATCH_URLS[AUTH_ENTRY_LOGIN_2], strategy)) + def _create_redirect_url(url, strategy): """ Given a URL and a Strategy, construct the appropriate redirect URL. diff --git a/common/djangoapps/third_party_auth/tests/specs/base.py b/common/djangoapps/third_party_auth/tests/specs/base.py index 3c34754931..65eae44103 100644 --- a/common/djangoapps/third_party_auth/tests/specs/base.py +++ b/common/djangoapps/third_party_auth/tests/specs/base.py @@ -689,7 +689,19 @@ class IntegrationTest(testutil.TestCase, test.TestCase): # social auth. self.assert_social_auth_does_not_exist_for_user(created_user, strategy) - # We should be redirected back to the complete page, setting + # Since the user's account is not yet active, we should be redirected to /login + self.assert_redirect_to_login_looks_correct( + actions.do_complete( + request.social_strategy, social_views._do_login, request.user, None, # pylint: disable-msg=protected-access + redirect_field_name=auth.REDIRECT_FIELD_NAME + ) + ) + + # Activate the user's account + strategy.request.user.is_active = True + strategy.request.user.save() + + # Try again. This time, we should be redirected back to the complete page, setting # the "logged in" cookie for the marketing site. self.assert_logged_in_cookie_redirect(actions.do_complete( request.social_strategy, social_views._do_login, request.user, None, # pylint: disable-msg=protected-access