def test_basics(self) -> None: """ Verifies the basic behavior of modifying alert words. Also verifies the cache-flushing behavior. """ user = self.example_user('cordelia') realm_alert_words = alert_words_in_realm(user.realm) self.assert_length(realm_alert_words.get(user.id, []), 0) # Add several words, including multi-word and non-ascii words. do_add_alert_words(user, self.interesting_alert_word_list) words = user_alert_words(user) self.assertEqual(set(words), set(self.interesting_alert_word_list)) realm_alert_words = alert_words_in_realm(user.realm) self.assert_length(realm_alert_words[user.id], 3) # Test the case-insensitivity of adding words do_add_alert_words(user, set(["ALert", "ALERT"])) words = user_alert_words(user) self.assertEqual(set(words), set(self.interesting_alert_word_list)) realm_alert_words = alert_words_in_realm(user.realm) self.assert_length(realm_alert_words[user.id], 3) # Test the case-insensitivity of removing words do_remove_alert_words(user, set(["ALert"])) words = user_alert_words(user) self.assertEqual(set(words), set(self.interesting_alert_word_list) - {'alert'}) realm_alert_words = alert_words_in_realm(user.realm) self.assert_length(realm_alert_words[user.id], 2)
def do_convert(md, realm_domain=None, message=None): """Convert Markdown to HTML, with Zulip-specific settings and hacks.""" from zerver.models import get_active_user_dicts_in_realm, UserProfile if message: maybe_update_realm_filters(message.get_realm().domain) if realm_domain in md_engines: _md_engine = md_engines[realm_domain] else: _md_engine = md_engines["default"] # Reset the parser; otherwise it will get slower over time. _md_engine.reset() global current_message current_message = message # Pre-fetch data from the DB that is used in the bugdown thread global db_data if message: realm_users = get_active_user_dicts_in_realm(message.get_realm()) db_data = { 'realm_alert_words': alert_words.alert_words_in_realm(message.get_realm()), 'full_names': dict((user['full_name'].lower(), user) for user in realm_users), 'short_names': dict((user['short_name'].lower(), user) for user in realm_users), 'emoji': message.get_realm().get_emoji() } try: # Spend at most 5 seconds rendering. # Sometimes Python-Markdown is really slow; see # https://trac.zulip.net/ticket/345 return timeout(5, _md_engine.convert, md) except: from zerver.lib.actions import internal_send_message cleaned = _sanitize_for_log(md) # Output error to log as well as sending a zulip and email logging.getLogger('').error( 'Exception in Markdown parser: %sInput (sanitized) was: %s' % (traceback.format_exc(), cleaned)) subject = "Markdown parser failure on %s" % (platform.node(), ) if settings.ERROR_BOT is not None: internal_send_message( settings.ERROR_BOT, "stream", "errors", subject, "Markdown parser failed, email sent with details.") mail.mail_admins(subject, "Failed message: %s\n\n%s\n\n" % (cleaned, traceback.format_exc()), fail_silently=False) return None finally: current_message = None db_data = None
def do_convert(md, realm_domain=None, message=None): """Convert Markdown to HTML, with Zulip-specific settings and hacks.""" from zerver.models import get_active_user_dicts_in_realm, UserProfile if message: maybe_update_realm_filters(message.get_realm().domain) if realm_domain in md_engines: _md_engine = md_engines[realm_domain] else: _md_engine = md_engines["default"] # Reset the parser; otherwise it will get slower over time. _md_engine.reset() global current_message current_message = message # Pre-fetch data from the DB that is used in the bugdown thread global db_data if message: realm_users = get_active_user_dicts_in_realm(message.get_realm()) db_data = { "realm_alert_words": alert_words.alert_words_in_realm(message.get_realm()), "full_names": dict((user["full_name"].lower(), user) for user in realm_users), "short_names": dict((user["short_name"].lower(), user) for user in realm_users), "emoji": message.get_realm().get_emoji(), } try: # Spend at most 5 seconds rendering. # Sometimes Python-Markdown is really slow; see # https://trac.zulip.net/ticket/345 return timeout(5, _md_engine.convert, md) except: from zerver.lib.actions import internal_send_message cleaned = _sanitize_for_log(md) # Output error to log as well as sending a zulip and email logging.getLogger("").error( "Exception in Markdown parser: %sInput (sanitized) was: %s" % (traceback.format_exc(), cleaned) ) subject = "Markdown parser failure on %s" % (platform.node(),) if settings.ERROR_BOT is not None: internal_send_message( settings.ERROR_BOT, "stream", "errors", subject, "Markdown parser failed, email sent with details." ) mail.mail_admins( subject, "Failed message: %s\n\n%s\n\n" % (cleaned, traceback.format_exc()), fail_silently=False ) return None finally: current_message = None db_data = None
def test_realm_words(self) -> None: """ We can gather alert words for an entire realm via alert_words_in_realm. Alerts added for one user do not impact other users. """ user1 = self.example_user('cordelia') add_user_alert_words(user1, self.interesting_alert_word_list) user2 = self.example_user('othello') add_user_alert_words(user2, ['another']) realm_words = alert_words_in_realm(user2.realm) self.assertEqual(len(realm_words), 2) self.assertEqual(list(realm_words.keys()), [user1.id, user2.id]) self.assertEqual(realm_words[user1.id], self.interesting_alert_word_list) self.assertEqual(realm_words[user2.id], ['another'])
def test_realm_words(self) -> None: """ We can gather alert words for an entire realm via alert_words_in_realm. Alerts added for one user do not impact other users. """ user1 = self.example_user('cordelia') add_user_alert_words(user1, self.interesting_alert_word_list) user2 = self.example_user('othello') add_user_alert_words(user2, ['another']) realm_words = alert_words_in_realm(user2.realm) self.assertEqual(len(realm_words), 2) self.assertEqual(list(realm_words.keys()), [user1.id, user2.id]) self.assertEqual(realm_words[user1.id], self.interesting_alert_word_list) self.assertEqual(realm_words[user2.id], ['another'])
def test_realm_words(self): # type: () -> None """ We can gather alert words for an entire realm via alert_words_in_realm. Alerts added for one user do not impact other users. """ email = "*****@*****.**" user1 = get_user_profile_by_email(email) add_user_alert_words(user1, self.interesting_alert_word_list) email = "*****@*****.**" user2 = get_user_profile_by_email(email) add_user_alert_words(user2, ['another']) realm_words = alert_words_in_realm(user2.realm) self.assertEqual(len(realm_words), 2) self.assertEqual(list(realm_words.keys()), [user1.id, user2.id]) self.assertEqual(realm_words[user1.id], self.interesting_alert_word_list) self.assertEqual(realm_words[user2.id], ['another'])
def test_realm_words(self) -> None: """ We can gather alert words for an entire realm via alert_words_in_realm. Alerts added for one user do not impact other users. """ # Clear all the words that we got from populate_db. AlertWord.objects.all().delete() user1 = self.get_user() do_add_alert_words(user1, self.interesting_alert_word_list) user2 = self.example_user("othello") do_add_alert_words(user2, ["another"]) realm_words = alert_words_in_realm(user2.realm) self.assertEqual(len(realm_words), 2) self.assertEqual(set(realm_words.keys()), {user1.id, user2.id}) self.assertEqual(set(realm_words[user1.id]), set(self.interesting_alert_word_list)) self.assertEqual(set(realm_words[user2.id]), {"another"})