Пример #1
0
    def notify_program_learners(cls, enterprise_customer, program_details,
                                users):
        """
        Notify learners about a program in which they've been enrolled.

        Args:
            enterprise_customer: The EnterpriseCustomer being linked to
            program_details: Details about the specific program the learners were enrolled in
            users: An iterable of the users or pending users who were enrolled
        """
        program_name = program_details.get('title')
        program_branding = program_details.get('type')
        program_url = program_details.get('marketing_url')
        program_type = 'program'
        program_start = get_earliest_start_date_from_program(program_details)

        with mail.get_connection() as email_conn:
            for user in users:
                send_email_notification_message(
                    user=user,
                    enrolled_in={
                        'name': program_name,
                        'url': program_url,
                        'type': program_type,
                        'start': program_start,
                        'branding': program_branding,
                    },
                    enterprise_customer=enterprise_customer,
                    email_connection=email_conn)
Пример #2
0
 def test_send_email_notification_message(
     self,
     user,
     enrolled_in,
     enterprise_customer_name,
     expected_fields,
 ):
     """
     Test that we can successfully render and send an email message.
     """
     enrolled_in['start'] = datetime.datetime.strptime(
         enrolled_in['start'], '%Y-%m-%d')
     enterprise_customer = mock.MagicMock(site=mock.MagicMock(spec=[]))
     enterprise_customer.name = enterprise_customer_name
     if user is None:
         with raises(TypeError):
             utils.send_email_notification_message(user, enrolled_in,
                                                   enterprise_customer)
     else:
         conn = mail.get_connection()
         user_cls = user.pop('class')
         user = user_cls(**user)
         utils.send_email_notification_message(
             user,
             enrolled_in,
             enterprise_customer,
             email_connection=conn,
         )
         assert len(mail.outbox) == 1
         for field, val in expected_fields.items():
             assert getattr(mail.outbox[0], field) == val
         assert mail.outbox[0].connection is conn
Пример #3
0
    def notify_enrolled_learners(cls, enterprise_customer, request, course_id, users):
        """
        Notify learners about a course in which they've been enrolled.

        Args:
            enterprise_customer: The EnterpriseCustomer being linked to
            request: The HTTP request that's being processed
            course_id: The specific course the learners were enrolled in
            users: An iterable of the users or pending users who were enrolled
        """
        course_details = CourseCatalogApiClient(request.user).get_course_run(course_id)
        if not course_details:
            logging.warning(
                _(
                    "Course details were not found for course key {} - Course Catalog API returned nothing. "
                    "Proceeding with enrollment, but notifications won't be sent"
                ).format(course_id)
            )
            return
        course_url = course_details.get('marketing_url')
        if course_url is None:
            # If we didn't get a useful path to the course on a marketing site from the catalog API,
            # then we should build a path to the course on the LMS directly.
            course_url = get_reversed_url_by_site(
                request,
                enterprise_customer.site,
                'about_course',
                args=(course_id,),
            )
        course_name = course_details.get('title')

        try:
            course_start = parse_lms_api_datetime(course_details.get('start'))
        except (TypeError, ValueError):
            course_start = None
            logging.exception(
                "None or empty value passed as course start date.\nCourse Details:\n{course_details}".format(
                    course_details=course_details,
                )
            )

        with mail.get_connection() as email_conn:
            for user in users:
                send_email_notification_message(
                    user=user,
                    enrolled_in={
                        'name': course_name,
                        'url': course_url,
                        'type': 'course',
                        'start': course_start,
                    },
                    enterprise_customer=enterprise_customer,
                    email_connection=email_conn
                )
Пример #4
0
    def notify_program_learners(cls, enterprise_customer, program_details, users):
        """
        Notify learners about a program in which they've been enrolled.

        Args:
            enterprise_customer: The EnterpriseCustomer being linked to
            program_details: Details about the specific program the learners were enrolled in
            users: An iterable of the users or pending users who were enrolled
        """
        program_name = program_details.get('title')
        program_branding = program_details.get('type')
        program_uuid = program_details.get('uuid')

        lms_root_url = get_configuration_value_for_site(
            enterprise_customer.site,
            'LMS_ROOT_URL',
            settings.LMS_ROOT_URL
        )
        program_path = urlquote(
            '/dashboard/programs/{program_uuid}/?tpa_hint={tpa_hint}'.format(
                program_uuid=program_uuid,
                tpa_hint=enterprise_customer.identity_provider,
            )
        )
        destination_url = '{site}/{login_or_register}?next={program_path}'.format(
            site=lms_root_url,
            login_or_register='{login_or_register}',
            program_path=program_path
        )
        program_type = 'program'
        program_start = get_earliest_start_date_from_program(program_details)

        with mail.get_connection() as email_conn:
            for user in users:
                login_or_register = 'register' if isinstance(user, PendingEnterpriseCustomerUser) else 'login'
                destination_url = destination_url.format(login_or_register=login_or_register)
                send_email_notification_message(
                    user=user,
                    enrolled_in={
                        'name': program_name,
                        'url': destination_url,
                        'type': program_type,
                        'start': program_start,
                        'branding': program_branding,
                    },
                    enterprise_customer=enterprise_customer,
                    email_connection=email_conn
                )
