94 lines
3.5 KiB
Python
94 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
import json
|
|
import time
|
|
import requests
|
|
from email.utils import formataddr
|
|
from odoo import api, fields, models, _
|
|
from odoo.tools.safe_eval import safe_eval
|
|
from odoo.exceptions import ValidationError, Warning
|
|
|
|
|
|
class MailChimpAccounts(models.Model):
|
|
_name = "mailchimp.accounts"
|
|
|
|
name = fields.Char("Name", required=True, copy=False, help="Name of your MailChimp account")
|
|
|
|
# Authentication
|
|
api_key = fields.Char('API Key', required=True, copy=False)
|
|
auto_refresh_member = fields.Boolean("Auto Sync Member?", copy=False, default=True)
|
|
auto_create_member = fields.Boolean("Auto Create Member?", copy=False, default=True)
|
|
auto_create_partner = fields.Boolean("Auto Create Customer?", copy=False, default=False)
|
|
list_ids = fields.One2many('mailchimp.lists', 'account_id', string="Lists/Audience", copy=False)
|
|
campaign_ids = fields.One2many('mail.mass_mailing', 'mailchimp_account_id', string="Campaigns", copy=False)
|
|
|
|
_sql_constraints = [
|
|
('api_keys_uniq', 'unique(api_key)', 'API keys must be unique per MailChimp Account!'),
|
|
]
|
|
|
|
@api.model
|
|
def _send_request(self, request_url, request_data, params=False, method='GET'):
|
|
if '-' not in self.api_key:
|
|
raise ValidationError(_("MailChimp API key is invalid!"))
|
|
if len(self.api_key.split('-')) > 2:
|
|
raise ValidationError(_("MailChimp API key is invalid!"))
|
|
|
|
api_key, dc = self.api_key.split('-')
|
|
headers = {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
data = json.dumps(request_data)
|
|
api_url = "https://{dc}.api.mailchimp.com/3.0/{url}".format(dc=dc, url=request_url)
|
|
try:
|
|
req = requests.request(method, api_url, auth=('apikey', api_key), headers=headers, params=params, data=data)
|
|
req.raise_for_status()
|
|
response_text = req.text
|
|
except requests.HTTPError as e:
|
|
raise Warning("%s" % req.text)
|
|
response = json.loads(response_text) if response_text else {}
|
|
return response
|
|
|
|
@api.multi
|
|
def get_refresh_member_action(self):
|
|
action = self.env.ref('base.ir_cron_act').read()[0]
|
|
refresh_member_cron = self.env.ref('mailchimp.fetch_member')
|
|
if refresh_member_cron:
|
|
action['views'] = [(False, 'form')]
|
|
action['res_id'] = refresh_member_cron.id
|
|
else:
|
|
raise ValidationError(_("Scheduled action isn't found! Please upgrade app to get it back!"))
|
|
return action
|
|
|
|
def covert_date(self, value):
|
|
before_date = value[:19]
|
|
coverted_date = time.strptime(before_date, "%Y-%m-%dT%H:%M:%S")
|
|
final_date = time.strftime("%Y-%m-%d %H:%M:%S", coverted_date)
|
|
return final_date
|
|
|
|
@api.multi
|
|
def import_lists(self):
|
|
mailchimp_lists = self.env['mailchimp.lists']
|
|
for account in self:
|
|
mailchimp_lists.import_lists(account)
|
|
return True
|
|
|
|
@api.multi
|
|
def import_templates(self):
|
|
mailchimp_templates = self.env['mailchimp.templates']
|
|
for account in self:
|
|
mailchimp_templates.import_templates(account)
|
|
return True
|
|
|
|
@api.multi
|
|
def import_campaigns(self):
|
|
mass_mailing_obj = self.env['mail.mass_mailing']
|
|
for account in self:
|
|
mass_mailing_obj.import_campaigns(account)
|
|
return True
|
|
|
|
@api.one
|
|
def test_connection(self):
|
|
response = self._send_request('lists', {})
|
|
if response:
|
|
raise Warning("Test Connection Succeeded")
|
|
return True
|