import re def normalize_for_username(value): """Turkce karakterleri ASCII'ye cevirip username-safe hale getirir.""" tr_map = str.maketrans({ 'c': 'c', 'C': 'c', 'g': 'g', 'G': 'g', 'i': 'i', 'I': 'i', 'o': 'o', 'O': 'o', 's': 's', 'S': 's', 'u': 'u', 'U': 'u', 'ç': 'c', 'Ç': 'c', 'ğ': 'g', 'Ğ': 'g', 'ı': 'i', 'İ': 'i', 'ö': 'o', 'Ö': 'o', 'ş': 's', 'Ş': 's', 'ü': 'u', 'Ü': 'u', }) value = value.translate(tr_map).lower() return re.sub(r'[^a-z0-9]+', '', value) def build_unique_username(first_name, last_name, birth_date, used_usernames, _force_suffix=None): """ ad.soyadYY formatinda username uretir, cakisma olursa sonek ekler. _force_suffix: verilirse bare base denenmez, bu sayidan itibaren baslar (regeneration ping-pong onlemek icin kullanilir). """ first = normalize_for_username(first_name or '') last = normalize_for_username(last_name or '') yy = str(birth_date.year)[-2:] base = f"{first}.{last}{yy}" if first and last else f"user{yy}" if _force_suffix is not None: # Yeniden uretim: bare base'i hic deneme, rastgele bir sonek ile basla counter = _force_suffix candidate = f"{base}{counter}" else: candidate = base counter = 1 while candidate in used_usernames: counter += 1 candidate = f"{base}{counter}" used_usernames.add(candidate) return candidate