diff --git a/tools/test-backend b/tools/test-backend index 75d70c62b6..6511f9ceb4 100755 --- a/tools/test-backend +++ b/tools/test-backend @@ -93,6 +93,8 @@ not_yet_fully_covered = { 'zerver/lib/test_fixtures.py', 'zerver/lib/test_runner.py', 'zerver/lib/api_test_helpers.py', + # Experimenatal + 'zerver/lib/widget.py', # Webhook integrations with incomplete coverage 'zerver/webhooks/basecamp/view.py', 'zerver/webhooks/beanstalk/view.py', diff --git a/zerver/lib/actions.py b/zerver/lib/actions.py index f54608abe8..0f32e0a2bd 100644 --- a/zerver/lib/actions.py +++ b/zerver/lib/actions.py @@ -88,6 +88,8 @@ from zerver.models import Realm, RealmEmoji, Stream, UserProfile, UserActivity, from zerver.lib.alert_words import alert_words_in_realm from zerver.lib.avatar import avatar_url, avatar_url_from_dict from zerver.lib.stream_recipient import StreamRecipientMap +from zerver.lib.widget import do_widget_post_save_actions, \ + get_fixed_content_for_widget from django.db import transaction, IntegrityError, connection from django.db.models import F, Q, Max, Sum @@ -1137,6 +1139,10 @@ def do_send_messages(messages_maybe_none: Sequence[Optional[MutableMapping[str, message['sender_queue_id'] = message.get('sender_queue_id', None) message['realm'] = message.get('realm', message['message'].sender.realm) + # Some widgets just overwrite content. + fixed_content = get_fixed_content_for_widget(message['message'].content) + message['message'].content = fixed_content + mention_data = bugdown.MentionData( realm_id=message['realm'].id, content=message['message'].content, @@ -1238,6 +1244,9 @@ def do_send_messages(messages_maybe_none: Sequence[Optional[MutableMapping[str, if Message.content_has_attachment(message['message'].content): do_claim_attachments(message['message']) + for message in messages: + do_widget_post_save_actions(message) + for message in messages: # Deliver events to the real-time push system, as well as # enqueuing any additional processing triggered by the message. diff --git a/zerver/lib/widget.py b/zerver/lib/widget.py new file mode 100644 index 0000000000..97c7d6bbd7 --- /dev/null +++ b/zerver/lib/widget.py @@ -0,0 +1,19 @@ +from typing import MutableMapping, Any +from django.conf import settings + +def get_fixed_content_for_widget(content: str) -> str: + if not settings.ALLOW_SUB_MESSAGES: + return content + + if content == '/stats': + return 'We are running **1 server**.' + + return content + +def do_widget_post_save_actions(message: MutableMapping[str, Any]) -> None: + ''' + This is experimental code that only works with the + webapp for now. + ''' + if not settings.ALLOW_SUB_MESSAGES: + return