diff --git a/Web/app.py b/Web/app.py index 99d11a3..cbbdf50 100755 --- a/Web/app.py +++ b/Web/app.py @@ -6853,11 +6853,9 @@ def register(): password = request.form['password'] name = (request.form.get('name') or '').strip() last_name = (request.form.get('last-name') or '').strip() - - # Generate username from name and last_name if not provided or empty - username = (request.form.get('username') or '').strip() - if not username: - username = us.build_username_from_name(name, last_name) + + # Always generate username from abbreviation logic and auto-extend on collisions. + username = us.build_unique_username_from_name(name, last_name) permission_preset = (request.form.get('permission_preset') or 'standard_user').strip() use_custom_permissions = request.form.get('use_custom_permissions') == 'on' @@ -6867,9 +6865,6 @@ def register(): if not username or not password or not name or not last_name: flash('Bitte füllen Sie alle Felder aus', 'error') return redirect(url_for('register')) - if us.get_user(username): - flash('Benutzer existiert bereits', 'error') - return redirect(url_for('register')) if not us.check_password_strength(password): flash('Passwort ist zu schwach', 'error') return redirect(url_for('register')) diff --git a/Web/templates/register.html b/Web/templates/register.html index 61ae8c9..c382050 100755 --- a/Web/templates/register.html +++ b/Web/templates/register.html @@ -49,7 +49,7 @@ 👤 -

Klarnamen werden nur zur Erzeugung des Benutzernamens und eines Kuerzels (z.B. SimFri) verwendet und nicht als Klarname gespeichert.

+

Klarnamen werden nur zur Erzeugung des Benutzernamens als Kürzel (z.B. SimFri) verwendet; bei Kollision wird automatisch ein Buchstabe mehr genommen.

@@ -472,11 +472,11 @@ function generateUsername() { let username = ''; if (firstName && lastName) { - username = firstName + lastName; + username = (firstName.slice(0, 3) + lastName.slice(0, 3)); } else if (firstName) { - username = firstName; + username = firstName.slice(0, 6); } else if (lastName) { - username = lastName; + username = lastName.slice(0, 6); } // Set the username field diff --git a/Web/user.py b/Web/user.py index 649f112..770f313 100755 --- a/Web/user.py +++ b/Web/user.py @@ -59,9 +59,8 @@ def build_name_synonym(first_name, last_name=''): def build_username_from_name(first_name, last_name=''): """ - Build a deterministic username from first and last name. - Format: firstnameLastname (CamelCase, e.g., 'SimonFrings' or 'SFrings') - Ensures uniqueness by allowing server to check existence. + Build a deterministic username abbreviation from first and last name. + Uses the same short alias logic (e.g. SimFri) and stores it lowercase. Args: first_name (str): First name @@ -70,18 +69,38 @@ def build_username_from_name(first_name, last_name=''): Returns: str: Generated username """ + alias = build_name_synonym(first_name, last_name) + return alias.lower() + + +def build_unique_username_from_name(first_name, last_name=''): + """ + Build a unique username based on the abbreviation logic. + If a collision occurs, increase the username by one additional letter + from the combined cleaned name until it is unique. + """ first = _clean_name_fragment(first_name) last = _clean_name_fragment(last_name) - - if first and last: - # Full: FirstLast (e.g., 'SimonFrings') - return (first + last).lower() - elif first: - return first.lower() - elif last: - return last.lower() - else: - return 'user' + combined = (first + last).lower() + + base_username = build_username_from_name(first_name, last_name) + if not combined: + combined = base_username or 'user' + + start_len = len(base_username) if base_username else min(6, len(combined)) + start_len = max(1, min(start_len, len(combined))) + + # Main strategy: take one more letter on each collision. + for length in range(start_len, len(combined) + 1): + candidate = combined[:length] + if not get_user(candidate): + return candidate + + # Fallback if full combined name is already taken repeatedly. + suffix = 2 + while get_user(f"{combined}{suffix}"): + suffix += 1 + return f"{combined}{suffix}" ACTION_PERMISSION_KEYS = (