odoo/ext/custom-addons/mailchimp/models/mailchimp_accounts.py

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