EduLab / documentation /PROFILE_UPDATE_RESOLUTION.md
rinogeek's picture
Initial deploy to Hugging Face
062d102

🎉 RÉCAPITULATIF FINAL - Mise à Jour des Profils

Développé par Marino ATOHOUN pour Hypee


✅ STATUT : FONCTIONNEL

La fonctionnalité de mise à jour des profils (utilisateur et mentor) est maintenant 100% opérationnelle.


🔧 Problèmes Résolus

1. Erreur d'Import mentorService

Symptôme : The requested module '/services/auth.ts' does not provide an export named 'mentorService'

Cause : Import incorrect dans AuthContext.tsx

Solution :

// Avant
import { authService, mentorService } from '../services/auth';

// Après
import { authService, mentorService } from '../services';

2. Erreur 400 - Champs Vides

Symptôme : Bad Request: {'university': ['Ce champ ne peut être vide.']}

Cause : Les serializers Django rejetaient les chaînes vides

Solution : Ajout de allow_blank=True dans les serializers

# apps/users/serializers.py
class UserProfileUpdateSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=255, required=False, allow_blank=True)
    avatar = serializers.URLField(required=False, allow_blank=True)
    country = serializers.CharField(max_length=100, required=False, allow_blank=True)
    university = serializers.CharField(max_length=255, required=False, allow_blank=True)

# apps/mentors/serializers.py
class MentorProfileUpdateSerializer(serializers.Serializer):
    bio = serializers.CharField(required=False, allow_blank=True)

3. Erreur 400 - Avatar Base64

Symptôme : Erreur 400 lors de l'upload d'une image

Cause : Le backend attend une URL, pas une data URI base64

Solution : Filtrage côté frontend

// EditProfileModal.tsx
const dataToSend = { ...userData };

if (dataToSend.avatar && dataToSend.avatar.startsWith('data:')) {
    delete (dataToSend as any).avatar;
    console.warn("L'upload d'image n'est pas encore supporté...");
}

4. Database Locked (SQLite)

Symptôme : django.db.utils.OperationalError: database is locked

Cause : SQLite ne gère pas bien les écritures concurrentes

Solution : Augmentation du timeout

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
        'OPTIONS': {
            'timeout': 20,
        }
    }
}

Note : Pour la production, utiliser PostgreSQL


📋 Fichiers Modifiés

Backend

  • apps/users/serializers.py - Ajout allow_blank=True
  • apps/users/views.py - Ajout logs de validation + url_path='profile'
  • apps/mentors/serializers.py - Ajout allow_blank=True
  • apps/mentors/views.py - Ajout imports Response, status
  • apps/core/signals.py - Création auto MentorProfile
  • apps/core/apps.py - Import des signaux
  • educonnect/settings.py - Timeout SQLite

Frontend

  • context/AuthContext.tsx - Import corrigé + mentorService
  • components/EditProfileModal.tsx - Filtrage avatar base64
  • services/mentors.ts - Transformation données (string → list)

🎯 Fonctionnalités Disponibles

Profil Utilisateur (Tous)

  • ✅ Modification du nom
  • ✅ Modification du pays
  • ✅ Modification de l'université
  • ⚠️ Avatar (URL uniquement, pas d'upload de fichier)

Profil Mentor (Mentors uniquement)

  • ✅ Modification de la bio
  • ✅ Gestion des spécialités (tags)
  • ✅ Gestion des disponibilités (hebdomadaire)
  • ✅ Gestion des réseaux sociaux (LinkedIn, Twitter, Website, GitHub)

🧪 Tests Validés

API Tests (curl)

# ✅ Mise à jour profil utilisateur
PATCH /api/auth/profile/ → 200 OK

# ✅ Mise à jour profil mentor
PATCH /api/mentors/my_profile/ → 200 OK

# ✅ Champs vides acceptés
{"name": "Test", "country": "", "university": ""} → 200 OK

# ✅ Création auto MentorProfile
Inscription role=MENTOR → MentorProfile créé automatiquement

Frontend Tests

  • ✅ Modal "Modifier mon profil" s'ouvre
  • ✅ Champs pré-remplis avec données actuelles
  • ✅ Modification et sauvegarde sans erreur
  • ✅ Notification de succès affichée
  • ✅ Données persistées dans la base

⚠️ Limitations Connues

1. Upload d'Avatar

Statut : Non supporté

Raison : Nécessite configuration stockage fichiers (S3/local)

Workaround : Utiliser une URL d'image existante

Message : "L'upload d'image n'est pas encore supporté par le backend"

2. Disponibilités par Date Spécifique

Statut : Partiellement supporté

Comportement : Le frontend permet de saisir une date, mais elle est convertie en jour de la semaine

Exemple : "12/12/2025" → "VENDREDI"

3. Database Locked (SQLite)

Statut : Rare, mais possible

Impact : Erreur 500 temporaire, retry automatique réussit

Solution production : Migrer vers PostgreSQL


📊 Logs & Débogage

Logs de Validation

Les erreurs de validation sont maintenant loggées :

# apps/users/views.py
if not serializer.is_valid():
    logger.warning(f"Validation errors: {serializer.errors}")

Vérification

# Voir les logs
tail -f backend/logs/django.log

# Filtrer les erreurs de validation
tail -f backend/logs/django.log | grep "Validation errors"

🚀 Prochaines Étapes Suggérées

  1. Upload d'Images

    • Configurer stockage (AWS S3 ou local)
    • Modifier serializer pour accepter ImageField
    • Ajouter compression d'images
  2. Migration PostgreSQL

    • Éviter les "database locked"
    • Meilleures performances
    • Support production
  3. Validation Avancée

    • Validation des URLs de réseaux sociaux
    • Validation des créneaux horaires
    • Prévention des doublons
  4. Tests Automatisés

    • Tests unitaires serializers
    • Tests d'intégration API
    • Tests E2E frontend

✅ Conclusion

La mise à jour des profils fonctionne parfaitement !

Tous les bugs signalés ont été corrigés :

  • ✅ Import mentorService corrigé
  • ✅ Erreurs 400 résolues
  • ✅ Champs vides acceptés
  • ✅ Avatar base64 géré
  • ✅ Timeout SQLite augmenté

Prêt pour les tests utilisateurs !


Développé par Marino ATOHOUN pour Hypee ❤️