* Initial lms changes for Sailthru * Fix identified code quality issues * Fix migration failure * Fix code quality identified issue
148 lines
5.8 KiB
Python
148 lines
5.8 KiB
Python
"""
|
|
This file contains celery tasks for email marketing signal handler.
|
|
"""
|
|
import logging
|
|
import time
|
|
|
|
from celery import task
|
|
from django.contrib.auth.models import User
|
|
|
|
from email_marketing.models import EmailMarketingConfiguration
|
|
|
|
from sailthru.sailthru_client import SailthruClient
|
|
from sailthru.sailthru_error import SailthruClientError
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
# pylint: disable=not-callable
|
|
@task(bind=True, default_retry_delay=3600, max_retries=24)
|
|
def update_user(self, username, new_user=False, activation=False):
|
|
"""
|
|
Adds/updates Sailthru profile information for a user.
|
|
Args:
|
|
username(str): A string representation of user identifier
|
|
Returns:
|
|
None
|
|
"""
|
|
email_config = EmailMarketingConfiguration.current()
|
|
if not email_config.enabled:
|
|
return
|
|
|
|
# get user
|
|
user = User.objects.select_related('profile').get(username=username)
|
|
if not user:
|
|
log.error("User not found during Sailthru update %s", username)
|
|
return
|
|
|
|
# get profile
|
|
profile = user.profile
|
|
if not profile:
|
|
log.error("User profile not found during Sailthru update %s", username)
|
|
return
|
|
|
|
sailthru_client = SailthruClient(email_config.sailthru_key, email_config.sailthru_secret)
|
|
try:
|
|
sailthru_response = sailthru_client.api_post("user",
|
|
_create_sailthru_user_parm(user, profile, new_user, email_config))
|
|
except SailthruClientError as exc:
|
|
log.error("Exception attempting to add/update user %s in Sailthru - %s", username, unicode(exc))
|
|
raise self.retry(exc=exc,
|
|
countdown=email_config.sailthru_retry_interval,
|
|
max_retries=email_config.sailthru_max_retries)
|
|
|
|
if not sailthru_response.is_ok():
|
|
error = sailthru_response.get_error()
|
|
# put out error and schedule retry
|
|
log.error("Error attempting to add/update user in Sailthru: %s", error.get_message())
|
|
raise self.retry(countdown=email_config.sailthru_retry_interval,
|
|
max_retries=email_config.sailthru_max_retries)
|
|
|
|
# if activating user, send welcome email
|
|
if activation and email_config.sailthru_activation_template:
|
|
try:
|
|
sailthru_response = sailthru_client.api_post("send",
|
|
{"email": user.email,
|
|
"template": email_config.sailthru_activation_template})
|
|
except SailthruClientError as exc:
|
|
log.error("Exception attempting to send welcome email to user %s in Sailthru - %s", username, unicode(exc))
|
|
raise self.retry(exc=exc,
|
|
countdown=email_config.sailthru_retry_interval,
|
|
max_retries=email_config.sailthru_max_retries)
|
|
|
|
if not sailthru_response.is_ok():
|
|
error = sailthru_response.get_error()
|
|
# probably an invalid template name, just put out error
|
|
log.error("Error attempting to send welcome email to user in Sailthru: %s", error.get_message())
|
|
|
|
|
|
# pylint: disable=not-callable
|
|
@task(bind=True, default_retry_delay=3600, max_retries=24)
|
|
def update_user_email(self, username, old_email):
|
|
"""
|
|
Adds/updates Sailthru when a user email address is changed
|
|
Args:
|
|
username(str): A string representation of user identifier
|
|
old_email(str): Original email address
|
|
Returns:
|
|
None
|
|
"""
|
|
email_config = EmailMarketingConfiguration.current()
|
|
if not email_config.enabled:
|
|
return
|
|
|
|
# get user
|
|
user = User.objects.get(username=username)
|
|
if not user:
|
|
log.error("User not found duing Sailthru update %s", username)
|
|
return
|
|
|
|
# ignore if email not changed
|
|
if user.email == old_email:
|
|
return
|
|
|
|
sailthru_parms = {"id": old_email, "key": "email", "keysconflict": "merge", "keys": {"email": user.email}}
|
|
|
|
try:
|
|
sailthru_client = SailthruClient(email_config.sailthru_key, email_config.sailthru_secret)
|
|
sailthru_response = sailthru_client.api_post("user", sailthru_parms)
|
|
except SailthruClientError as exc:
|
|
log.error("Exception attempting to update email for %s in Sailthru - %s", username, unicode(exc))
|
|
raise self.retry(exc=exc,
|
|
countdown=email_config.sailthru_retry_interval,
|
|
max_retries=email_config.sailthru_max_retries)
|
|
|
|
if not sailthru_response.is_ok():
|
|
error = sailthru_response.get_error()
|
|
log.error("Error attempting to update user email address in Sailthru: %s", error.get_message())
|
|
raise self.retry(countdown=email_config.sailthru_retry_interval,
|
|
max_retries=email_config.sailthru_max_retries)
|
|
|
|
|
|
def _create_sailthru_user_parm(user, profile, new_user, email_config):
|
|
"""
|
|
Create sailthru user create/update parms from user + profile.
|
|
"""
|
|
sailthru_user = {'id': user.email, 'key': 'email'}
|
|
sailthru_vars = {'username': user.username,
|
|
'activated': int(user.is_active),
|
|
'joined_date': user.date_joined.strftime("%Y-%m-%d")}
|
|
sailthru_user['vars'] = sailthru_vars
|
|
sailthru_vars['last_changed_time'] = int(time.time())
|
|
|
|
if profile:
|
|
sailthru_vars['fullname'] = profile.name
|
|
sailthru_vars['gender'] = profile.gender
|
|
sailthru_vars['education'] = profile.level_of_education
|
|
# age is not useful since it is not automatically updated
|
|
#sailthru_vars['age'] = profile.age or -1
|
|
if profile.year_of_birth:
|
|
sailthru_vars['year_of_birth'] = profile.year_of_birth
|
|
sailthru_vars['country'] = unicode(profile.country.code)
|
|
|
|
# if new user add to list
|
|
if new_user and email_config.sailthru_new_user_list:
|
|
sailthru_user['lists'] = {email_config.sailthru_new_user_list: 1}
|
|
|
|
return sailthru_user
|