From 590ba28913ad07765d8bc950b13bd2cc283a9b7b Mon Sep 17 00:00:00 2001 From: adeelehsan Date: Mon, 27 Sep 2021 02:47:27 +0500 Subject: [PATCH] Username suggestion added based on the full name VAN-702 --- openedx/core/djangoapps/user_authn/utils.py | 59 +++++++++++++------ .../djangoapps/user_authn/views/register.py | 1 + 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/openedx/core/djangoapps/user_authn/utils.py b/openedx/core/djangoapps/user_authn/utils.py index 655f8712f2..6ae75bc1d8 100644 --- a/openedx/core/djangoapps/user_authn/utils.py +++ b/openedx/core/djangoapps/user_authn/utils.py @@ -3,6 +3,7 @@ Utility functions used during user authentication. """ import random +import re from urllib.parse import urlparse # pylint: disable=import-error from uuid import uuid4 # lint-amnesty, pylint: disable=unused-import @@ -57,28 +58,50 @@ def is_registration_api_v1(request): return 'v1' in request.get_full_path() and 'register' not in request.get_full_path() -def generate_username_suggestions(username): - """ Generate 3 available username suggestions """ - max_length = USERNAME_MAX_LENGTH - short_username = username[:max_length - 6] if max_length is not None else username - short_username = short_username.replace('_', '').replace('-', '') +def remove_special_characters_from_name(name): + return "".join(re.findall(r"[\w-]+", name)) + +def generate_username_suggestions(name): + """ Generate 3 available username suggestions """ username_suggestions = [] - int_ranges = [ - {'min': 0, 'max': 9}, - {'min': 10, 'max': 99}, - {'min': 100, 'max': 999}, - {'min': 1000, 'max': 99999}, - ] - for int_range in int_ranges: - for _ in range(10): - random_int = random.randint(int_range['min'], int_range['max']) - suggestion = f'{short_username}_{random_int}' + max_length = USERNAME_MAX_LENGTH + names = name.split(' ') + if names: + first_name = remove_special_characters_from_name(names[0].lower()) + last_name = remove_special_characters_from_name(names[-1].lower()) + + if first_name != last_name and first_name: + # username combination of first and last name + suggestion = f'{first_name}{last_name}'[:max_length] if not username_exists_or_retired(suggestion): username_suggestions.append(suggestion) - break - if len(username_suggestions) == 3: - break + # username is combination of first letter of first name and last name + suggestion = f'{first_name[0]}-{last_name}'[:max_length] + if not username_exists_or_retired(suggestion): + username_suggestions.append(suggestion) + + if len(first_name) >= 2: + + short_username = first_name[:max_length - 6] if max_length is not None else first_name + short_username = short_username.replace('_', '').replace('-', '') + + int_ranges = [ + {'min': 0, 'max': 9}, + {'min': 10, 'max': 99}, + {'min': 100, 'max': 999}, + {'min': 1000, 'max': 99999}, + ] + for int_range in int_ranges: + for _ in range(10): + random_int = random.randint(int_range['min'], int_range['max']) + suggestion = f'{short_username}_{random_int}' + if not username_exists_or_retired(suggestion): + username_suggestions.append(suggestion) + break + + if len(username_suggestions) == 3: + break return username_suggestions diff --git a/openedx/core/djangoapps/user_authn/views/register.py b/openedx/core/djangoapps/user_authn/views/register.py index 2416e1db80..9662990022 100644 --- a/openedx/core/djangoapps/user_authn/views/register.py +++ b/openedx/core/djangoapps/user_authn/views/register.py @@ -784,6 +784,7 @@ class RegistrationValidationView(APIView): def name_handler(self, request): """ Validates whether fullname is valid """ name = request.data.get('name') + self.username_suggestions = generate_username_suggestions(name) return get_name_validation_error(name) def username_handler(self, request):