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 = (