Modèles de données
Architecture RGPD-compliant : séparation stricte entre base de contacts privée et annuaire public.
Principe d'architecture RGPD
ContactBase — tous les anciens élèves identifiés, importés CSV.
Jamais exposé via l'API publique.
L'alumni clique le lien, crée son mot de passe et coche le consentement RGPD explicite.
AlumniProfile — créé uniquement si consentement = True.
Visible aux membres connectés.
ContactBase
apps/accounts/models.pyBase de contacts importée depuis CSV. Contient tous les anciens élèves identifiés, qu'ils aient activé leur compte ou non. Jamais exposée via l'API publique.
| Champ | Description | Statut |
|---|---|---|
| first_name / last_name | Nom et prénom | Obligatoire |
| Adresse email — identifiant unique | Obligatoire | |
| promotion_year | Année de promotion | Obligatoire |
| filiere | Filière (INGE, MF, SPH, IGC, IGEA) | Obligatoire |
| phone | Numéro de téléphone | Optionnel |
| academic_major | Spécialité académique | Pré-rempli CSV |
| last_diploma | Dernier diplôme | Pré-rempli CSV |
| last_school | Dernière école / université | Pré-rempli CSV |
| education_level | Niveau d'études | Pré-rempli CSV |
| current_situation | Situation actuelle | Pré-rempli CSV |
| company | Entreprise actuelle | Pré-rempli CSV |
| current_role | Fonction actuelle | Pré-rempli CSV |
| linkedin_url | Profil LinkedIn | Pré-rempli CSV |
| is_activated | Compte activé | Auto |
User
apps/accounts/models.pyUtilisateur Django personnalisé (email-based). Créé lors de l'activation. Relié à ContactBase par OneToOne.
| Champ | Description | Statut |
|---|---|---|
| Email — identifiant de connexion | Obligatoire | |
| password | Mot de passe haché (PBKDF2) | Obligatoire |
| contact_base | Lien vers ContactBase (O2O, nullable) | Obligatoire |
| is_verified | Compte vérifié via lien activation | Auto |
| is_active / is_staff | Statuts Django standard | Auto |
ActivationToken
apps/accounts/models.pyToken d'activation unique valable 7 jours. Généré lors de l'envoi d'invitation. Précédents tokens invalidés à chaque renvoi.
| Champ | Description | Statut |
|---|---|---|
| token | Token URL-safe (64 chars, secrets.token_urlsafe) | Auto |
| contact | Lien vers ContactBase | FK |
| expires_at | Expiration (now + 7 jours) | Auto |
| is_used | Consommé à l'activation | Auto |
AlumniProfile
apps/alumni/models.pyProfil visible dans l'annuaire. Créé UNIQUEMENT si consent_given=True. save() lève ValueError si consent_given=False.
| Champ | Description | Statut |
|---|---|---|
| user | Lien vers User (O2O) | Obligatoire |
| consent_given | Consentement RGPD (doit être True) | Obligatoire |
| is_visible | Visible dans l'annuaire | Défaut True |
| filiere | Filière PrépaVogt | Pré-rempli |
| city | Ville actuelle | Optionnel |
| current_role | Fonction actuelle | Pré-rempli |
| company | Entreprise | Pré-rempli |
| sector | Secteur d'activité (nouveau) | Optionnel |
| skills | Compétences — JSONField liste (nouveau) | Optionnel |
| bio | Biographie courte | Optionnel |
| academic_major | Spécialité | Pré-rempli |
| last_diploma / last_school | Parcours diplôme | Pré-rempli |
| education_level | Niveau d'études | Pré-rempli |
| current_situation | Situation (étudiant, salarié…) | Pré-rempli |
| linkedin_url | Pré-rempli | |
| phone | Téléphone (si partagé) | Optionnel |
Article
apps/news/models.pyArticles et actualités publiés via l'admin Django (CKEditor 5). Covertures stockées sur Cloudinary. Accessible aux membres connectés uniquement.
| Champ | Description | Statut |
|---|---|---|
| title | Titre de l'article | Obligatoire |
| slug | Slug unique auto-généré (slugify + déduplication) | Auto |
| content | Corps HTML (CKEditor 5) | Obligatoire |
| excerpt | Extrait (auto depuis content si vide) | Optionnel |
| cover_image | Image de couverture (Cloudinary) | Optionnel |
| category | Catégorie (EVENEMENT, SUCCESS, ANNONCE…) | Optionnel |
| author | Auteur (FK User) | Auto — requester en admin |
| is_published | Publié (visible via API) | Défaut False |
| published_at | Date de publication | Auto à la publication |
| created_at / updated_at | Horodatage | Auto |
PasswordResetToken
apps/accounts/models.pyToken de réinitialisation de mot de passe. Valable 24h. Endpoint POST /api/auth/password-reset/confirm/ pour confirmer.
| Champ | Description | Statut |
|---|---|---|
| token | Token URL-safe (64 chars) | Auto |
| user | Lien vers User | FK |
| expires_at | Expiration (now + 24h) | Auto |
| is_used | Consommé | Auto |