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'