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
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