odoo/ext/custom-addons/mailchimp/controllers/mailchimp.py

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'