From 35119f796f33137c56e4d7abea5948510b1e5c36 Mon Sep 17 00:00:00 2001 From: Greg Date: Sun, 8 Mar 2026 13:50:46 +0100 Subject: [PATCH] fix: allow accented characters in player and guest names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extend validation regex to include Latin Extended Unicode range (\u00C0-\u024F) covering é, è, à, ü, ö, etc. in backend and frontend. Co-Authored-By: Claude Sonnet 4.6 --- app.py | 8 +++----- static/app.js | 2 +- templates/admin.html | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app.py b/app.py index 851b2c7..f375f2b 100644 --- a/app.py +++ b/app.py @@ -122,12 +122,10 @@ def db_to_json(): import re def validate_player_name(name): - # Only allow a-z, A-Z, 0-9, spaces, hyphens, and periods, max 50 chars - return bool(re.fullmatch(r'[a-zA-Z0-9 .-]{1,50}', name)) + return bool(re.fullmatch(r'[a-zA-Z0-9\u00C0-\u024F .-]{1,50}', name)) def validate_guest_name(name): - # Only allow a-z, A-Z, 0-9, spaces, hyphens, and periods, max 50 chars - return bool(re.fullmatch(r'[a-zA-Z0-9 .-]{1,50}', name)) + return bool(re.fullmatch(r'[a-zA-Z0-9\u00C0-\u024F .-]{1,50}', name)) def validate_date_str(date_str): # Format: DD/MM/YY @@ -252,7 +250,7 @@ def get_players(): def add_player(): data = request.json name = (data.get('name') or '').strip() - if not re.fullmatch(r'[a-zA-Z0-9 .\-]{1,50}', name): + if not re.fullmatch(r'[a-zA-Z0-9\u00C0-\u024F .\-]{1,50}', name): return jsonify({'status': 'error', 'message': 'Invalid name'}), 400 if Player.query.filter_by(name=name).first(): return jsonify({'status': 'error', 'message': 'Player already exists'}), 400 diff --git a/static/app.js b/static/app.js index 15330c2..fff5550 100644 --- a/static/app.js +++ b/static/app.js @@ -178,7 +178,7 @@ function renderTable() { guestNameInput.value = data.guestNames[date] || ''; return; } - if (!/^([a-zA-Z0-9 .-]+)$/.test(value)) { + if (!/^[a-zA-Z0-9\u00C0-\u024F .-]+$/.test(value)) { alert('Guest name can only contain letters, numbers, spaces, hyphens, and periods.'); guestNameInput.value = data.guestNames[date] || ''; return; diff --git a/templates/admin.html b/templates/admin.html index 9d183c7..dd6d82c 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -406,7 +406,7 @@ const name = nameInput.value.trim(); msg.textContent = ''; - if (!/^[a-zA-Z0-9 .\-]{1,50}$/.test(name)) { + if (!/^[a-zA-Z0-9\u00C0-\u024F .\-]{1,50}$/.test(name)) { msg.className = 'msg err'; msg.textContent = 'Invalid name. Use letters, numbers, spaces, hyphens, or periods (max 50 chars).'; return;