Compare commits

..

1 Commits

3 changed files with 39 additions and 25 deletions
+3 -8
View File
@@ -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'))
+4 -4
View File
@@ -49,7 +49,7 @@
<span class="input-icon">👤</span>
<input type="text" id="username" name="username" placeholder="Automatisch aus Name und Nachname" readonly style="background-color: #f3f4f6; cursor: not-allowed;">
</div>
<p class="anonymize-hint">Klarnamen werden nur zur Erzeugung des Benutzernamens und eines Kuerzels (z.B. SimFri) verwendet und nicht als Klarname gespeichert.</p>
<p class="anonymize-hint">Klarnamen werden nur zur Erzeugung des Benutzernamens als Kürzel (z.B. SimFri) verwendet; bei Kollision wird automatisch ein Buchstabe mehr genommen.</p>
</div>
<div class="form-group">
@@ -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
+32 -13
View File
@@ -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 = (