bemade-addons/portal_partner_manager/doc/suggestion.md
2025-06-19 11:31:33 -04:00

99 lines
3.1 KiB
Markdown

Suggestions pour l'amélioration du module portal_partner_manager
1. Vue d'ensemble
Ce document présente des améliorations techniques et fonctionnelles pour le contrôleur portal.py du module portal_partner_manager, qui gère l'accès au portail pour les utilisateurs et leurs sociétés parentes.
2. Problèmes identifiés
🔒 Sécurité
Utilisation excessive de sudo() : Risque de contourner les contrôles d'accès (ex. portal_my_contacts_grant_access).
Validation manquante des identifiants : Aucun contrôle sur les valeurs de contact_id ou company_id.
🧩 Redondance
Répétition du code : Mêmes requêtes pour les pays/provinces dans plusieurs méthodes (portal_my_contacts_add, portal_my_contacts_edit).
📝 Gestion des erreurs
Messages d'erreur génériques : Ex. "Erreur lors de la création du contact" sans détails.
Validation de l'email absente : Aucun contrôle de format (ex. contact@domain.com).
📊 Journalisation
Logs de débogage en production : Ex. _logger.info("Provinces found: %r", provinces).
3. Améliorations suggérées
✅ Sécurité
Remplacer sudo() par des accès sécurisés :
Exemple :
# Avant
contact = request.env['res.partner'].sudo().browse(contact_id)
# Après
contact = request.env['res.partner'].browse(contact_id)
if contact.parent_id != request.env.user.partner_id.commercial_partner_id:
raise AccessError(_("You don't have access to this contact."))
python
Valider les identifiants :
def _check_valid_id(self, record_id, model):
record = model.browse(record_id)
if not record.exists():
raise ValidationError(_("Invalid record ID."))
return record
python
🛠️ Réduction des redondances
Méthode utilitaire pour les pays/provinces :
def _get_location_data(self):
countries = request.env['res.country'].search([])
canada = countries.filtered(lambda c: c.code == 'CA')
canadian_provinces = request.env['res.country.state'].search([('country_id', '=', canada.id)])
return {
'countries': countries,
'canadian_provinces': canadian_provinces,
}
python
🧪 Gestion des erreurs
Validation de l'email :
import re
def _validate_email(self, email):
pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
if not re.match(pattern, email):
raise ValidationError(_("Invalid email format."))
python
Messages d'erreur explicites :
return request.redirect('/my/company?error_message=' + _('Email already exists for another user.'))
python
📋 Journalisation
Supprimer les logs de débogage en production :
Remplacer _logger.info(...) par _logger.debug(...) ou les supprimer.
4. Exemple de refactorisation
Avant
countries = request.env['res.country'].sudo().search([])
canada = request.env['res.country'].sudo().search([('code', '=', 'CA')], limit=1)
canadian_provinces = request.env['res.country.state'].sudo().search([('country_id', '=', canada.id)])
python
Après
location_data = self._get_location_data()
countries = location_data['countries']
canadian_provinces = location_data['canadian_provinces']
python
5. Tests à ajouter
Test d'archivage d'un contact avec accès portail actif.
Test de création de contact avec email invalide.
Test de modification de société avec champs non autorisés.