193 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
import re
 | 
						|
import hashlib
 | 
						|
from datetime import datetime
 | 
						|
from odoo import api, fields, models, _
 | 
						|
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
 | 
						|
 | 
						|
EMAIL_PATTERN = '([^ ,;<@]+@[^> ,;]+)'
 | 
						|
 | 
						|
 | 
						|
def _partner_split_name(partner_name):
 | 
						|
    return [' '.join(partner_name.split()[:-1]), ' '.join(partner_name.split()[-1:])]
 | 
						|
 | 
						|
 | 
						|
class massMailingContact(models.Model):
 | 
						|
    _inherit = "mail.mass_mailing.contact"
 | 
						|
 | 
						|
    @api.multi
 | 
						|
    def get_partner(self, email):
 | 
						|
        query = """
 | 
						|
                SELECT id 
 | 
						|
                  FROM res_partner
 | 
						|
                WHERE LOWER(substring(email, '([^ ,;<@]+@[^> ,;]+)')) = LOWER(substring('{}', '([^ ,;<@]+@[^> ,;]+)'))""".format(email)
 | 
						|
        self._cr.execute(query)
 | 
						|
        return self._cr.fetchone() or False
 | 
						|
 | 
						|
    @api.model
 | 
						|
    def create(self, vals):
 | 
						|
        res = super(massMailingContact, self).create(vals)
 | 
						|
        if vals.get('email', False):
 | 
						|
            partner_record = self.get_partner(vals.get('email'))
 | 
						|
            res.related_partner_id = partner_record
 | 
						|
        return res
 | 
						|
 | 
						|
    @api.multi
 | 
						|
    def write(self, vals):
 | 
						|
        if vals.get('email', False) and not self._context.get('do_not_update', False):
 | 
						|
            partner_record = self.get_partner(vals.get('email'))
 | 
						|
            vals.update({'related_partner_id': partner_record})
 | 
						|
        res = super(massMailingContact, self).write(vals)
 | 
						|
        return res
 | 
						|
 | 
						|
    @api.depends('subscription_list_ids', 'subscription_list_ids.mailchimp_id', 'subscription_list_ids.list_id')
 | 
						|
    def _get_pending_for_export(self):
 | 
						|
        available_mailchimp_lists = self.env['mailchimp.lists'].search([])
 | 
						|
        lists = available_mailchimp_lists.mapped('odoo_list_id').ids
 | 
						|
        for record in self:
 | 
						|
            if record.subscription_list_ids.filtered(lambda x: x.list_id.id in lists and not x.mailchimp_id):
 | 
						|
                record.pending_for_export = True
 | 
						|
            else:
 | 
						|
                record.pending_for_export = False
 | 
						|
 | 
						|
    @api.depends('email')
 | 
						|
    def _compute_is_email_valid(self):
 | 
						|
        for record in self:
 | 
						|
            record.is_email_valid = re.match(EMAIL_PATTERN, record.email)
 | 
						|
 | 
						|
    @api.depends('email')
 | 
						|
    def _compute_related_partner_id(self):
 | 
						|
        for record in self:
 | 
						|
            query = """
 | 
						|
            SELECT id 
 | 
						|
              FROM res_partner
 | 
						|
            WHERE LOWER(substring(email, '([^ ,;<@]+@[^> ,;]+)')) = LOWER(substring('{}', '([^ ,;<@]+@[^> ,;]+)'))""".format(record.email)
 | 
						|
            self._cr.execute(query)
 | 
						|
            partner_record = self._cr.fetchone()
 | 
						|
            if partner_record:
 | 
						|
                record.related_partner_id = partner_record[0]
 | 
						|
            else:
 | 
						|
                record.related_partner_id = False
 | 
						|
 | 
						|
    is_email_valid = fields.Boolean(compute='_compute_is_email_valid', store=True)
 | 
						|
    pending_for_export = fields.Boolean(compute="_get_pending_for_export", string="Pending For Export", store=True)
 | 
						|
    related_partner_id = fields.Many2one('res.partner', 'Related Customer', compute="_compute_related_partner_id", help='Display related customer by matching Email address.', store=True)
 | 
						|
    subscription_list_ids = fields.One2many('mail.mass_mailing.list_contact_rel', 'contact_id', string='Subscription Information')
 | 
						|
 | 
						|
    def _prepare_vals_for_merge_fields(self, mailchimp_list_id):
 | 
						|
        self.ensure_one()
 | 
						|
        merge_fields_vals = {}
 | 
						|
        partner_id = self.related_partner_id
 | 
						|
        for custom_field in mailchimp_list_id.merge_field_ids:
 | 
						|
            if custom_field.type == 'address' and partner_id:
 | 
						|
                address = {'addr1': partner_id.street or '',
 | 
						|
                           'addr2': partner_id.street2 or '',
 | 
						|
                           'city': partner_id.city or '',
 | 
						|
                           'state': partner_id.state_id.name if partner_id.state_id else '',
 | 
						|
                           'zip': partner_id.zip,
 | 
						|
                           'country': partner_id.country_id.code if partner_id.country_id else ''}
 | 
						|
                merge_fields_vals.update({custom_field.tag: address})
 | 
						|
            elif custom_field.tag == 'FNAME':
 | 
						|
                merge_fields_vals.update({custom_field.tag: _partner_split_name(self.name)[0] if _partner_split_name(self.name)[0] else _partner_split_name(self.name)[1]})
 | 
						|
            elif custom_field.tag == 'LNAME':
 | 
						|
                merge_fields_vals.update({custom_field.tag: _partner_split_name(self.name)[1] if _partner_split_name(self.name)[0] else _partner_split_name(self.name)[0]})
 | 
						|
            elif custom_field.type in ['date', 'birthday']:
 | 
						|
                value = getattr(partner_id or self, custom_field.field_id.name) if custom_field.field_id and hasattr(partner_id or self, custom_field.field_id.name) else ''
 | 
						|
                if value:
 | 
						|
                    value = datetime.strptime(value, DEFAULT_SERVER_DATETIME_FORMAT).strftime(custom_field.date_format)
 | 
						|
                    # value = value.strftime(custom_field.date_format)
 | 
						|
                merge_fields_vals.update({custom_field.tag: value or ''})
 | 
						|
            else:
 | 
						|
                value = getattr(partner_id or self, custom_field.field_id.name) if custom_field.field_id and hasattr(partner_id or self, custom_field.field_id.name) else ''
 | 
						|
                merge_fields_vals.update({custom_field.tag: value or ''})
 | 
						|
        return merge_fields_vals
 | 
						|
 | 
						|
    @api.multi
 | 
						|
    def action_export_to_mailchimp(self):
 | 
						|
        available_mailchimp_lists = self.env['mailchimp.lists'].search([])
 | 
						|
        lists = available_mailchimp_lists.mapped('odoo_list_id').ids
 | 
						|
        for record in self:
 | 
						|
            lists_to_export = record.subscription_list_ids.filtered(
 | 
						|
                lambda x: x.list_id.id in lists and not x.mailchimp_id)
 | 
						|
            for list in lists_to_export:
 | 
						|
                mailchimp_list_id = list.list_id.mailchimp_list_id
 | 
						|
                merge_fields_vals = record._prepare_vals_for_merge_fields(mailchimp_list_id)
 | 
						|
                # address = ''
 | 
						|
                # phone = ''
 | 
						|
                # partner_id = record.related_partner_id
 | 
						|
                # if partner_id:
 | 
						|
                #     address = {'addr1': partner_id.street or '',
 | 
						|
                #                'addr2': partner_id.street2 or '',
 | 
						|
                #                'city': partner_id.city or '',
 | 
						|
                #                'state': partner_id.state_id.name if partner_id.state_id else '',
 | 
						|
                #                'zip': partner_id.zip,
 | 
						|
                #                'country': partner_id.country_id.code if partner_id.country_id else ''}
 | 
						|
                #     phone = partner_id.phone or partner_id.mobile
 | 
						|
                prepared_vals = {"email_address": record.email.lower(),
 | 
						|
                                 "status": "unsubscribed" if record.opt_out else "subscribed",
 | 
						|
                                 "merge_fields": merge_fields_vals,
 | 
						|
                                 "tags": [tag.name for tag in record.tag_ids]}
 | 
						|
                response = mailchimp_list_id.account_id._send_request('lists/%s/members' % mailchimp_list_id.list_id,
 | 
						|
                                                                      prepared_vals, method='POST')
 | 
						|
                if response.get('web_id', False):
 | 
						|
                    email_address = response.get('email_address')
 | 
						|
                    md5_email = hashlib.md5(email_address.encode('utf-8')).hexdigest()
 | 
						|
                    list.write({'mailchimp_id': response.get('web_id', False), 'md5_email': md5_email})
 | 
						|
        return True
 | 
						|
 | 
						|
    @api.multi
 | 
						|
    def action_update_to_mailchimp(self):
 | 
						|
        available_mailchimp_lists = self.env['mailchimp.lists'].search([])
 | 
						|
        lists = available_mailchimp_lists.mapped('odoo_list_id').ids
 | 
						|
        for record in self:
 | 
						|
            lists_to_export = record.subscription_list_ids.filtered(
 | 
						|
                lambda x: x.list_id.id in lists and x.mailchimp_id)
 | 
						|
            for list in lists_to_export:
 | 
						|
                mailchimp_list_id = list.list_id.mailchimp_list_id
 | 
						|
                merge_fields_vals = record._prepare_vals_for_merge_fields(mailchimp_list_id)
 | 
						|
                # partner_id = record.related_partner_id
 | 
						|
                # address = ''
 | 
						|
                # phone = ''
 | 
						|
                # if partner_id:
 | 
						|
                #     address = {'addr1': partner_id.street or '',
 | 
						|
                #                'addr2': partner_id.street2 or '',
 | 
						|
                #                'city': partner_id.city or '',
 | 
						|
                #                'state': partner_id.state_id.name if partner_id.state_id else '',
 | 
						|
                #                'zip': partner_id.zip,
 | 
						|
                #                'country': partner_id.country_id.code if partner_id.country_id else ''}
 | 
						|
                #     phone = partner_id.phone or partner_id.mobile
 | 
						|
                prepared_vals = {"email_address": record.email.lower(),
 | 
						|
                                 "status": "unsubscribed" if record.opt_out else "subscribed",
 | 
						|
                                 'merge_fields': merge_fields_vals, }
 | 
						|
                response = mailchimp_list_id.account_id._send_request(
 | 
						|
                    'lists/%s/members/%s' % (mailchimp_list_id.list_id, list.md5_email),
 | 
						|
                    prepared_vals, method='PATCH')
 | 
						|
                tag_res = record.update_tag_on_mailchimp(response, mailchimp_list_id, list.md5_email)
 | 
						|
                if response.get('web_id', False):
 | 
						|
                    email_address = response.get('email_address')
 | 
						|
                    md5_email = hashlib.md5(email_address.encode('utf-8')).hexdigest()
 | 
						|
                    list.write({'mailchimp_id': response.get('web_id', False), 'md5_email': md5_email})
 | 
						|
        return True
 | 
						|
 | 
						|
    def update_tag_on_mailchimp(self, response, mailchimp_list_id, md5_email):
 | 
						|
        tag_list = []
 | 
						|
        tags = response.get('tags', []) and [tag['name'] for tag in response.get('tags', [])] or []
 | 
						|
        tag_name_list = self.tag_ids.mapped('name')
 | 
						|
        unique_tags = list(set(tags + tag_name_list))
 | 
						|
        for tag in unique_tags:
 | 
						|
            if tag in tag_name_list:
 | 
						|
                tag_dict = {'name': tag, 'status': 'active'}
 | 
						|
            else:
 | 
						|
                tag_dict = {'name': tag, 'status': 'inactive'}
 | 
						|
            tag_list.append(tag_dict)
 | 
						|
        tag_vals = {'tags': tag_list}
 | 
						|
        tag_res = mailchimp_list_id.account_id._send_request('lists/%s/members/%s/tags' % (mailchimp_list_id.list_id, md5_email), tag_vals, method='POST')
 | 
						|
        return tag_res
 | 
						|
 | 
						|
    def fetch_specific_member_data(self, mailchimp_list_id, md5_email):
 | 
						|
        member_response = mailchimp_list_id.account_id._send_request('lists/%s/members/%s' % (mailchimp_list_id.list_id, md5_email), {}, method='GET')
 | 
						|
        tag_list = member_response.get('tags', [])
 | 
						|
        tag_ids = self.env['res.partner.category']
 | 
						|
        if tag_list:
 | 
						|
            tag_ids = self.env['res.partner.category'].create_or_update_tags(tag_list)
 | 
						|
        return tag_ids
 |