Source code for cms_qe_newsletter.external_services.mailchimp.client
from collections.abc import Iterable
from constance import config
# pylint:disable=global-variable-undefined
[docs]class MailchimpIsNotSetException(Exception):
pass
[docs]class MailChimpClient:
"""
Helper class to communicate with MailChimp.
"""
def __init__(self) -> None:
"""
Checking if MailChimp API key and username is configured and return a MailChimp API client.
"""
username = config.MAILCHIMP_USERNAME
api_key = config.MAILCHIMP_API_KEY
if api_key and username:
# Dynamic import so it's possible to mock.
from mailchimp3 import MailChimp # pylint:disable=import-outside-toplevel
self.client = MailChimp(mc_user=username, mc_api=api_key)
else:
raise MailchimpIsNotSetException('API key or username for mailchimp is not set.')
[docs] def get_lists(self) -> Iterable[str]:
"""
:return: List of lists with fields ``id`` and ``name``.
"""
return self.client.lists.all(get_all=True, fields='lists.name,lists.id')
[docs] def subscribe(self, mailing_list_id, email, first_name, last_name) -> None:
"""
Add a subscriber and return the id (subscriber_hash).
"""
new_subscriber = self.client.lists.members.create(mailing_list_id, {
'email_address': email,
'status': 'subscribed',
'merge_fields': {
'FNAME': first_name,
'LNAME': last_name,
},
})
return new_subscriber['id']
[docs] def unsubscribe(self, mailing_list_id, subscriber_hash) -> None:
"""
Remove a subscriber.
"""
self.client.lists.members.delete(mailing_list_id, subscriber_hash)