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
|