Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @api.multi
- def _find_partner_from_emails(self, emails, res_model=None, res_id=None, check_followers=True, force_create=False,
- exclude_aliases=True):
- """ Utility method to find partners from email addresses. The rules are :
- 1 - check in document (model | self, id) followers
- 2 - try to find a matching partner that is also an user
- 3 - try to find a matching partner
- 4 - create a new one if force_create = True
- :param list emails: list of email addresses
- :param string model: model to fetch related record; by default self
- is used.
- :param boolean check_followers: check in document followers
- :param boolean force_create: create a new partner if not found
- :param boolean exclude_aliases: do not try to find a partner that could match an alias. Normally aliases
- should not be used as partner emails but it could be the case due to some
- strange manipulation
- """
- if res_model is None:
- res_model = self._name
- if res_id is None and self.ids:
- res_id = self.ids[0]
- followers = self.env['res.partner']
- if res_model and res_id:
- record = self.env[res_model].browse(res_id)
- if hasattr(record, 'message_partner_ids'):
- followers = record.message_partner_ids
- Partner = self.env['res.partner'].sudo()
- Users = self.env['res.users'].sudo()
- ir_mail_server = self.env['ir.mail_server'].sudo()
- partner_ids = []
- for contact in emails:
- partner_id = False
- email_address = tools.email_split(contact)
- if not email_address:
- partner_ids.append(partner_id)
- continue
- if exclude_aliases and self.env['mail.alias'].search([('alias_name', 'ilike', email_address)], limit=1):
- partner_ids.append(partner_id)
- continue
- email_address = email_address[0]
- # first try: check in document's followers
- partner_id = next((partner.id for partner in followers if partner.email == email_address), False)
- # second try: check in partners that are also users
- # Escape special SQL characters in email_address to avoid invalid matches
- email_address = (email_address.replace('\\', '\\\\').replace('%', '\\%').replace('_', '\\_'))
- email_brackets = "<%s>" % email_address
- if not partner_id:
- # exact, case-insensitive match
- partners = Users.search([('email', '=ilike', email_address)])
- if partners:
- partners = partners[0].mapped('partner_id')
- if not partners:
- # if no match with addr-spec, attempt substring match within name-addr pair
- partners = Users.search([('email', 'ilike', email_brackets)])
- if partners:
- partners = partners[0].mapped('partner_id')
- partner_id = partners.id
- # third try: check in partners
- if not partner_id:
- # exact, case-insensitive match
- partners = Partner.search([('email', '=ilike', email_address)])
- if not partners:
- # if no match with addr-spec, attempt substring match within name-addr pair
- partners = Partner.search([('email', 'ilike', email_brackets)])
- if partners:
- partners = partners[0]
- partner_id = partners.id
- if not partner_id:
- #if not partner_id and force_create:
- try :
- partner_id = self.env['res.partner'].name_create(contact)[0]
- except Exception as e:
- #Sollux ma ciekawe skrzynki
- _logger.error("Blad walidacji adresu email")
- partner_ids.append(partner_id)
- #last try
- #server = ir_mail_server.search([("smtp_user", "=", email_address)])
- #if len(server) > 0:
- # user = self.env["res.users"].search([("ir_mail_server_id", "=", server[0].id)])
- # if len(user) > 0:
- # partner_id = Partner.browse(user[0].partner_id)
- # if partner_id.id not in partner_ids:
- # partner_ids.append(partner_id.id.id)
- if len(partner_ids) == 0:
- _logger.info("Partners not find for that contact " + contact)
- return partner_ids
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement