99 lines
3.1 KiB
Markdown
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.
|