Example #1
0
def _get_course_email_context(course):
    """
    Returns context arguments to apply to all emails, independent of recipient.
    """
    course_id = str(course.id)
    course_title = course.display_name
    course_end_date = get_default_time_display(course.end)
    course_root = reverse('course_root', kwargs={'course_id': course_id})
    course_url = '{}{}'.format(
        settings.LMS_ROOT_URL,
        course_root
    )
    image_url = f'{settings.LMS_ROOT_URL}{course_image_url(course)}'
    lms_root_url = configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL)
    email_context = {
        'course_title': course_title,
        'course_root': course_root,
        'course_language': course.language,
        'course_url': course_url,
        'course_image_url': image_url,
        'course_end_date': course_end_date,
        'account_settings_url': '{}{}'.format(lms_root_url, reverse('account_settings')),
        'email_settings_url': '{}{}'.format(lms_root_url, reverse('dashboard')),
        'logo_url': get_logo_url_for_email(),
        'platform_name': configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME),
        'year': timezone.now().year,
    }
    return email_context
Example #2
0
def _get_asset_json(display_name, content_type, date, location,
                    thumbnail_location, locked):
    '''
    Helper method for formatting the asset information to send to client.
    '''
    asset_url = StaticContent.serialize_asset_key_with_slash(location)
    external_url = settings.LMS_BASE + asset_url
    return {
        'display_name':
        display_name,
        'content_type':
        content_type,
        'date_added':
        get_default_time_display(date),
        'url':
        asset_url,
        'external_url':
        external_url,
        'portable_url':
        StaticContent.get_static_path_from_location(location),
        'thumbnail':
        StaticContent.serialize_asset_key_with_slash(thumbnail_location)
        if thumbnail_location else None,
        'locked':
        locked,
        # needed for Backbone delete/update.
        'id':
        six.text_type(location)
    }
    def __init__(self, fake_email, num_sent, num_failed):
        super().__init__()
        self.created = get_default_time_display(fake_email.created)

        number_sent = str(num_sent) + ' sent'
        if num_failed > 0:
            number_sent += ', ' + str(num_failed) + " failed"

        self.number_sent = number_sent
        fake_email_dict = fake_email.to_dict()
        self.email = {feature: fake_email_dict[feature] for feature in self.EMAIL_FEATURES}
        self.requester = 'expected'
        self.sent_to = ['expected']
    def setUp(self):
        super().setUp()
        self.user = UserFactory.create(email="*****@*****.**",
                                       username="******",
                                       profile__name="Test User")
        self.course = CourseFactory.create(org='edx',
                                           course='999',
                                           display_name='test_course')

        self.context = {
            'user_id': self.user.id,
            'course_title': self.course.display_name,
            'name': self.user.profile.name,
            'course_end_date': get_default_time_display(self.course.end),
        }
Example #5
0
    def setUp(self):
        super(KeywordSubTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
        self.user = UserFactory.create(email="*****@*****.**",
                                       username="******",
                                       profile__name="Test User")
        self.course = CourseFactory.create(org='edx',
                                           course='999',
                                           display_name='test_course')

        self.context = {
            'user_id': self.user.id,
            'course_title': self.course.display_name,
            'name': self.user.profile.name,
            'course_end_date': get_default_time_display(self.course.end),
        }
Example #6
0
    def __init__(self, fake_email, num_sent, num_failed):
        super(FakeEmailInfo, self).__init__()  # lint-amnesty, pylint: disable=super-with-arguments
        self.created = get_default_time_display(fake_email.created)

        number_sent = str(num_sent) + ' sent'
        if num_failed > 0:
            number_sent += ', ' + str(num_failed) + " failed"

        self.number_sent = number_sent
        fake_email_dict = fake_email.to_dict()
        self.email = {
            feature: fake_email_dict[feature]
            for feature in self.EMAIL_FEATURES
        }
        self.requester = u'expected'
        self.sent_to = [u'expected']
Example #7
0
 def default(self, obj):
     if isinstance(obj, datetime):
         return get_default_time_display(obj)
     return json.JSONEncoder.default(self, obj)
Example #8
0
def extract_email_features(email_task):
    """
    From the given task, extract email content information

    Expects that the given task has the following attributes:
    * task_input (dict containing email_id)
    * task_output (optional, dict containing total emails sent)
    * requester, the user who executed the task

    With this information, gets the corresponding email object from the
    bulk emails table, and loads up a dict containing the following:
    * created, the time the email was sent displayed in default time display
    * sent_to, the group the email was delivered to
    * email, dict containing the subject, id, and html_message of an email
    * number_sent, int number of emails sent
    * requester, the user who sent the emails
    If task_input cannot be loaded, then the email cannot be loaded
    and None is returned for these fields.
    """
    # Load the task input info to get email id
    try:
        task_input_information = json.loads(email_task.task_input)
    except ValueError:
        log.error(u"Could not parse task input as valid json; task input: %s", email_task.task_input)
        return email_error_information()

    email = CourseEmail.objects.get(id=task_input_information['email_id'])
    email_feature_dict = {
        'created': get_default_time_display(email.created),
        'sent_to': [target.long_display() for target in email.targets.all()],
        'requester': str(email_task.requester),
    }
    features = ['subject', 'html_message', 'id']
    email_info = {feature: six.text_type(getattr(email, feature)) for feature in features}

    # Pass along email as an object with the information we desire
    email_feature_dict['email'] = email_info

    # Translators: number sent refers to the number of emails sent
    number_sent = _('0 sent')
    if hasattr(email_task, 'task_output') and email_task.task_output is not None:
        try:
            task_output = json.loads(email_task.task_output)
        except ValueError:
            log.error(u"Could not parse task output as valid json; task output: %s", email_task.task_output)
        else:
            if 'succeeded' in task_output and task_output['succeeded'] > 0:
                num_emails = task_output['succeeded']
                number_sent = ungettext(
                    u"{num_emails} sent",
                    u"{num_emails} sent",
                    num_emails
                ).format(num_emails=num_emails)

            if 'failed' in task_output and task_output['failed'] > 0:
                num_emails = task_output['failed']
                number_sent += ", "
                number_sent += ungettext(
                    u"{num_emails} failed",
                    u"{num_emails} failed",
                    num_emails
                ).format(num_emails=num_emails)

    email_feature_dict['number_sent'] = number_sent
    return email_feature_dict
Example #9
0
def test_get_default_time_display_no_tzname():
    assert get_default_time_display(None) == ""
    test_time = datetime(1992, 3, 12, 15, 3, 30, tzinfo=NamelessTZ())
    assert get_default_time_display(test_time) == "Mar 12, 1992 at 15:03-0300"
Example #10
0
def test_get_dflt_time_disp_notz():
    test_time = datetime(1992, 3, 12, 15, 3, 30)
    assert get_default_time_display(test_time) == "Mar 12, 1992 at 15:03 UTC"
Example #11
0
def test_get_default_time_display():
    assert get_default_time_display(None) == ""
    test_time = datetime(1992, 3, 12, 15, 3, 30, tzinfo=utc)
    assert get_default_time_display(test_time) == "Mar 12, 1992 at 15:03 UTC"
Example #12
0
 def default(self, obj):  # lint-amnesty, pylint: disable=arguments-differ
     if isinstance(obj, datetime):
         return get_default_time_display(obj)
     return json.JSONEncoder.default(self, obj)