def _build_message_context(context): message_context = get_base_template_context(context['site']) message_context.update(context) thread_author = User.objects.get(id=context['thread_author_id']) comment_author = User.objects.get(id=context['comment_author_id']) message_context.update({ 'thread_username': thread_author.username, 'comment_username': comment_author.username, 'post_link': _get_thread_url(context), 'comment_created_at': date.deserialize(context['comment_created_at']), 'thread_created_at': date.deserialize(context['thread_created_at']) }) return message_context
def update_course_schedules(self, **kwargs): course_key = CourseKey.from_string(kwargs['course_id']) new_start_date = deserialize(kwargs['new_start_date_str']) new_upgrade_deadline = deserialize(kwargs['new_upgrade_deadline_str']) try: Schedule.objects.filter(enrollment__course_id=course_key).update( start=new_start_date, upgrade_deadline=new_upgrade_deadline ) except Exception as exc: if not isinstance(exc, KNOWN_RETRY_ERRORS): LOG.exception("Unexpected failure: task id: %s, kwargs=%s".format(self.request.id, kwargs)) raise self.retry(kwargs=kwargs, exc=exc)
def _track_notification_sent(message, context): """ Send analytics event for a sent email """ properties = { 'app_label': 'discussion', 'name': 'responsenotification', # This is 'Campaign' in GA 'language': message.language, 'uuid': unicode(message.uuid), 'send_uuid': unicode(message.send_uuid), 'thread_id': context['thread_id'], 'course_id': unicode(context['course_id']), 'thread_created_at': date.deserialize(context['thread_created_at']), 'nonInteraction': 1, } tracking_context = { 'host': context['site'].domain, 'path': '/', # make up a value, in order to allow the host to be passed along. } # The event used to specify the user_id as being the recipient of the email (i.e. the thread_author_id). # This has the effect of interrupting the actual chain of events for that author, if any, while the # email-sent event should really be associated with the sender, since that is what triggers the event. with tracker.get_tracker().context(properties['app_label'], tracking_context): segment.track( user_id=context['thread_author_id'], event_name='edx.bi.email.sent', properties=properties )
def course_update_schedule_bin( site_id, target_day_str, day_offset, bin_num, org_list, exclude_orgs=False, override_recipient_email=None, ): target_datetime = deserialize(target_day_str) # TODO: in the next refactor of this task, pass in current_datetime instead of reproducing it here current_datetime = target_datetime - datetime.timedelta(days=day_offset) msg_type = CourseUpdate() site = Site.objects.get(id=site_id) _annotate_for_monitoring(msg_type, site, bin_num, target_day_str, day_offset) for (user, language, context) in _course_update_schedules_for_bin( site, current_datetime, target_datetime, day_offset, bin_num, org_list, exclude_orgs ): msg = msg_type.personalize( Recipient( user.username, override_recipient_email or user.email, ), language, context, ) with function_trace('enqueue_send_task'): _course_update_schedule_send.apply_async((site_id, str(msg)), retry=False)
def recurring_nudge_schedule_bin( site_id, target_day_str, day_offset, bin_num, org_list, exclude_orgs=False, override_recipient_email=None, ): target_datetime = deserialize(target_day_str) # TODO: in the next refactor of this task, pass in current_datetime instead of reproducing it here current_datetime = target_datetime - datetime.timedelta(days=day_offset) msg_type = RecurringNudge(abs(day_offset)) for (user, language, context) in _recurring_nudge_schedules_for_bin( Site.objects.get(id=site_id), current_datetime, target_datetime, bin_num, org_list, exclude_orgs ): msg = msg_type.personalize( Recipient( user.username, override_recipient_email or user.email, ), language, context, ) _recurring_nudge_schedule_send.apply_async((site_id, str(msg)), retry=False)
def run( self, site_id, target_day_str, day_offset, bin_num, override_recipient_email=None, ): msg_type = self.make_message_type(day_offset) site = Site.objects.select_related('configuration').get(id=site_id) _annotate_for_monitoring(msg_type, site, bin_num, target_day_str, day_offset) return self.resolver( self.async_send_task, site, deserialize(target_day_str), day_offset, bin_num, override_recipient_email=override_recipient_email, ).send(msg_type)
def recurring_nudge_schedule_hour( site_id, day, target_hour_str, org_list, exclude_orgs=False, override_recipient_email=None, ): target_hour = deserialize(target_hour_str) msg_type = RecurringNudge(day) for (user, language, context) in _recurring_nudge_schedules_for_hour(target_hour, org_list, exclude_orgs): msg = msg_type.personalize( Recipient( user.username, override_recipient_email or user.email, ), language, context, ) _recurring_nudge_schedule_send.apply_async((site_id, str(msg)), retry=False)
def _track_notification_sent(message, context): """ Send analytics event for a sent email """ properties = { 'app_label': 'discussion', 'name': 'responsenotification', # This is 'Campaign' in GA 'language': message.language, 'uuid': unicode(message.uuid), 'send_uuid': unicode(message.send_uuid), 'thread_id': context['thread_id'], 'thread_created_at': date.deserialize(context['thread_created_at']), 'nonInteraction': 1, } analytics.track(user_id=context['thread_author_id'], event='edx.bi.email.sent', course_id=context['course_id'], properties=properties)
def run( # pylint: disable=arguments-differ self, site_id, course_key_str, target_day_str, day_offset, override_recipient_email=None, ): try: site = Site.objects.select_related('configuration').get(id=site_id) with emulate_http_request(site=site): msg_type = self.make_message_type(day_offset) _annotate_for_monitoring(msg_type, course_key_str, target_day_str, day_offset) return self.resolver( # pylint: disable=not-callable self.async_send_task, site, CourseKey.from_string(course_key_str), deserialize(target_day_str), day_offset, override_recipient_email=override_recipient_email, ).send(msg_type) except Exception: # pylint: disable=broad-except LOG.exception("Task failed")
def _track_notification_sent(message, context): """ Send analytics event for a sent email """ properties = { 'app_label': 'discussion', 'name': 'responsenotification', # This is 'Campaign' in GA 'language': message.language, 'uuid': unicode(message.uuid), 'send_uuid': unicode(message.send_uuid), 'thread_id': context['thread_id'], 'thread_created_at': date.deserialize(context['thread_created_at']) } analytics.track( user_id=context['thread_author_id'], event='edx.bi.email.sent', course_id=context['course_id'], properties=properties )
def run( self, site_id, target_day_str, day_offset, bin_num, override_recipient_email=None, ): msg_type = self.make_message_type(day_offset) site = Site.objects.select_related('configuration').get(id=site_id) _annotate_for_monitoring(msg_type, site, bin_num, target_day_str, day_offset) return self.resolver( self.async_send_task, site, deserialize(target_day_str), day_offset, bin_num, override_recipient_email=override_recipient_email, ).send(msg_type)
def recurring_nudge_schedule_hour( site_id, day, target_hour_str, org_list, exclude_orgs=False, override_recipient_email=None, ): target_hour = deserialize(target_hour_str) msg_type = RecurringNudge(day) for (user, language, context) in _recurring_nudge_schedules_for_hour( Site.objects.get(id=site_id), target_hour, org_list, exclude_orgs ): msg = msg_type.personalize( Recipient( user.username, override_recipient_email or user.email, ), language, context, ) _recurring_nudge_schedule_send.apply_async((site_id, str(msg)), retry=False)
def upgrade_reminder_schedule_bin( site_id, target_day_str, day_offset, bin_num, org_list, exclude_orgs=False, override_recipient_email=None, ): target_day = deserialize(target_day_str) msg_type = UpgradeReminder() for (user, language, context) in _upgrade_reminder_schedules_for_bin( Site.objects.get(id=site_id), target_day, bin_num, org_list, exclude_orgs ): msg = msg_type.personalize( Recipient( user.username, override_recipient_email or user.email, ), language, context, ) _upgrade_reminder_schedule_send.apply_async((site_id, str(msg)), retry=False)
def run( # lint-amnesty, pylint: disable=arguments-differ self, site_id, target_day_str, day_offset, bin_num, override_recipient_email=None, ): set_code_owner_attribute_from_module(__name__) site = Site.objects.select_related('configuration').get(id=site_id) with emulate_http_request(site=site): msg_type = self.make_message_type(day_offset) _annotate_for_monitoring(msg_type, site, bin_num, target_day_str, day_offset) return self.resolver( # lint-amnesty, pylint: disable=not-callable self.async_send_task, site, deserialize(target_day_str), day_offset, bin_num, override_recipient_email=override_recipient_email, ).send(msg_type)
def test_round_trip(self, date): serialized = serialize(date) parsed = deserialize(serialized) self.assertEqual(date, parsed)
def _deserialize_context_dates(context): context['comment_created_at'] = date.deserialize( context['comment_created_at']) context['thread_created_at'] = date.deserialize( context['thread_created_at']) return context