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

3.1 KiB

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

  1. 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.