Exemple #1
0
    def test_underscore(self):
        """
        Tests on the UnderscoreStaticFileRenderer
        """

        renderer = TestUnderscoreStaticFileRenderer(
            'basic_subject_body.underscore')

        self.assertTrue(renderer.can_render_format(RENDER_FORMAT_HTML))

        msg_type = NotificationType(
            name='open-edx.edx_notifications.lib.tests.test_publisher',
            renderer=
            'edx_notifications.renderers.basic.BasicSubjectBodyRenderer',
        )
        register_notification_type(msg_type)

        self.assertIsNotNone(get_renderer_for_type(msg_type))
        msg = NotificationMessage(namespace='test-runner',
                                  msg_type=msg_type,
                                  payload={
                                      'subject': 'test subject',
                                      'body': 'test body',
                                  },
                                  created=datetime.datetime.now(pytz.UTC))

        renderer.get_template_path(RENDER_FORMAT_HTML)

        with self.assertRaises(NotImplementedError):
            renderer.get_template_path(RENDER_FORMAT_SMS)

        with self.assertRaises(NotImplementedError):
            renderer.render(msg, RENDER_FORMAT_SMS, None)

        html = renderer.render(msg, RENDER_FORMAT_HTML, None)

        with self.assertRaises(NotImplementedError):
            renderer.get_template_path(RENDER_FORMAT_SMS)

        self.assertIn('test subject', html)
        self.assertIn('test body', html)
        self.assertIn("<div class='xns-title'>", html)
        self.assertIn("<div class='xns-body'>", html)

        with self.assertRaises(Exception):
            bad_renderer = TestUnderscoreStaticFileRenderer('foo.underscore')
            bad_renderer.render(msg, RENDER_FORMAT_HTML, None)
    def test_underscore(self):
        """
        Tests on the UnderscoreStaticFileRenderer
        """

        renderer = TestUnderscoreStaticFileRenderer('basic_subject_body.underscore')

        self.assertTrue(renderer.can_render_format(RENDER_FORMAT_HTML))

        msg_type = NotificationType(
            name='open-edx.edx_notifications.lib.tests.test_publisher',
            renderer='edx_notifications.renderers.basic.BasicSubjectBodyRenderer',
        )
        register_notification_type(msg_type)

        self.assertIsNotNone(get_renderer_for_type(msg_type))
        msg = NotificationMessage(
            namespace='test-runner',
            msg_type=msg_type,
            payload={
                'subject': 'test subject',
                'body': 'test body',
            },
            created=datetime.datetime.now(pytz.UTC)
        )

        renderer.get_template_path(RENDER_FORMAT_HTML)

        with self.assertRaises(NotImplementedError):
            renderer.get_template_path(RENDER_FORMAT_SMS)

        with self.assertRaises(NotImplementedError):
            renderer.render(msg, RENDER_FORMAT_SMS, None)

        html = renderer.render(msg, RENDER_FORMAT_HTML, None)

        with self.assertRaises(NotImplementedError):
            renderer.get_template_path(RENDER_FORMAT_SMS)

        self.assertIn('test subject', html)
        self.assertIn('test body', html)
        self.assertIn("<div class='xns-title'>", html)
        self.assertIn("<div class='xns-body'>", html)

        with self.assertRaises(Exception):
            bad_renderer = TestUnderscoreStaticFileRenderer('foo.underscore')
            bad_renderer.render(msg, RENDER_FORMAT_HTML, None)
def get_group_rendering(group_data):
    """
    returns the list of the sorted user notifications renderings.
    """
    notification_renderings = []

    group_data = sorted(group_data, key=lambda k: k.msg.created)

    for user_msg in group_data:
        notification_html = ''
        renderer = get_renderer_for_type(user_msg.msg.msg_type)
        if renderer and renderer.can_render_format(const.RENDER_FORMAT_HTML):
            notification_html = renderer.render(  # pylint: disable=unused-variable
                user_msg.msg,
                const.RENDER_FORMAT_HTML,
                None
            )
        else:
            log.info(
                'Missing renderer for HTML format on '
                'msg_type "{}". Skipping....'.format(user_msg.msg.msg_type.name)
            )

        click_link = user_msg.msg.payload.get('_click_link')
        if click_link and not click_link.startswith('http'):
            click_link = const.NOTIFICATION_EMAIL_CLICK_LINK_URL_FORMAT.format(
                url_path=click_link,
                encoded_url_path=urllib.quote(click_link),
                user_msg_id=user_msg.id,
                msg_id=user_msg.msg.id,
                hostname=const.NOTIFICATION_APP_HOSTNAME
            )

        notification_renderings.append(
            {
                'user_msg': user_msg,
                'msg': user_msg.msg,
                'click_link': click_link,
                # render the particular NotificationMessage
                'html': notification_html,
                'group_name': get_group_name_for_msg_type(user_msg.msg.msg_type.name)
            }
        )

    return notification_renderings
