Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.72 KB | None | 0 0
  1. @api.multi
  2. def _find_partner_from_emails(self, emails, res_model=None, res_id=None, check_followers=True, force_create=False,
  3. exclude_aliases=True):
  4. """ Utility method to find partners from email addresses. The rules are :
  5. 1 - check in document (model | self, id) followers
  6. 2 - try to find a matching partner that is also an user
  7. 3 - try to find a matching partner
  8. 4 - create a new one if force_create = True
  9.  
  10. :param list emails: list of email addresses
  11. :param string model: model to fetch related record; by default self
  12. is used.
  13. :param boolean check_followers: check in document followers
  14. :param boolean force_create: create a new partner if not found
  15. :param boolean exclude_aliases: do not try to find a partner that could match an alias. Normally aliases
  16. should not be used as partner emails but it could be the case due to some
  17. strange manipulation
  18. """
  19. if res_model is None:
  20. res_model = self._name
  21. if res_id is None and self.ids:
  22. res_id = self.ids[0]
  23. followers = self.env['res.partner']
  24. if res_model and res_id:
  25. record = self.env[res_model].browse(res_id)
  26. if hasattr(record, 'message_partner_ids'):
  27. followers = record.message_partner_ids
  28.  
  29. Partner = self.env['res.partner'].sudo()
  30. Users = self.env['res.users'].sudo()
  31. ir_mail_server = self.env['ir.mail_server'].sudo()
  32. partner_ids = []
  33.  
  34. for contact in emails:
  35. partner_id = False
  36. email_address = tools.email_split(contact)
  37. if not email_address:
  38. partner_ids.append(partner_id)
  39. continue
  40. if exclude_aliases and self.env['mail.alias'].search([('alias_name', 'ilike', email_address)], limit=1):
  41. partner_ids.append(partner_id)
  42. continue
  43.  
  44. email_address = email_address[0]
  45. # first try: check in document's followers
  46. partner_id = next((partner.id for partner in followers if partner.email == email_address), False)
  47.  
  48. # second try: check in partners that are also users
  49. # Escape special SQL characters in email_address to avoid invalid matches
  50. email_address = (email_address.replace('\\', '\\\\').replace('%', '\\%').replace('_', '\\_'))
  51. email_brackets = "<%s>" % email_address
  52. if not partner_id:
  53. # exact, case-insensitive match
  54. partners = Users.search([('email', '=ilike', email_address)])
  55. if partners:
  56. partners = partners[0].mapped('partner_id')
  57. if not partners:
  58. # if no match with addr-spec, attempt substring match within name-addr pair
  59. partners = Users.search([('email', 'ilike', email_brackets)])
  60. if partners:
  61. partners = partners[0].mapped('partner_id')
  62. partner_id = partners.id
  63. # third try: check in partners
  64. if not partner_id:
  65. # exact, case-insensitive match
  66. partners = Partner.search([('email', '=ilike', email_address)])
  67. if not partners:
  68. # if no match with addr-spec, attempt substring match within name-addr pair
  69. partners = Partner.search([('email', 'ilike', email_brackets)])
  70. if partners:
  71. partners = partners[0]
  72. partner_id = partners.id
  73. if not partner_id:
  74. #if not partner_id and force_create:
  75. try :
  76. partner_id = self.env['res.partner'].name_create(contact)[0]
  77. except Exception as e:
  78. #Sollux ma ciekawe skrzynki
  79. _logger.error("Blad walidacji adresu email")
  80. partner_ids.append(partner_id)
  81.  
  82. #last try
  83. #server = ir_mail_server.search([("smtp_user", "=", email_address)])
  84. #if len(server) > 0:
  85. # user = self.env["res.users"].search([("ir_mail_server_id", "=", server[0].id)])
  86. # if len(user) > 0:
  87. # partner_id = Partner.browse(user[0].partner_id)
  88. # if partner_id.id not in partner_ids:
  89. # partner_ids.append(partner_id.id.id)
  90.  
  91. if len(partner_ids) == 0:
  92. _logger.info("Partners not find for that contact " + contact)
  93.  
  94.  
  95. return partner_ids
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement