76 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
from odoo.http import request
 | 
						|
from odoo import http
 | 
						|
import logging
 | 
						|
import hashlib
 | 
						|
 | 
						|
_logger = logging.getLogger(__name__)
 | 
						|
 | 
						|
 | 
						|
class MailChimp(http.Controller):
 | 
						|
 | 
						|
    @http.route('/mailchimp/webhook/notification', type='http', auth="public", csrf=False)
 | 
						|
    def mailchimp_api(self, **kwargs):
 | 
						|
        # TODO : Work with multi databases.
 | 
						|
        contact_obj = request.env['mail.mass_mailing.contact'].sudo()
 | 
						|
        mass_mailling_obj = request.env['mail.mass_mailing'].sudo()
 | 
						|
        mailchimp_list_obj = request.env['mailchimp.lists'].sudo()
 | 
						|
        if kwargs.get('data[merges][EMAIL]', False):
 | 
						|
            email_address = kwargs['data[merges][EMAIL]']
 | 
						|
            mailchimp_id = kwargs['data[web_id]']
 | 
						|
            event = kwargs.get('type', False)
 | 
						|
            contact_id = contact_obj.search([('email', '=', email_address)])
 | 
						|
            mailchimp_list_id = mailchimp_list_obj.search([('list_id', '=', kwargs['data[list_id]'])])
 | 
						|
            name = "%s %s" % (kwargs.get('data[merges][FNAME]'), kwargs.get('data[merges][LNAME]'))
 | 
						|
            md5_email = hashlib.md5(email_address.encode('utf-8')).hexdigest()
 | 
						|
            merge_field_dict = {}
 | 
						|
            update_partner_required = True
 | 
						|
            for custom_field in mailchimp_list_id.merge_field_ids:
 | 
						|
                tag = custom_field.tag
 | 
						|
                if custom_field.type == 'address':
 | 
						|
                    address_dict = {
 | 
						|
                        'addr1': kwargs.get('data[merges][{}][addr1]'.format(tag), ''),
 | 
						|
                        'addr2': kwargs.get('data[merges][{}][addr2]'.format(tag), ''),
 | 
						|
                        'city': kwargs.get('data[merges][{}][city]'.format(tag), ''),
 | 
						|
                        'state': kwargs.get('data[merges][{}][state]'.format(tag), ''),
 | 
						|
                        'zip': kwargs.get('data[merges][{}][zip]'.format(tag), ''),
 | 
						|
                        'country': kwargs.get('data[merges][{}][country]'.format(tag), ''),
 | 
						|
                    }
 | 
						|
                    merge_field_dict.update({tag: address_dict})
 | 
						|
                else:
 | 
						|
                    merge_field_dict.update({tag: kwargs.get('data[merges][{}]'.format(tag), '')})
 | 
						|
            tag_ids = contact_id.fetch_specific_member_data(mailchimp_list_id, md5_email)
 | 
						|
            prepared_vals_for_create_partner = mailchimp_list_id._prepare_vals_for_to_create_partner(merge_field_dict)
 | 
						|
            prepared_vals_for_create_partner.update({'category_id': [(6, 0, tag_ids.ids)]})
 | 
						|
            if not contact_id:
 | 
						|
                if prepared_vals_for_create_partner:
 | 
						|
                    mailchimp_list_id.update_partner_detail(name, email_address, prepared_vals_for_create_partner)
 | 
						|
                update_partner_required = False
 | 
						|
                contact_id = contact_id.create({'name': name, 'email': email_address, 'country_id': prepared_vals_for_create_partner.get('country_id', False) or False})
 | 
						|
            if contact_id and kwargs.get('data[action]', '') != 'delete':
 | 
						|
                if tag_ids or not tag_ids and contact_id.tag_ids:
 | 
						|
                    contact_id.write({'tag_ids': [(6, 0, tag_ids.ids)]})
 | 
						|
                if update_partner_required:
 | 
						|
                    mailchimp_list_id.update_partner_detail(name, email_address, prepared_vals_for_create_partner)
 | 
						|
                vals = {'list_id': mailchimp_list_id.odoo_list_id.id, 'contact_id': contact_id.id, 'mailchimp_id': mailchimp_id, 'md5_email': md5_email}
 | 
						|
                existing_define_list = contact_id.subscription_list_ids.filtered(
 | 
						|
                    lambda x: x.list_id.id == mailchimp_list_id.odoo_list_id.id)
 | 
						|
                if existing_define_list:
 | 
						|
                    existing_define_list.write(vals)
 | 
						|
                else:
 | 
						|
                    contact_id.subscription_list_ids.create(vals)
 | 
						|
            if event == 'unsubscribe':
 | 
						|
                mass_mailling_obj.update_opt_out_ts(contact_id.email, mailchimp_list_id.odoo_list_id.ids, True)
 | 
						|
            elif event == 'subscribe':
 | 
						|
                mass_mailling_obj.update_opt_out_ts(contact_id.email, mailchimp_list_id.odoo_list_id.ids, False)
 | 
						|
            elif event == 'profile':
 | 
						|
                name = "%s %s" % (kwargs.get('data[merges][FNAME]'), kwargs.get('data[merges][LNAME]'))
 | 
						|
                contact_id.write({'name': name, 'email': kwargs.get('data[merges][EMAIL]')})
 | 
						|
            if kwargs.get('data[action]', '') == 'delete':
 | 
						|
                if len(contact_id.list_ids) > 1:
 | 
						|
                    contact_id.write({'list_ids': [(3, mailchimp_list_id.odoo_list_id.id)]})
 | 
						|
                else:
 | 
						|
                    contact_id.unlink()
 | 
						|
            request._cr.commit()
 | 
						|
            return 'SUCCESS'
 | 
						|
        return 'FAILURE'
 |