Commit fac4e387 by Calen Pennington

Convert RecurringNudge emails to multiple tasks

parent f340f49a
...@@ -2,6 +2,7 @@ from __future__ import print_function ...@@ -2,6 +2,7 @@ from __future__ import print_function
import datetime import datetime
from celery import task
from dateutil.tz import tzutc, gettz from dateutil.tz import tzutc, gettz
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.test.utils import CaptureQueriesContext from django.test.utils import CaptureQueriesContext
...@@ -33,61 +34,79 @@ class ScheduleStartResolver(RecipientResolver): ...@@ -33,61 +34,79 @@ class ScheduleStartResolver(RecipientResolver):
self.target_start_date = target_start_date self.target_start_date = target_start_date
def send(self, msg_type): def send(self, msg_type):
for (user, language, context) in self.build_email_context(): schedule_day.delay(self.target_start_date)
msg = msg_type.personalize(
Recipient(
user.username,
user.email,
),
language,
context
)
ace.send(msg)
def build_email_context(self): def build_email_context(self):
schedules = Schedule.objects.select_related(
'enrollment__user__profile',
'enrollment__course',
).prefetch_related(
Prefetch(
'enrollment__course__modes',
queryset=CourseMode.objects.filter(mode_slug=CourseMode.VERIFIED),
to_attr='verified_modes'
),
Prefetch(
'enrollment__user__preferences',
queryset=UserPreference.objects.filter(key='time_zone'),
to_attr='tzprefs'
),
).filter(
start__year=self.target_start_date.year,
start__month=self.target_start_date.month,
start__day=self.target_start_date.day,
)
for schedule in schedules:
enrollment = schedule.enrollment
user = enrollment.user
user_time_zone = tzutc() @task
for preference in user.tzprefs: def schedule_day(target_date):
user_time_zone = gettz(preference.value) for hour in range(23):
schedule_hour.delay(target_date, hour)
course_id_str = str(enrollment.course_id)
course = enrollment.course
course_root = reverse('course_root', kwargs={'course_id': course_id_str}) @task
def schedule_hour(target_date, hour):
for minute in range(60):
schedule_minute.delay(target_date, hour, minute)
def absolute_url(relative_path):
return u'{}{}'.format(settings.LMS_ROOT_URL, relative_path)
template_context = { @task
'student_name': user.profile.name, def schedule_minute(target_date, hour, minute):
'course_name': course.display_name, for (user, language, context) in schedules_for_minute(target_date, hour, minute):
'course_url': absolute_url(course_root), msg = msg_type.personalize(
} Recipient(
user.username,
yield (user, course.language, template_context) user.email,
),
language,
context
)
ace.send.delay(msg)
def schedules_for_minute(target_date, hour, minute):
schedules = Schedule.objects.select_related(
'enrollment__user__profile',
'enrollment__course',
).prefetch_related(
Prefetch(
'enrollment__course__modes',
queryset=CourseMode.objects.filter(mode_slug=CourseMode.VERIFIED),
to_attr='verified_modes'
),
Prefetch(
'enrollment__user__preferences',
queryset=UserPreference.objects.filter(key='time_zone'),
to_attr='tzprefs'
),
).filter(
start__year=target_date.year,
start__month=target_date.month,
start__day=target_date.day,
start__hour=hour,
start__minute=minute,
)
for schedule in schedules:
enrollment = schedule.enrollment
user = enrollment.user
course_id_str = str(enrollment.course_id)
course = enrollment.course
course_root = reverse('course_root', kwargs={'course_id': course_id_str})
def absolute_url(relative_path):
return u'{}{}'.format(settings.LMS_ROOT_URL, relative_path)
template_context = {
'student_name': user.profile.name,
'course_name': course.display_name,
'course_url': absolute_url(course_root),
}
yield (user, course.language, template_context)
class Command(BaseCommand): class Command(BaseCommand):
......
from celery import task
@task
def send_email_batch(email_batch):
email_batch.send()
return 'foo'
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