def get_group_rendering(group_data):
    """
    returns the list of the sorted user notifications renderings.
    """
    notification_renderings = []

    group_data = sorted(group_data, key=lambda k: k.msg.created)

    for user_msg in group_data:
        notification_html = ''
        renderer = get_renderer_for_type(user_msg.msg.msg_type)
        if renderer and renderer.can_render_format(const.RENDER_FORMAT_HTML):
            notification_html = renderer.render(  # pylint: disable=unused-variable
                user_msg.msg,
                const.RENDER_FORMAT_HTML,
                None
            )
        else:
            log.info(
                'Missing renderer for HTML format on '
                'msg_type "{}". Skipping....'.format(user_msg.msg.msg_type.name)
            )

        click_link = user_msg.msg.payload.get('_click_link')
        if click_link and not click_link.startswith('http'):
            click_link = const.NOTIFICATION_EMAIL_CLICK_LINK_URL_FORMAT.format(
                url_path=click_link,
                encoded_url_path=urllib.quote(click_link),
                user_msg_id=user_msg.id,
                msg_id=user_msg.msg.id,
                hostname=const.NOTIFICATION_APP_HOSTNAME
            )

        notification_renderings.append(
            {
                'user_msg': user_msg,
                'msg': user_msg.msg,
                'click_link': click_link,
                # render the particular NotificationMessage
                'html': notification_html,
                'group_name': get_group_name_for_msg_type(user_msg.msg.msg_type.name)
            }
        )

    return notification_renderings
    def dispatch_notification_to_user(self, user_id, msg, channel_context=None):
        """
        Send a notification to a user, which - in a TriggerEmailChannel Notification
        """

        # call into one of the registered resolvers to get the email for this
        # user
        scope_results = resolve_user_scope(
            'user_email_resolver',
            {
                'user_id': user_id,
                'fields': {
                    'user_id': True,
                    'email': True,
                    'first_name': True,
                    'last_name': True,
                }
            }
        )
        msg = self._get_linked_resolved_msg(msg)
        msg.created = datetime.datetime.now(pytz.UTC)

        user_msg = UserNotification(
            user_id=user_id,
            msg=msg
        )
        config = const.NOTIFICATION_DIGEST_GROUP_CONFIG
        for result in scope_results:
            #
            # Do the rendering and the sending of the email
            #
            if isinstance(result, dict):
                email = result['email']
            else:
                email = result

            renderer = get_renderer_for_type(user_msg.msg.msg_type)
            notification_html = ''
            if renderer and renderer.can_render_format(const.RENDER_FORMAT_HTML):
                notification_html = renderer.render(  # pylint: disable=unused-variable
                    user_msg.msg,
                    const.RENDER_FORMAT_HTML,
                    None
                )
            # create the image dictionary to store the
            # img_path, unique id and title for the image.
            branded_logo = dict(title='Logo', path=const.NOTIFICATION_BRANDED_DEFAULT_LOGO, cid=str(uuid.uuid4()))

            group_name = get_group_name_for_msg_type(user_msg.msg.msg_type.name)
            resolve_links = user_msg.msg.resolve_links
            click_link = user_msg.msg.payload['_click_link']

            if resolve_links and not click_link.startswith('http'):
                click_link = const.NOTIFICATION_EMAIL_CLICK_LINK_URL_FORMAT.format(
                    url_path=click_link,
                    encoded_url_path=urllib.quote(click_link),
                    user_msg_id=user_msg.id,
                    msg_id=user_msg.msg.id,
                    hostname=const.NOTIFICATION_APP_HOSTNAME
                )

            context = {
                'branded_logo': branded_logo['cid'],
                'notification_html': notification_html,
                'user_first_name': result['first_name'] if isinstance(result, dict) else None,
                'user_last_name': result['last_name'] if isinstance(result, dict) else None,
                'group_name': group_name,
                'group_title': config['groups'][group_name]['display_name'],
                'click_link': click_link
            }

            # render the notifications html template
            email_body = with_inline_css(
                render_to_string("django/triggered_notification_email/triggered_email.html", context))

            html_part = MIMEMultipart(_subtype='related')
            html_part.attach(MIMEText(email_body, _subtype='html'))
            logo_image = attach_image(branded_logo, 'Header Logo')
            if logo_image:
                html_part.attach(logo_image)

            log.info('Sending Notification email to {email}'.format(email=email))

            msg = EmailMessage(const.NOTIFICATION_TRIGGERED_EMAIL_SUBJECT, None,
                               const.NOTIFICATION_EMAIL_FROM_ADDRESS, [email])
            msg.attach(html_part)
            msg.send()
        return user_msg
