Commit 424cc110 by Bertrand Marron

Add create_account server events to tracking log

parent cb7f63d8
...@@ -1120,6 +1120,41 @@ def _do_create_account(post_vars, extended_profile=None): ...@@ -1120,6 +1120,41 @@ def _do_create_account(post_vars, extended_profile=None):
return (user, profile, registration) return (user, profile, registration)
def make_registration_track_function(request, post_vars):
'''
Make a tracking function that logs registration events.
'''
import track
fields = post_vars.copy()
censored_fields = ['password']
unwanted_fields = ['csrfmiddlewaretoken']
for field in censored_fields:
if field in fields:
fields[field] = '********'
for field in unwanted_fields:
if field in fields:
del fields[field]
def function(success, js_data=None):
event_info = {'fields': fields}
if success:
event_type = 'edx.user.creation.succeeded'
else:
event_type = 'edx.user.creation.failed'
if js_data:
event_info['error_message'] = js_data['value']
if 'field' in js_data:
event_info['error_field'] = js_data['field']
return track.views.server_track(request, event_type, event_info, page='register')
return function
@ensure_csrf_cookie @ensure_csrf_cookie
def create_account(request, post_override=None): # pylint: disable-msg=too-many-statements def create_account(request, post_override=None): # pylint: disable-msg=too-many-statements
""" """
...@@ -1140,6 +1175,8 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many ...@@ -1140,6 +1175,8 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many
post_vars = dict(post_vars.items()) post_vars = dict(post_vars.items())
post_vars.update({'password': pipeline.make_random_password()}) post_vars.update({'password': pipeline.make_random_password()})
track_registration = make_registration_track_function(request, post_vars)
# if doing signup for an external authorization, then get email, password, name from the eamap # if doing signup for an external authorization, then get email, password, name from the eamap
# don't use the ones from the form, since the user could have hacked those # don't use the ones from the form, since the user could have hacked those
# unless originally we didn't get a valid email or name from the external auth # unless originally we didn't get a valid email or name from the external auth
...@@ -1165,12 +1202,14 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many ...@@ -1165,12 +1202,14 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many
if a not in post_vars: if a not in post_vars:
js['value'] = _("Error (401 {field}). E-mail us.").format(field=a) js['value'] = _("Error (401 {field}). E-mail us.").format(field=a)
js['field'] = a js['field'] = a
track_registration(False, js)
return JsonResponse(js, status=400) return JsonResponse(js, status=400)
if extra_fields.get('honor_code', 'required') == 'required' and \ if extra_fields.get('honor_code', 'required') == 'required' and \
post_vars.get('honor_code', 'false') != u'true': post_vars.get('honor_code', 'false') != u'true':
js['value'] = _("To enroll, you must follow the honor code.").format(field=a) js['value'] = _("To enroll, you must follow the honor code.").format(field=a)
js['field'] = 'honor_code' js['field'] = 'honor_code'
track_registration(False, js)
return JsonResponse(js, status=400) return JsonResponse(js, status=400)
# Can't have terms of service for certain SHIB users, like at Stanford # Can't have terms of service for certain SHIB users, like at Stanford
...@@ -1187,6 +1226,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many ...@@ -1187,6 +1226,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many
if post_vars.get('terms_of_service', 'false') != u'true': if post_vars.get('terms_of_service', 'false') != u'true':
js['value'] = _("You must accept the terms of service.").format(field=a) js['value'] = _("You must accept the terms of service.").format(field=a)
js['field'] = 'terms_of_service' js['field'] = 'terms_of_service'
track_registration(False, js)
return JsonResponse(js, status=400) return JsonResponse(js, status=400)
# Confirm appropriate fields are there. # Confirm appropriate fields are there.
...@@ -1230,6 +1270,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many ...@@ -1230,6 +1270,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many
js['value'] = _('You are missing one or more required fields') js['value'] = _('You are missing one or more required fields')
js['field'] = field_name js['field'] = field_name
track_registration(False, js)
return JsonResponse(js, status=400) return JsonResponse(js, status=400)
max_length = 75 max_length = 75
...@@ -1243,6 +1284,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many ...@@ -1243,6 +1284,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many
} }
js['value'] = error_str[field_name] js['value'] = error_str[field_name]
js['field'] = field_name js['field'] = field_name
track_registration(False, js)
return JsonResponse(js, status=400) return JsonResponse(js, status=400)
try: try:
...@@ -1250,6 +1292,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many ...@@ -1250,6 +1292,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many
except ValidationError: except ValidationError:
js['value'] = _("Valid e-mail is required.").format(field=a) js['value'] = _("Valid e-mail is required.").format(field=a)
js['field'] = 'email' js['field'] = 'email'
track_registration(False, js)
return JsonResponse(js, status=400) return JsonResponse(js, status=400)
try: try:
...@@ -1257,6 +1300,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many ...@@ -1257,6 +1300,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many
except ValidationError: except ValidationError:
js['value'] = _("Username should only consist of A-Z and 0-9, with no spaces.").format(field=a) js['value'] = _("Username should only consist of A-Z and 0-9, with no spaces.").format(field=a)
js['field'] = 'username' js['field'] = 'username'
track_registration(False, js)
return JsonResponse(js, status=400) return JsonResponse(js, status=400)
# enforce password complexity as an optional feature # enforce password complexity as an optional feature
...@@ -1271,6 +1315,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many ...@@ -1271,6 +1315,7 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many
except ValidationError, err: except ValidationError, err:
js['value'] = _('Password: ') + '; '.join(err.messages) js['value'] = _('Password: ') + '; '.join(err.messages)
js['field'] = 'password' js['field'] = 'password'
track_registration(False, js)
return JsonResponse(js, status=400) return JsonResponse(js, status=400)
# allow microsites to define 'extended profile fields' which are # allow microsites to define 'extended profile fields' which are
...@@ -1297,8 +1342,11 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many ...@@ -1297,8 +1342,11 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many
try: try:
with transaction.commit_on_success(): with transaction.commit_on_success():
ret = _do_create_account(post_vars, extended_profile) ret = _do_create_account(post_vars, extended_profile)
track_registration(True)
except AccountValidationError as e: except AccountValidationError as e:
return JsonResponse({'success': False, 'value': e.message, 'field': e.field}, status=400) js = {'success': False, 'value': e.message, 'field': e.field}
track_registration(False, js)
return JsonResponse(js, status=400)
(user, profile, registration) = ret (user, profile, registration) = ret
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment