Little World Nepal France
Plateforme bilingue pour une association franco-népalaise d’éducation
- Année
- 2026
- Type
- Projet client
- Rôle
- Ingénierie full-stack
- Statut
- En développement
Un site en français et en anglais pour LWNF, association qui soutient l’éducation, la formation et les étudiants au Népal : projets, blog, informations de parrainage, galerie et boîte de réception des demandes, avec une administration pour l’équipe.
Contexte
Les soutiens de LWNF, francophones et anglophones, suivent des projets dans des écoles et des villages népalais. Le site remplace un ancien blog par une plateforme structurée : projets et actualités, informations de parrainage, et demandes qui arrivent dans une boîte de l’équipe plutôt que dans une messagerie personnelle.
Les dons sont présentés à titre d’information et renvoient vers l’extérieur : le site ne traite aucun paiement.
Approche
Les pages publiques vivent sous /fr et /en, rendues statiquement et revalidées par étiquette à chaque publication. Les contenus traduisibles sont stockés en paires de champs français/anglais avec un repli défini : un article à moitié traduit n’affiche jamais de titre vide à un lecteur anglophone.
Architecture du système
Client
Visiteurs et équipe · FR · EN
Les soutiens lisent les projets, le blog et les informations de parrainage en français ou en anglais ; l’équipe gère contenus et demandes.
Appelle Next.js
Application
Next.js · /fr · /en · ISR
Pages publiques préfixées par la langue, rendues statiquement et revalidées par étiquette à chaque publication.
Appelle Django · DRF · Appelé par Visiteurs et équipe
Django · DRF · Contenu · demandes
Projets, blog, profils de parrainage, galerie et boîte de réception des demandes, avec le système d’identité et une API de contenu réservée à l’équipe.
Appelle PostgreSQL, Redis · Appelé par Next.js
Celery · E-mails · nettoyage
Worker et Beat : e-mails sortants, revalidation du frontend et nettoyage planifié.
Appelé par Redis
Données
PostgreSQL · Contenu · identité
Identité, jetons, contenus et demandes.
Appelé par Django · DRF
Redis · Cache · verrouillage · broker
Cache, compteurs de verrouillage de connexion et broker Celery.
Appelle Celery (asynchrone) · Appelé par Django · DRF
Difficultés d’ingénierie
Un compte d’équipe pouvait prendre le contrôle d’un superutilisateur
Problème
L’équipe pouvait modifier l’e-mail d’un autre compte, y compris celui d’un superutilisateur, puis mener à bien la récupération du mot de passe. La suite de tests d’API d’origine, pourtant au vert, ne l’avait pas révélé.
Analyse
Un test de recette a reproduit tout le chemin sur la vraie API et PostgreSQL : modifier l’e-mail de récupération, demander une réinitialisation, se connecter en tant que superutilisateur.
Solution
Les modifications d’identité exigent désormais un superutilisateur actif ; l’équipe éditoriale garde un accès en lecture. L’admin Django applique la même frontière, qu’une permission de modification explicite ne peut contourner. L’équipe ne peut plus désactiver de comptes.
Résultat
La prise de contrôle initiale reçoit maintenant un 403 et l’e-mail enregistré reste inchangé ; six autres cas couvrent les modifications d’identité sur des membres, de l’équipe et des superutilisateurs.
Performance, sécurité et accessibilité
Avant la mise en ligne, j’ai mené une recette fondée sur les risques, sur les images de production, PostgreSQL et Redis. Elle a conclu que la version n’était pas prête. Onze défauts ont été confirmés et corrigés, chacun avec un test de régression qui échoue sans le correctif.
Technologies
- TypeScript
- Next.js
- Django
- Django REST Framework
- Celery
- PostgreSQL
- Redis
- Docker
- Nginx
- Playwright