Пример #5
0
 def test_send_email_notification_message_with_site_partially_defined_values(
     self,
     user,
     enrolled_in,
     enterprise_customer_name,
     subject_line,
     expected_fields,
 ):
     """
     Test ensures that, if only one of the templates has a defined value, we use
     the stock templates to avoid any confusion. Additionally, has some modifications
     to the stock values used elsewhere to make sure we hit other branches related
     to template string selection.
     """
     enrolled_in['start'] = datetime.datetime.strptime(
         enrolled_in['start'], '%Y-%m-%d')
     enterprise_customer = mock.MagicMock(
         enterprise_enrollment_template=mock.MagicMock(
             plaintext_template='',
             html_template='<b>hi there</b>',
             render_all_templates=mock.MagicMock(return_value=((
                 'plaintext_value',
                 '<b>HTML value</b>',
             ))),
             subject_line=subject_line),
         site=None)
     enterprise_customer.name = enterprise_customer_name
     if user is None:
         with raises(TypeError):
             utils.send_email_notification_message(user, enrolled_in,
                                                   enterprise_customer)
     else:
         conn = mail.get_connection()
         user_cls = user.pop('class')
         user = user_cls(**user)
         utils.send_email_notification_message(
             user,
             enrolled_in,
             enterprise_customer,
             email_connection=conn,
         )
         assert len(mail.outbox) == 1
         for field, val in expected_fields.items():
             assert getattr(mail.outbox[0], field) == val
         assert mail.outbox[0].connection is conn
Пример #6
0
    def test_send_email_notification_message_with_site_from_email_override(
            self, site_config_from_email_address, expected_from_email_address):
        """
        Test that we can successfully override a from email address per site.
        """
        user = UserFactory(username='******',
                           email='*****@*****.**',
                           first_name='sal')
        enrolled_in = {
            'name': 'Demo Course',
            'url': 'http://lms.example.com/courses',
            'type': 'course',
            'start': '2017-01-01'
        }
        enrolled_in['start'] = datetime.datetime.strptime(
            enrolled_in['start'], '%Y-%m-%d')

        site = SiteFactory()
        if site_config_from_email_address:
            site.configuration = mock.MagicMock(get_value=mock.MagicMock(
                return_value=site_config_from_email_address))

        enterprise_customer = mock.MagicMock(
            name='Example Corporation',
            enterprise_enrollment_template=mock.MagicMock(
                render_all_templates=mock.MagicMock(return_value=((
                    'plaintext_value',
                    '<b>HTML value</b>',
                ))),
                subject_line='New course! {course_name}!'),
            site=site)

        conn = mail.get_connection()
        utils.send_email_notification_message(
            user,
            enrolled_in,
            enterprise_customer,
            email_connection=conn,
        )

        assert len(mail.outbox) == 1
        assert getattr(mail.outbox[0],
                       'from_email') == expected_from_email_address
        assert mail.outbox[0].connection is conn
Пример #7
0
 def test_send_email_notification_message_with_site_defined_values(
     self,
     user,
     enrolled_in,
     enterprise_customer_name,
     expected_fields,
 ):
     """
     Test that we can successfully render and send an email message.
     """
     enrolled_in['start'] = datetime.datetime.strptime(
         enrolled_in['start'], '%Y-%m-%d')
     enterprise_customer = mock.MagicMock(
         enterprise_enrollment_template=mock.MagicMock(
             render_all_templates=mock.MagicMock(return_value=((
                 'plaintext_value',
                 '<b>HTML value</b>',
             ))),
             subject_line='New course! {course_name}!'),
         site=None)
     enterprise_customer.name = enterprise_customer_name
     if user is None:
         with raises(TypeError):
             utils.send_email_notification_message(user, enrolled_in,
                                                   enterprise_customer)
     else:
         conn = mail.get_connection()
         user_cls = user.pop('class')
         user = user_cls(**user)
         utils.send_email_notification_message(
             user,
             enrolled_in,
             enterprise_customer,
             email_connection=conn,
         )
         assert len(mail.outbox) == 1
         for field, val in expected_fields.items():
             assert getattr(mail.outbox[0], field) == val
         assert mail.outbox[0].connection is conn