Exemple #6
0
    def dispatch_notification_to_user(self,
                                      user_id,
                                      msg,
                                      channel_context=None):
        """
        Send a notification to a user, which - in a TriggerEmailChannel Notification
        """

        # call into one of the registered resolvers to get the email for this
        # user
        scope_results = resolve_user_scope(
            'user_email_resolver', {
                'user_id': user_id,
                'fields': {
                    'user_id': True,
                    'email': True,
                    'first_name': True,
                    'last_name': True,
                }
            })
        msg = self._get_linked_resolved_msg(msg)
        msg.created = datetime.datetime.now(pytz.UTC)

        user_msg = UserNotification(user_id=user_id, msg=msg)
        config = const.NOTIFICATION_DIGEST_GROUP_CONFIG
        for result in scope_results:
            #
            # Do the rendering and the sending of the email
            #
            if isinstance(result, dict):
                email = result['email']
            else:
                email = result

            renderer = get_renderer_for_type(user_msg.msg.msg_type)
            notification_html = ''
            if renderer and renderer.can_render_format(
                    const.RENDER_FORMAT_HTML):
                notification_html = renderer.render(  # pylint: disable=unused-variable
                    user_msg.msg, const.RENDER_FORMAT_HTML, None)
            # create the image dictionary to store the
            # img_path, unique id and title for the image.
            branded_logo = dict(title='Logo',
                                path=const.NOTIFICATION_BRANDED_DEFAULT_LOGO,
                                cid=str(uuid.uuid4()))

            group_name = get_group_name_for_msg_type(
                user_msg.msg.msg_type.name)
            resolve_links = user_msg.msg.resolve_links
            click_link = user_msg.msg.payload['_click_link']

            if resolve_links and not click_link.startswith('http'):
                click_link = const.NOTIFICATION_EMAIL_CLICK_LINK_URL_FORMAT.format(
                    url_path=click_link,
                    encoded_url_path=six.moves.urllib.parse.quote(click_link),
                    user_msg_id=user_msg.id,
                    msg_id=user_msg.msg.id,
                    hostname=const.NOTIFICATION_APP_HOSTNAME)

            context = {
                'branded_logo':
                branded_logo['cid'],
                'notification_html':
                notification_html,
                'user_first_name':
                result['first_name'] if isinstance(result, dict) else None,
                'user_last_name':
                result['last_name'] if isinstance(result, dict) else None,
                'group_name':
                group_name,
                'group_title':
                config['groups'][group_name]['display_name'],
                'click_link':
                click_link
            }

            # render the notifications html template
            email_body = with_inline_css(
                render_to_string(
                    "django/triggered_notification_email/triggered_email.html",
                    context))

            html_part = MIMEMultipart(_subtype='related')
            html_part.attach(MIMEText(email_body, _subtype='html'))
            logo_image = attach_image(branded_logo, 'Header Logo')
            if logo_image:
                html_part.attach(logo_image)

            log.info('Sending Notification email to %s', email)

            msg = EmailMessage(const.NOTIFICATION_TRIGGERED_EMAIL_SUBJECT, '',
                               const.NOTIFICATION_EMAIL_FROM_ADDRESS, [email])
            msg.attach(html_part)
            msg.send()
        return user_msg