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'
|