# -*- 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