This commit is contained in:
2025-12-02 14:51:30 +01:00
parent f23293fcf5
commit 9547465661
2 changed files with 44 additions and 8 deletions

26
CHANGELOG.md Normal file
View File

@@ -0,0 +1,26 @@
# Changelog - Calendrier de l'Avent
## [v1.0.0] - 2025-12-02 - Release complète
### ✨ **Nouvelles fonctionnalités**
- **Multi-projets** : Gestion indépendante de plusieurs calendriers
- **Upload images** : Illustration personnalisée par projet (PNG/JPG/GIF)
- **Page publique** : Accès sans login `/public` et `/public/project/1`
- **Tirage catchup** : Rattrapage automatique des jours manqués
- **Import CSV UTF-8** : Accents + espaces internes préservés
- **Calcul quota auto** : `max_draws = ceil(total_days / nb_personnes)`
- **Thème Noël** : Design festif + animations
- **Docker 1-clic** : `./restart.sh`
### 🐛 **Corrections**
- Fix `url_for('index')``url_for('dashboard')`
- Upload images : conservation image existante si pas modifiée
- CSV : `utf-8-sig` + strip bords seulement (espaces internes OK)
### 📱 **Interface**
- **Public** : Liste projets + vue calendrier (lecture seule)
- **Admin** : Projets + utilisateurs/projet + upload images
- **Responsive** : Mobile/Desktop/Tablet
### 🚀 **Accès**

26
app.py
View File

@@ -334,21 +334,31 @@ def admin_project_people(project_id):
if 'csv_file' in request.files: if 'csv_file' in request.files:
csv_file = request.files['csv_file'] csv_file = request.files['csv_file']
if csv_file.filename: if csv_file.filename:
content = csv_file.read().decode('utf-8') # Lecture UTF-8 avec gestion BOM
content = csv_file.read().decode('utf-8-sig')
reader = csv.DictReader(StringIO(content)) reader = csv.DictReader(StringIO(content))
count = 0 count = 0
for row in reader: for row in reader:
name = row.get("name", "").strip() # CONSERVE les espaces INTERNES, supprime SEULEMENT avant/après
if name: raw_name = row.get("name", "").strip() # UNIQUEMENT les bords
cur = db.execute("SELECT id FROM people WHERE name = ? AND project_id = ?", if raw_name:
(name, project_id)) # Pas de .title() pour conserver la casse exacte
name = raw_name # ESPACES INTERNES préservés !
# Vérifier doublons exacts (espaces inclus)
cur = db.execute(
"SELECT id FROM people WHERE name = ? AND project_id = ?",
(name, project_id)
)
if not cur.fetchone(): if not cur.fetchone():
db.execute("INSERT INTO people (project_id, name, draws, max_draws) VALUES (?, ?, 0, 0)", db.execute(
(project_id, name)) "INSERT INTO people (project_id, name, draws, max_draws) VALUES (?, ?, 0, 0)",
(project_id, name)
)
count += 1 count += 1
recalc_max_draws_for_project(project_id) recalc_max_draws_for_project(project_id)
db.commit() db.commit()
flash(f"{count} personnes importées depuis le CSV.") flash(f"{count} personnes importées (espaces + accents préservés !)")
elif action == "delete": elif action == "delete":
person_id = int(request.form.get("person_id")) person_id = int(request.form.get("person_id"))
db.execute("DELETE FROM people WHERE id = ? AND project_id = ?", (person_id, project_id)) db.execute("DELETE FROM people WHERE id = ? AND project_id = ?", (person_id, project_id))