def update_profile(request): """ Renders the profile update view. """ errors = None languages = set() language_choices = [x for x in LANGUAGE_CODES_AND_NAMES.items()] language_choices.sort(key=lambda x: x[1]) focus_input = 'id_projects' if request.method == "POST": languages = set(request.POST.getlist('languages', None)) if languages: try: # Compute set of evaluation languages for this user. for code, _ in language_choices: language_group = Group.objects.filter(name=code) if language_group.exists(): language_group = language_group[0] if code in languages: language_group.user_set.add(request.user) else: language_group.user_set.remove(request.user) language_group.save() # Redirect to dashboard. return redirect('dashboard') # For any other exception, clean up and ask user to retry. except Exception: from traceback import format_exc print(format_exc()) languages = set() # Detect which input should get focus for next page rendering. if not languages: focus_input = 'id_languages' errors = ['invalid_languages'] # Determine user target languages for group in request.user.groups.all(): if group.name.lower() in [x.lower() for x in LANGUAGE_CODES_AND_NAMES]: languages.add(group.name.lower()) context = { 'active_page': "OVERVIEW", 'errors': errors, 'focus_input': focus_input, 'languages': languages, 'language_choices': language_choices, 'title': 'Update profile', } context.update(BASE_CONTEXT) return render(request, 'Dashboard/update-profile.html', context)
def create_profile(request): """ Renders the create profile view. """ errors = None username = None email = None token = None languages = [] language_choices = [x for x in LANGUAGE_CODES_AND_NAMES.items()] language_choices.sort(key=lambda x: x[1]) focus_input = 'id_username' if request.method == "POST": username = request.POST.get('username', None) email = request.POST.get('email', None) token = request.POST.get('token', None) languages = request.POST.getlist('languages', None) if username and email and token and languages: try: # Check if given invite token is still active. invite = UserInviteToken.objects.filter(token=token) if not invite.exists() or not invite[0].active: raise ValueError('invalid_token') # We now have a valid invite token... invite = invite[0] # Check if desired username is already in use. current_user = User.objects.filter(username=username) if current_user.exists(): raise ValueError('invalid_username') # Compute set of evaluation languages for this user. eval_groups = [] for code in languages: language_group = Group.objects.filter(name=code) if language_group.exists(): eval_groups.extend(language_group) # Create new user account and add to group. password = '******'.format( invite.group.name[:2].upper(), md5(invite.group.name.encode('utf-8')).hexdigest()[:8], ) user = User.objects.create_user(username, email, password) # Update group settings for the new user account. user.groups.add(invite.group) for eval_group in eval_groups: user.groups.add(eval_group) user.save() # Disable invite token and attach to current user. invite.active = False invite.user = user invite.save() # Login user and redirect to dashboard page. user = authenticate(username=username, password=password) login(request, user) return redirect('dashboard') # For validation errors, invalidate the respective value. except ValueError as issue: if issue.args[0] == 'invalid_username': username = None elif issue.args[0] == 'invalid_token': token = None else: username = None email = None token = None languages = None # For any other exception, clean up and ask user to retry. except Exception: from traceback import format_exc print(format_exc()) # TODO: need logger here! username = None email = None token = None languages = None # Detect which input should get focus for next page rendering. if not username: focus_input = 'id_username' errors = ['invalid_username'] elif not email: focus_input = 'id_email' errors = ['invalid_email'] elif not token: focus_input = 'id_token' errors = ['invalid_token'] elif not languages: focus_input = 'id_languages' errors = ['invalid_languages'] context = { 'active_page': "OVERVIEW", # TODO: check 'errors': errors, 'focus_input': focus_input, 'username': username, 'email': email, 'token': token, 'languages': languages, 'language_choices': language_choices, 'title': 'Create profile', } context.update(BASE_CONTEXT) return render(request, 'Dashboard/create-profile.html', context)