diff --git a/news/tasks.py b/news/tasks.py index a650656..4855ec3 100644 --- a/news/tasks.py +++ b/news/tasks.py @@ -199,6 +199,22 @@ def get_external_user_data(email=None, token=None, fields=None, database=None): return user_data +@et_task +def add_fxa_activity(data): + record = { + 'FXA_ID': data['fxa_id'], + 'LOGIN_DATE': gmttime(), + 'FIRST_DEVICE': 'y' if data['first_device'] else 'n', + } + # now do magic to parse the UA string. + # good deps I've found for this: + # * https://pypi.python.org/pypi/user-agents # depends on ua-parser + # * https://pypi.python.org/pypi/ua-parser + # doesn't seem either of those support py2.6 :( + + apply_updates('Sync_Device_Logins', record) + + @et_task def update_fxa_info(email, lang, fxa_id, source_url=None, skip_welcome=False): user = get_external_user_data(email=email) diff --git a/news/urls.py b/news/urls.py index 0d0a2ee..e463977 100644 --- a/news/urls.py +++ b/news/urls.py @@ -2,14 +2,15 @@ from .views import (confirm, custom_unsub_reason, custom_update_phonebook, custom_update_student_ambassadors, debug_user, - fxa_register, get_involved, list_newsletters, lookup_user, newsletters, - send_recovery_message, subscribe, subscribe_sms, + fxa_activity, fxa_register, get_involved, list_newsletters, lookup_user, + newsletters, send_recovery_message, subscribe, subscribe_sms, unsubscribe, user) urlpatterns = patterns('', # noqa url('^get-involved/$', get_involved), url('^fxa-register/$', fxa_register), + url('^fxa-activity/$', fxa_activity), url('^subscribe/$', subscribe), url('^subscribe_sms/$', subscribe_sms), url('^unsubscribe/(.*)/$', unsubscribe), diff --git a/news/views.py b/news/views.py index 5a68cac..21467b1 100644 --- a/news/views.py +++ b/news/views.py @@ -1,3 +1,4 @@ +import json import re from django.conf import settings @@ -17,6 +18,7 @@ from news.models import Newsletter, Subscriber, Interest from news.newsletters import get_sms_messages, newsletter_slugs from news.tasks import ( + add_fxa_activity, add_sms_user, confirm_user, send_recovery_message_task, @@ -97,6 +99,34 @@ def confirm(request, token): return HttpResponseJSON({'status': 'ok'}) +@require_POST +@csrf_exempt +def fxa_activity(request): + if not request.is_secure(): + return HttpResponseJSON({ + 'status': 'error', + 'desc': 'fxa-activity requires SSL', + 'code': errors.BASKET_SSL_REQUIRED, + }, 401) + if not has_valid_api_key(request): + return HttpResponseJSON({ + 'status': 'error', + 'desc': 'fxa-activity requires a valid API-key', + 'code': errors.BASKET_AUTH_ERROR, + }, 401) + + data = json.loads(request.body) + if 'fxa_id' not in data: + return HttpResponseJSON({ + 'status': 'error', + 'desc': 'fxa-activity requires a Firefox Account ID', + 'code': errors.BASKET_USAGE_ERROR, + }, 401) + + add_fxa_activity.delay(data) + return HttpResponseJSON({'status': 'ok'}) + + @require_POST @csrf_exempt def fxa_register(request):