69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
"""
|
|
Synchronizes the announcement list with all active students.
|
|
"""
|
|
|
|
|
|
import logging
|
|
|
|
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
|
|
from django.core.management.base import BaseCommand
|
|
|
|
from .mailchimp_sync_course import connect_mailchimp, get_cleaned, get_subscribed, get_unsubscribed, subscribe_with_data
|
|
|
|
log = logging.getLogger('edx.mailchimp')
|
|
|
|
|
|
class Command(BaseCommand):
|
|
"""
|
|
Synchronizes the announcement list with all active students.
|
|
"""
|
|
help = 'Synchronizes the announcement list with all active students.'
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument('--key',
|
|
required=True,
|
|
help='mailchimp api key')
|
|
parser.add_argument('--list',
|
|
dest='list_id',
|
|
required=True,
|
|
help='mailchimp list id')
|
|
|
|
def handle(self, *args, **options):
|
|
key = options['key']
|
|
list_id = options['list_id']
|
|
|
|
log.info('Syncronizing announcement mailing list')
|
|
|
|
mailchimp = connect_mailchimp(key)
|
|
|
|
subscribed = get_subscribed(mailchimp, list_id)
|
|
unsubscribed = get_unsubscribed(mailchimp, list_id)
|
|
cleaned = get_cleaned(mailchimp, list_id)
|
|
non_subscribed = unsubscribed.union(cleaned)
|
|
|
|
enrolled = get_enrolled()
|
|
exclude = subscribed.union(non_subscribed)
|
|
to_subscribe = get_data(enrolled, exclude=exclude)
|
|
|
|
subscribe_with_data(mailchimp, list_id, to_subscribe)
|
|
|
|
|
|
def get_enrolled():
|
|
"""
|
|
Filter out all users who signed up via a Microsite, which UserSignupSource tracks
|
|
"""
|
|
## TODO (Feanil) This grabs all inactive students and MUST be changed (or, could exclude inactive users in get_data)
|
|
return User.objects.raw('SELECT * FROM auth_user where id not in (SELECT user_id from student_usersignupsource)')
|
|
|
|
|
|
def get_data(users, exclude=None):
|
|
"""
|
|
users: set of Django users
|
|
exclude [optional]: set of Django users to exclude
|
|
|
|
returns: {'EMAIL': u.email} for all users in users less those in `exclude`
|
|
"""
|
|
exclude = exclude if exclude else set()
|
|
emails = (u.email for u in users)
|
|
return ({'EMAIL': e} for e in emails if e not in exclude)
|