示例#1
0
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
示例#2
0
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)
示例#3
0
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
        )
示例#4
0
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)
示例#5
0
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)
示例#6
0
 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)
示例#7
0
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)
示例#8
0
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)
示例#9
0
 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")
示例#10
0
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
    )
示例#11
0
 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)
示例#12
0
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)
示例#13
0
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)
示例#14
0
 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)
示例#15
0
 def test_round_trip(self, date):
     serialized = serialize(date)
     parsed = deserialize(serialized)
     self.assertEqual(date, parsed)
示例#16
0
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