Commit 5df1ffeb by Will Daly

Add header row to email opt in list; add default date

parent 8a685cec
...@@ -22,6 +22,7 @@ The command will always use the read replica database if one is configured. ...@@ -22,6 +22,7 @@ The command will always use the read replica database if one is configured.
import os.path import os.path
import csv import csv
import time import time
import datetime
import contextlib import contextlib
import logging import logging
...@@ -48,13 +49,16 @@ class Command(BaseCommand): ...@@ -48,13 +49,16 @@ class Command(BaseCommand):
"full_name", "full_name",
"course_id", "course_id",
"is_opted_in_for_email", "is_opted_in_for_email",
"preference_set_date" "preference_set_datetime"
] ]
# Number of records to read at a time when making # Number of records to read at a time when making
# multiple queries over a potentially large dataset. # multiple queries over a potentially large dataset.
QUERY_INTERVAL = 1000 QUERY_INTERVAL = 1000
# Default datetime if the user has not set a preference
DEFAULT_DATETIME_STR = datetime.datetime(year=2014, month=12, day=1).isoformat(' ')
def handle(self, *args, **options): def handle(self, *args, **options):
"""Execute the command. """Execute the command.
...@@ -183,6 +187,8 @@ class Command(BaseCommand): ...@@ -183,6 +187,8 @@ class Command(BaseCommand):
""" """
writer = csv.DictWriter(file_handle, fieldnames=self.OUTPUT_FIELD_NAMES) writer = csv.DictWriter(file_handle, fieldnames=self.OUTPUT_FIELD_NAMES)
writer.writeheader()
cursor = self._db_cursor() cursor = self._db_cursor()
query = ( query = (
u""" u"""
...@@ -207,7 +213,7 @@ class Command(BaseCommand): ...@@ -207,7 +213,7 @@ class Command(BaseCommand):
AND `user_id`=user.`id` AND `user_id`=user.`id`
ORDER BY modified DESC ORDER BY modified DESC
LIMIT 1 LIMIT 1
) AS `preference_set_date` ) AS `preference_set_datetime`
FROM FROM
student_courseenrollment AS enrollment student_courseenrollment AS enrollment
LEFT JOIN auth_user AS user ON user.id=enrollment.user_id LEFT JOIN auth_user AS user ON user.id=enrollment.user_id
...@@ -222,13 +228,13 @@ class Command(BaseCommand): ...@@ -222,13 +228,13 @@ class Command(BaseCommand):
cursor.execute(query) cursor.execute(query)
row_count = 0 row_count = 0
for row in self._iterate_results(cursor): for row in self._iterate_results(cursor):
email, full_name, course_id, is_opted_in, pref_set_date = row email, full_name, course_id, is_opted_in, pref_set_datetime = row
writer.writerow({ writer.writerow({
"email": email.encode('utf-8'), "email": email.encode('utf-8'),
"full_name": full_name.encode('utf-8'), "full_name": full_name.encode('utf-8'),
"course_id": course_id.encode('utf-8'), "course_id": course_id.encode('utf-8'),
"is_opted_in_for_email": is_opted_in if is_opted_in else "True", "is_opted_in_for_email": is_opted_in if is_opted_in else "True",
"preference_set_date": pref_set_date, "preference_set_datetime": pref_set_datetime if pref_set_datetime else self.DEFAULT_DATETIME_STR,
}) })
row_count += 1 row_count += 1
......
...@@ -45,9 +45,11 @@ class EmailOptInListTest(ModuleStoreTestCase): ...@@ -45,9 +45,11 @@ class EmailOptInListTest(ModuleStoreTestCase):
"full_name", "full_name",
"course_id", "course_id",
"is_opted_in_for_email", "is_opted_in_for_email",
"preference_set_date" "preference_set_datetime"
] ]
DEFAULT_DATETIME_STR = "2014-12-01 00:00:00"
def setUp(self): def setUp(self):
self.user = UserFactory.create( self.user = UserFactory.create(
username=self.USER_USERNAME, username=self.USER_USERNAME,
...@@ -299,7 +301,7 @@ class EmailOptInListTest(ModuleStoreTestCase): ...@@ -299,7 +301,7 @@ class EmailOptInListTest(ModuleStoreTestCase):
""" """
profile_api.update_email_opt_in(user.username, org, is_opted_in) profile_api.update_email_opt_in(user.username, org, is_opted_in)
def _latest_pref_set_date(self, user): def _latest_pref_set_datetime(self, user):
"""Retrieve the latest opt-in preference for the user, """Retrieve the latest opt-in preference for the user,
across all orgs and preference keys. across all orgs and preference keys.
...@@ -307,11 +309,11 @@ class EmailOptInListTest(ModuleStoreTestCase): ...@@ -307,11 +309,11 @@ class EmailOptInListTest(ModuleStoreTestCase):
user (User): The user whos preference was set. user (User): The user whos preference was set.
Returns: Returns:
ISO-formatted date string or empty string ISO-formatted datetime string or empty string
""" """
pref = UserOrgTag.objects.filter(user=user).order_by("-modified") pref = UserOrgTag.objects.filter(user=user).order_by("-modified")
return pref[0].modified.isoformat(' ') if len(pref) > 0 else "" return pref[0].modified.isoformat(' ') if len(pref) > 0 else self.DEFAULT_DATETIME_STR
def _run_command(self, org, other_names=None, only_courses=None, query_interval=None): def _run_command(self, org, other_names=None, only_courses=None, query_interval=None):
"""Execute the management command to generate the email opt-in list. """Execute the management command to generate the email opt-in list.
...@@ -374,8 +376,7 @@ class EmailOptInListTest(ModuleStoreTestCase): ...@@ -374,8 +376,7 @@ class EmailOptInListTest(ModuleStoreTestCase):
*args: Tuples of (user, course_id, opt_in_pref) *args: Tuples of (user, course_id, opt_in_pref)
Keyword Arguments: Keyword Arguments:
expect_pref_datetime (bool): If false, expect an empty expect_pref_datetime (bool): If false, expect the default datetime.
string for the preference.
Returns: Returns:
None None
...@@ -384,16 +385,27 @@ class EmailOptInListTest(ModuleStoreTestCase): ...@@ -384,16 +385,27 @@ class EmailOptInListTest(ModuleStoreTestCase):
AssertionError AssertionError
""" """
self.assertEqual(len(output), len(args)) self.assertEqual(len(output), len(args) + 1)
# Check the header row
self.assertEqual({
"email": "email",
"full_name": "full_name",
"course_id": "course_id",
"is_opted_in_for_email": "is_opted_in_for_email",
"preference_set_datetime": "preference_set_datetime"
}, output[0])
# Check data rows
for user, course_id, opt_in_pref in args: for user, course_id, opt_in_pref in args:
self.assertIn({ self.assertIn({
"email": user.email.encode('utf-8'), "email": user.email.encode('utf-8'),
"full_name": user.profile.name.encode('utf-8'), "full_name": user.profile.name.encode('utf-8'),
"course_id": unicode(course_id).encode('utf-8'), "course_id": unicode(course_id).encode('utf-8'),
"is_opted_in_for_email": unicode(opt_in_pref), "is_opted_in_for_email": unicode(opt_in_pref),
"preference_set_date": ( "preference_set_datetime": (
self._latest_pref_set_date(self.user) self._latest_pref_set_datetime(self.user)
if kwargs.get("expect_pref_datetime", True) if kwargs.get("expect_pref_datetime", True)
else "" else self.DEFAULT_DATETIME_STR
) )
}, output) }, output[1:])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment