def test_add_muted_topic(self) -> None: user = self.example_user('hamlet') self.login(user.email) stream = get_stream('Verona', user.realm) url = '/api/v1/users/me/subscriptions/muted_topics' payloads = [ {'stream': stream.name, 'topic': 'Verona3', 'op': 'add'}, {'stream_id': stream.id, 'topic': 'Verona3', 'op': 'add'}, ] for data in payloads: result = self.api_patch(user.email, url, data) self.assert_json_success(result) self.assertIn([stream.name, 'Verona3'], get_topic_mutes(user)) self.assertTrue(topic_is_muted(user, stream.id, 'Verona3')) self.assertTrue(topic_is_muted(user, stream.id, 'verona3')) remove_topic_mute( user_profile=user, stream_id=stream.id, topic_name='Verona3', )
def test_add_muted_topic(self) -> None: user = self.example_user('hamlet') self.login_user(user) stream = get_stream('Verona', user.realm) url = '/api/v1/users/me/subscriptions/muted_topics' payloads = [ {'stream': stream.name, 'topic': 'Verona3', 'op': 'add'}, {'stream_id': stream.id, 'topic': 'Verona3', 'op': 'add'}, ] mock_date_muted = datetime(2020, 1, 1, tzinfo=timezone.utc).timestamp() for data in payloads: with mock.patch('zerver.views.muting.timezone_now', return_value=datetime(2020, 1, 1, tzinfo=timezone.utc)): result = self.api_patch(user, url, data) self.assert_json_success(result) self.assertIn([stream.name, 'Verona3', mock_date_muted], get_topic_mutes(user)) self.assertTrue(topic_is_muted(user, stream.id, 'Verona3')) self.assertTrue(topic_is_muted(user, stream.id, 'verona3')) remove_topic_mute( user_profile=user, stream_id=stream.id, topic_name='Verona3', )
def test_add_muted_topic(self) -> None: user = self.example_user('hamlet') self.login_user(user) stream = get_stream('Verona', user.realm) url = '/api/v1/users/me/subscriptions/muted_topics' payloads = [ { 'stream': stream.name, 'topic': 'Verona3', 'op': 'add' }, { 'stream_id': stream.id, 'topic': 'Verona3', 'op': 'add' }, ] for data in payloads: result = self.api_patch(user, url, data) self.assert_json_success(result) self.assertIn([stream.name, 'Verona3'], get_topic_mutes(user)) self.assertTrue(topic_is_muted(user, stream.id, 'Verona3')) self.assertTrue(topic_is_muted(user, stream.id, 'verona3')) remove_topic_mute( user_profile=user, stream_id=stream.id, topic_name='Verona3', )
def update_muted_topic(request, user_profile, stream=REQ(), topic=REQ(), op=REQ()): # type: (HttpRequest, UserProfile, str, str, str) -> HttpResponse if op == 'add': if topic_is_muted(user_profile, stream, topic): return json_error(_("Topic already muted")) elif op == 'remove': if not topic_is_muted(user_profile, stream, topic): return json_error(_("Topic is not there in the muted_topics list")) do_update_muted_topic(user_profile, stream, topic, op) return json_success()
def test_add_muted_topic(self) -> None: email = self.example_email('hamlet') self.login(email) url = '/api/v1/users/me/subscriptions/muted_topics' data = {'stream': 'Verona', 'topic': 'Verona3', 'op': 'add'} result = self.api_patch(email, url, data) self.assert_json_success(result) user = self.example_user('hamlet') self.assertIn([u'Verona', u'Verona3'], get_topic_mutes(user)) stream = get_stream(u'Verona', user.realm) self.assertTrue(topic_is_muted(user, stream.id, 'Verona3')) self.assertTrue(topic_is_muted(user, stream.id, 'verona3'))
def test_remove_muted_topic(self) -> None: user = self.example_user("hamlet") realm = user.realm self.login_user(user) stream = get_stream("Verona", realm) recipient = stream.recipient url = "/api/v1/users/me/subscriptions/muted_topics" payloads: List[Dict[str, object]] = [ {"stream": stream.name, "topic": "vERONA3", "op": "remove"}, {"stream_id": stream.id, "topic": "vEroNA3", "op": "remove"}, ] mock_date_muted = datetime(2020, 1, 1, tzinfo=timezone.utc).timestamp() assert recipient is not None for data in payloads: add_topic_mute( user_profile=user, stream_id=stream.id, recipient_id=recipient.id, topic_name="Verona3", date_muted=datetime(2020, 1, 1, tzinfo=timezone.utc), ) self.assertIn((stream.name, "Verona3", mock_date_muted), get_topic_mutes(user)) result = self.api_patch(user, url, data) self.assert_json_success(result) self.assertNotIn((stream.name, "Verona3", mock_date_muted), get_topic_mutes(user)) self.assertFalse(topic_is_muted(user, stream.id, "verona3"))
def test_remove_muted_topic(self) -> None: user = self.example_user('hamlet') email = user.email realm = user.realm self.login(email) stream = get_stream(u'Verona', realm) recipient = get_stream_recipient(stream.id) url = '/api/v1/users/me/subscriptions/muted_topics' payloads = [ {'stream': stream.name, 'topic': 'vERONA3', 'op': 'remove'}, {'stream_id': stream.id, 'topic': 'vEroNA3', 'op': 'remove'}, ] for data in payloads: add_topic_mute( user_profile=user, stream_id=stream.id, recipient_id=recipient.id, topic_name='Verona3', ) self.assertIn([stream.name, 'Verona3'], get_topic_mutes(user)) result = self.api_patch(email, url, data) self.assert_json_success(result) self.assertNotIn([stream.name, 'Verona3'], get_topic_mutes(user)) self.assertFalse(topic_is_muted(user, stream.id, 'verona3'))
def test_remove_muted_topic(self) -> None: user = self.example_user('hamlet') realm = user.realm self.login_user(user) stream = get_stream('Verona', realm) recipient = stream.recipient url = '/api/v1/users/me/subscriptions/muted_topics' payloads = [ {'stream': stream.name, 'topic': 'vERONA3', 'op': 'remove'}, {'stream_id': stream.id, 'topic': 'vEroNA3', 'op': 'remove'}, ] mock_date_muted = datetime(2020, 1, 1, tzinfo=timezone.utc).timestamp() for data in payloads: add_topic_mute( user_profile=user, stream_id=stream.id, recipient_id=recipient.id, topic_name='Verona3', date_muted=datetime(2020, 1, 1, tzinfo=timezone.utc), ) self.assertIn([stream.name, 'Verona3', mock_date_muted], get_topic_mutes(user)) result = self.api_patch(user, url, data) self.assert_json_success(result) self.assertNotIn([stream.name, 'Verona3', mock_date_muted], get_topic_mutes(user)) self.assertFalse(topic_is_muted(user, stream.id, 'verona3'))
def apply_unread_message_event(user_profile: UserProfile, state: RawUnreadMessagesResult, message: Dict[str, Any], flags: List[str]) -> None: message_id = message['id'] if message['type'] == 'stream': message_type = 'stream' elif message['type'] == 'private': others = [ recip for recip in message['display_recipient'] if recip['id'] != user_profile.id ] if len(others) <= 1: message_type = 'private' else: message_type = 'huddle' else: raise AssertionError("Invalid message type %s" % (message['type'], )) sender_id = message['sender_id'] if message_type == 'stream': stream_id = message['stream_id'] topic = message[TOPIC_NAME] new_row = dict( stream_id=stream_id, topic=topic, sender_id=sender_id, ) state['stream_dict'][message_id] = new_row if stream_id not in state['muted_stream_ids']: # This next check hits the database. if not topic_is_muted(user_profile, stream_id, topic): state['unmuted_stream_msgs'].add(message_id) elif message_type == 'private': if len(others) == 1: other_id = others[0]['id'] else: other_id = user_profile.id # The `sender_id` field here is misnamed. new_row = dict(sender_id=other_id, ) state['pm_dict'][message_id] = new_row else: display_recipient = message['display_recipient'] user_ids = [obj['id'] for obj in display_recipient] user_ids = sorted(user_ids) user_ids_string = ','.join(str(uid) for uid in user_ids) new_row = dict(user_ids_string=user_ids_string, ) state['huddle_dict'][message_id] = new_row if 'mentioned' in flags: state['mentions'].add(message_id) if 'wildcard_mentioned' in flags: if message_id in state['unmuted_stream_msgs']: state['mentions'].add(message_id)
def mute_topic(user_profile: UserProfile, stream_name: str, topic_name: str) -> HttpResponse: (stream, recipient, sub) = access_stream_by_name(user_profile, stream_name) if topic_is_muted(user_profile, stream.id, topic_name): return json_error(_("Topic already muted")) do_mute_topic(user_profile, stream, recipient, topic_name) return json_success()
def apply_unread_message_event( user_profile: UserProfile, state: RawUnreadMessagesResult, message: Dict[str, Any], flags: List[str], ) -> None: message_id = message["id"] if message["type"] == "stream": message_type = "stream" elif message["type"] == "private": others = [recip for recip in message["display_recipient"] if recip["id"] != user_profile.id] if len(others) <= 1: message_type = "private" else: message_type = "huddle" else: raise AssertionError("Invalid message type {}".format(message["type"])) if message_type == "stream": stream_id = message["stream_id"] topic = message[TOPIC_NAME] state["stream_dict"][message_id] = RawUnreadStreamDict( stream_id=stream_id, topic=topic, ) if stream_id not in state["muted_stream_ids"]: # This next check hits the database. if not topic_is_muted(user_profile, stream_id, topic): state["unmuted_stream_msgs"].add(message_id) elif message_type == "private": if len(others) == 1: other_id = others[0]["id"] else: other_id = user_profile.id # The `sender_id` field here is misnamed. state["pm_dict"][message_id] = RawUnreadPrivateMessageDict( sender_id=other_id, ) else: display_recipient = message["display_recipient"] user_ids = [obj["id"] for obj in display_recipient] user_ids = sorted(user_ids) user_ids_string = ",".join(str(uid) for uid in user_ids) state["huddle_dict"][message_id] = RawUnreadHuddleDict( user_ids_string=user_ids_string, ) if "mentioned" in flags: state["mentions"].add(message_id) if "wildcard_mentioned" in flags: if message_id in state["unmuted_stream_msgs"]: state["mentions"].add(message_id)
def unmute_topic(user_profile: UserProfile, stream_name: str, topic_name: str) -> HttpResponse: error = _("Topic is not there in the muted_topics list") stream = access_stream_for_unmute_topic(user_profile, stream_name, error) if not topic_is_muted(user_profile, stream.id, topic_name): return json_error(error) do_unmute_topic(user_profile, stream, topic_name) return json_success()
def apply_unread_message_event(user_profile: UserProfile, state: Dict[str, Any], message: Dict[str, Any], flags: List[str]) -> None: message_id = message['id'] if message['type'] == 'stream': message_type = 'stream' elif message['type'] == 'private': others = [ recip for recip in message['display_recipient'] if recip['id'] != message['sender_id'] ] if len(others) <= 1: message_type = 'private' else: message_type = 'huddle' else: raise AssertionError("Invalid message type %s" % (message['type'],)) sender_id = message['sender_id'] if message_type == 'stream': stream_id = message['stream_id'] topic = message[TOPIC_NAME] new_row = dict( stream_id=stream_id, topic=topic, sender_id=sender_id, ) state['stream_dict'][message_id] = new_row if stream_id not in state['muted_stream_ids']: # This next check hits the database. if not topic_is_muted(user_profile, stream_id, topic): state['unmuted_stream_msgs'].add(message_id) elif message_type == 'private': sender_id = message['sender_id'] new_row = dict( sender_id=sender_id, ) state['pm_dict'][message_id] = new_row else: display_recipient = message['display_recipient'] user_ids = [obj['id'] for obj in display_recipient] user_ids = sorted(user_ids) user_ids_string = ','.join(str(uid) for uid in user_ids) new_row = dict( user_ids_string=user_ids_string, ) state['huddle_dict'][message_id] = new_row if 'mentioned' in flags: state['mentions'].add(message_id)
def apply_unread_message_event(user_profile, state, message): # type: (UserProfile, Dict[str, Any], Dict[str, Any]) -> None message_id = message['id'] if message['type'] == 'stream': message_type = 'stream' elif message['type'] == 'private': others = [ recip for recip in message['display_recipient'] if recip['id'] != message['sender_id'] ] if len(others) <= 1: message_type = 'private' else: message_type = 'huddle' else: raise AssertionError("Invalid message type %s" % (message['type'],)) sender_id = message['sender_id'] if message_type == 'stream': stream_id = message['stream_id'] topic = message['subject'] new_row = dict( stream_id=stream_id, topic=topic, sender_id=sender_id, ) state['stream_dict'][message_id] = new_row if stream_id not in state['muted_stream_ids']: # This next check hits the database. if not topic_is_muted(user_profile, stream_id, topic): state['unmuted_stream_msgs'].add(message_id) elif message_type == 'private': sender_id = message['sender_id'] new_row = dict( sender_id=sender_id, ) state['pm_dict'][message_id] = new_row else: display_recipient = message['display_recipient'] user_ids = [obj['id'] for obj in display_recipient] user_ids = sorted(user_ids) user_ids_string = ','.join(str(uid) for uid in user_ids) new_row = dict( user_ids_string=user_ids_string, ) state['huddle_dict'][message_id] = new_row mentioned = message.get('is_mentioned', False) if mentioned: state['mentions'].add(message_id)
def test_add_muted_topic(self) -> None: user = self.example_user("hamlet") self.login_user(user) stream = get_stream("Verona", user.realm) url = "/api/v1/users/me/subscriptions/muted_topics" payloads = [ { "stream": stream.name, "topic": "Verona3", "op": "add" }, { "stream_id": stream.id, "topic": "Verona3", "op": "add" }, ] mock_date_muted = datetime(2020, 1, 1, tzinfo=timezone.utc).timestamp() for data in payloads: with mock.patch( "zerver.views.muting.timezone_now", return_value=datetime(2020, 1, 1, tzinfo=timezone.utc), ): result = self.api_patch(user, url, data) self.assert_json_success(result) self.assertIn((stream.name, "Verona3", mock_date_muted), get_topic_mutes(user)) self.assertTrue(topic_is_muted(user, stream.id, "Verona3")) self.assertTrue(topic_is_muted(user, stream.id, "verona3")) remove_topic_mute( user_profile=user, stream_id=stream.id, topic_name="Verona3", )
def mute_topic(user_profile: UserProfile, stream_id: Optional[int], stream_name: Optional[str], topic_name: str) -> HttpResponse: if stream_name is not None: (stream, recipient, sub) = access_stream_by_name(user_profile, stream_name) else: assert stream_id is not None (stream, recipient, sub) = access_stream_by_id(user_profile, stream_id) if topic_is_muted(user_profile, stream.id, topic_name): return json_error(_("Topic already muted")) do_mute_topic(user_profile, stream, recipient, topic_name) return json_success()
def mute_topic(user_profile: UserProfile, stream_id: Optional[int], stream_name: Optional[str], topic_name: str) -> HttpResponse: if stream_name is not None: (stream, recipient, sub) = access_stream_by_name(user_profile, stream_name) else: assert stream_id is not None (stream, recipient, sub) = access_stream_by_id(user_profile, stream_id) if topic_is_muted(user_profile, stream.id, topic_name): return json_error(_("Topic already muted")) do_mute_topic(user_profile, stream, recipient, topic_name) return json_success()
def unmute_topic( user_profile: UserProfile, stream_id: Optional[int], stream_name: Optional[str], topic_name: str ) -> HttpResponse: error = _("Topic is not muted") if stream_name is not None: stream = access_stream_for_unmute_topic_by_name(user_profile, stream_name, error) else: assert stream_id is not None stream = access_stream_for_unmute_topic_by_id(user_profile, stream_id, error) if not topic_is_muted(user_profile, stream.id, topic_name): return json_error(error) do_unmute_topic(user_profile, stream, topic_name) return json_success()
def test_add_muted_topic(self) -> None: user = self.example_user("hamlet") self.login_user(user) stream = get_stream("Verona", user.realm) url = "/api/v1/users/me/subscriptions/muted_topics" payloads: List[Dict[str, object]] = [ {"stream": stream.name, "topic": "Verona3", "op": "add"}, {"stream_id": stream.id, "topic": "Verona3", "op": "add"}, ] mock_date_muted = datetime(2020, 1, 1, tzinfo=timezone.utc).timestamp() for data in payloads: with mock.patch( "zerver.views.muting.timezone_now", return_value=datetime(2020, 1, 1, tzinfo=timezone.utc), ): result = self.api_patch(user, url, data) self.assert_json_success(result) self.assertIn((stream.name, "Verona3", mock_date_muted), get_topic_mutes(user)) self.assertTrue(topic_is_muted(user, stream.id, "verona3")) remove_topic_mute( user_profile=user, stream_id=stream.id, topic_name="Verona3", ) # Verify the error handling for the database level # IntegrityError we'll get with a race between two processes # trying to mute the topic. To do this, we patch the # topic_is_muted function to always return False when trying # to mute a topic that is already muted. add_topic_mute( user_profile=user, stream_id=stream.id, recipient_id=stream.recipient.id, topic_name="Verona3", date_muted=datetime(2020, 1, 1, tzinfo=timezone.utc), ) with mock.patch("zerver.views.muting.topic_is_muted", return_value=False): result = self.api_patch(user, url, data) self.assert_json_error(result, "Topic already muted")
def unmute_topic(user_profile: UserProfile, stream_id: Optional[int], stream_name: Optional[str], topic_name: str) -> HttpResponse: error = _("Topic is not muted") if stream_name is not None: stream = access_stream_for_unmute_topic_by_name(user_profile, stream_name, error) else: assert stream_id is not None stream = access_stream_for_unmute_topic_by_id(user_profile, stream_id, error) if not topic_is_muted(user_profile, stream.id, topic_name): return json_error(error) do_unmute_topic(user_profile, stream, topic_name) return json_success()
def mute_topic( user_profile: UserProfile, stream_id: Optional[int], stream_name: Optional[str], topic_name: str, date_muted: datetime.datetime, ) -> HttpResponse: if stream_name is not None: (stream, sub) = access_stream_by_name(user_profile, stream_name) else: assert stream_id is not None (stream, sub) = access_stream_by_id(user_profile, stream_id) if topic_is_muted(user_profile, stream.id, topic_name): raise JsonableError(_("Topic already muted")) do_mute_topic(user_profile, stream, topic_name, date_muted) return json_success()
def mute_topic( user_profile: UserProfile, stream_id: Optional[int], stream_name: Optional[str], topic_name: str, date_muted: datetime.datetime, ) -> None: if stream_name is not None: (stream, sub) = access_stream_by_name(user_profile, stream_name) else: assert stream_id is not None (stream, sub) = access_stream_by_id(user_profile, stream_id) if topic_is_muted(user_profile, stream.id, topic_name): raise JsonableError(_("Topic already muted")) try: do_mute_topic(user_profile, stream, topic_name, date_muted) except IntegrityError: raise JsonableError(_("Topic already muted"))
def test_remove_muted_topic(self) -> None: user = self.example_user('hamlet') email = user.email realm = user.realm self.login(email) stream = get_stream(u'Verona', realm) recipient = get_stream_recipient(stream.id) url = '/api/v1/users/me/subscriptions/muted_topics' payloads = [ { 'stream': stream.name, 'topic': 'vERONA3', 'op': 'remove' }, { 'stream_id': stream.id, 'topic': 'vEroNA3', 'op': 'remove' }, ] for data in payloads: add_topic_mute( user_profile=user, stream_id=stream.id, recipient_id=recipient.id, topic_name='Verona3', date_muted=timezone_now(), ) self.assertIn([stream.name, 'Verona3'], get_topic_mutes(user)) result = self.api_patch(email, url, data) self.assert_json_success(result) self.assertNotIn([stream.name, 'Verona3'], get_topic_mutes(user)) self.assertFalse(topic_is_muted(user, stream.id, 'verona3'))