def send_notifications(self, hours, url): mail_sender = self._services['mail_sender'] # Group users by board boards = {} for subscriber_bo in notifications.get_subscribers(): # FIXME: don't use the data directly subscriber = subscriber_bo.data boards.setdefault(subscriber.board.id, {'board': subscriber.board, 'subscribers': []})['subscribers'].append(subscriber) for board in boards.itervalues(): if not board['board'].archived: events = services.ActionLog.get_events_for_data(board['board'], hours) for subscriber in board['subscribers']: data = notifications.filter_events(events, subscriber) if not data: continue locale = UserManager.get_app_user(subscriber.user.username).get_locale() self.set_locale(locale) subject, content, content_html = notifications.generate_email(self.app_title, board['board'], subscriber.user, hours, url, data) mail_sender.send(subject, [subscriber.user.email], content, content_html) if self.activity_monitor: events = services.ActionLog.get_events_for_data(None, hours) new_users = UserManager.get_all_users(hours) if not (events or new_users): return h = xhtml5.Renderer() with h.html: h << h.h1('Boards') with h.ul: for event in events: notif = event.to_string() if event.card: # IDs are interpreted as anchors since HTML4. So don't use the ID of # the card as a URL fragment, because the browser # jumps to it. ev_url = urlparse.urljoin(url, event.board.url) id_ = '%s#id_card_%s' % (ev_url, event.card.id) notif = h.a(notif, href=id_, style='text-decoration: none;') h << h.li(u'%s : ' % (event.board.title), notif) h << h.h1('New users') with h.table(border=1): with h.tr: h << h.th('Login') h << h.th('Fullname') h << h.th('Email') h << h.th('Registration date') for usr in new_users: with h.tr: h << h.td(usr.username) h << h.td(usr.fullname) h << h.td(usr.email) h << h.td(usr.registration_date.isoformat()) mail_sender.send('Activity report for '+url, [self.activity_monitor], u'', h.root.write_htmlstring())
def test_rendering_security_view_board_1(self): """Test rendering security view board 1 Test rendering (Board private / user not logged) """ helpers.set_dummy_context() # to be able to create board board = helpers.create_board() board.set_visibility(board_module.BOARD_PRIVATE) helpers.set_context() with self.assertRaises(Unauthorized): component.Component(board).render(xhtml5.Renderer())
def test_rendering_security_view_board_3(self): """Test rendering security view board 3 Test rendering (Board public / user not logged) """ helpers.set_dummy_context() # for board creation board = helpers.create_board() helpers.set_context() # for realistic security check board.set_visibility(board_module.BOARD_PUBLIC) with i18n.Locale('en', 'US'): component.Component(board).render(xhtml5.Renderer())
def test_rendering_security_view_board_2(self): """Test rendering security view board 2 Test rendering (Board private / user member) """ helpers.set_dummy_context() # to be able to create board board = helpers.create_board() board.set_visibility(board_module.BOARD_PRIVATE) user = helpers.create_user('bis') helpers.set_context(user) data = board.data # don't collect data.members.append(user.data) with i18n.Locale('en', 'US'): component.Component(board).render(xhtml5.Renderer())
def test_rendering_security_view_board_2(self): """Test rendering security view board 2 Test rendering (Board private / user member) """ # stackless only if 'Stackless' not in sys.version: return helpers.set_dummy_context() # to be able to create board board = helpers.create_board() board.set_visibility(board_module.BOARD_PRIVATE) user = helpers.create_user('bis') helpers.set_context(user) board.add_member(user) with i18n.Locale('en', 'US'): component.Component(board).on_answer(lambda x: None).render(xhtml5.Renderer())