mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 14:03:30 +00:00
messages: Support passing user ID to sender operator.
This commit is contained in:
committed by
Tim Abbott
parent
54304b4008
commit
c067c155aa
@@ -337,3 +337,9 @@ def check_string_or_int_list(var_name: str, val: object) -> Optional[str]:
|
|||||||
return _('%s is not a string or an integer list') % (var_name,)
|
return _('%s is not a string or an integer list') % (var_name,)
|
||||||
|
|
||||||
return check_list(check_int)(var_name, val)
|
return check_list(check_int)(var_name, val)
|
||||||
|
|
||||||
|
def check_string_or_int(var_name: str, val: object) -> Optional[str]:
|
||||||
|
if isinstance(val, str) or isinstance(val, int):
|
||||||
|
return None
|
||||||
|
|
||||||
|
return _('%s is not a string or integer') % (var_name,)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ from zerver.lib.validator import (
|
|||||||
check_string, check_dict, check_dict_only, check_bool, check_float, check_int, check_list, Validator,
|
check_string, check_dict, check_dict_only, check_bool, check_float, check_int, check_list, Validator,
|
||||||
check_variable_type, equals, check_none_or, check_url, check_short_string,
|
check_variable_type, equals, check_none_or, check_url, check_short_string,
|
||||||
check_string_fixed_length, check_capped_string, check_color, to_non_negative_int,
|
check_string_fixed_length, check_capped_string, check_color, to_non_negative_int,
|
||||||
check_string_or_int_list
|
check_string_or_int_list, check_string_or_int
|
||||||
)
|
)
|
||||||
from zerver.models import \
|
from zerver.models import \
|
||||||
get_realm, get_user, UserProfile, Realm
|
get_realm, get_user, UserProfile, Realm
|
||||||
@@ -919,6 +919,16 @@ class ValidatorTestCase(TestCase):
|
|||||||
x = [1, 2, '3']
|
x = [1, 2, '3']
|
||||||
self.assertEqual(check_string_or_int_list('x', x), 'x[2] is not an integer')
|
self.assertEqual(check_string_or_int_list('x', x), 'x[2] is not an integer')
|
||||||
|
|
||||||
|
def test_check_string_or_int(self) -> None:
|
||||||
|
x = "string" # type: Any
|
||||||
|
self.assertEqual(check_string_or_int('x', x), None)
|
||||||
|
|
||||||
|
x = 1
|
||||||
|
self.assertEqual(check_string_or_int('x', x), None)
|
||||||
|
|
||||||
|
x = None
|
||||||
|
self.assertEqual(check_string_or_int('x', x), 'x is not a string or integer')
|
||||||
|
|
||||||
|
|
||||||
class DeactivatedRealmTest(ZulipTestCase):
|
class DeactivatedRealmTest(ZulipTestCase):
|
||||||
def test_send_deactivated_realm(self) -> None:
|
def test_send_deactivated_realm(self) -> None:
|
||||||
|
|||||||
@@ -1426,11 +1426,13 @@ class GetOldMessagesTest(ZulipTestCase):
|
|||||||
self.send_personal_message(self.example_email("othello"), self.example_email("hamlet"))
|
self.send_personal_message(self.example_email("othello"), self.example_email("hamlet"))
|
||||||
self.send_stream_message(self.example_email("iago"), "Scotland")
|
self.send_stream_message(self.example_email("iago"), "Scotland")
|
||||||
|
|
||||||
narrow = [dict(operator='sender', operand=self.example_email("othello"))]
|
test_operands = [self.example_email("othello"), self.example_user("othello").id]
|
||||||
result = self.get_and_check_messages(dict(narrow=ujson.dumps(narrow)))
|
for operand in test_operands:
|
||||||
|
narrow = [dict(operator='sender', operand=operand)]
|
||||||
|
result = self.get_and_check_messages(dict(narrow=ujson.dumps(narrow)))
|
||||||
|
|
||||||
for message in result["messages"]:
|
for message in result["messages"]:
|
||||||
self.assertEqual(message["sender_email"], self.example_email("othello"))
|
self.assertEqual(message["sender_email"], self.example_email("othello"))
|
||||||
|
|
||||||
def _update_tsvector_index(self) -> None:
|
def _update_tsvector_index(self) -> None:
|
||||||
# We use brute force here and update our text search index
|
# We use brute force here and update our text search index
|
||||||
|
|||||||
@@ -45,12 +45,13 @@ from zerver.lib.topic import (
|
|||||||
from zerver.lib.topic_mutes import exclude_topic_mutes
|
from zerver.lib.topic_mutes import exclude_topic_mutes
|
||||||
from zerver.lib.utils import statsd
|
from zerver.lib.utils import statsd
|
||||||
from zerver.lib.validator import \
|
from zerver.lib.validator import \
|
||||||
check_list, check_int, check_dict, check_string, check_bool, check_string_or_int_list
|
check_list, check_int, check_dict, check_string, check_bool, \
|
||||||
|
check_string_or_int_list, check_string_or_int
|
||||||
from zerver.lib.zephyr import compute_mit_user_fullname
|
from zerver.lib.zephyr import compute_mit_user_fullname
|
||||||
from zerver.models import Message, UserProfile, Stream, Subscription, Client,\
|
from zerver.models import Message, UserProfile, Stream, Subscription, Client,\
|
||||||
Realm, RealmDomain, Recipient, UserMessage, bulk_get_recipients, get_personal_recipient, \
|
Realm, RealmDomain, Recipient, UserMessage, bulk_get_recipients, get_personal_recipient, \
|
||||||
get_stream, email_to_domain, get_realm, get_active_streams, \
|
get_stream, email_to_domain, get_realm, get_active_streams, \
|
||||||
get_user_including_cross_realm, get_stream_recipient
|
get_user_including_cross_realm, get_user_by_id_in_realm_including_cross_realm, get_stream_recipient
|
||||||
|
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
from sqlalchemy.sql import select, join, column, literal_column, literal, and_, \
|
from sqlalchemy.sql import select, join, column, literal_column, literal, and_, \
|
||||||
@@ -282,11 +283,14 @@ class NarrowBuilder:
|
|||||||
cond = topic_match_sa(operand)
|
cond = topic_match_sa(operand)
|
||||||
return query.where(maybe_negate(cond))
|
return query.where(maybe_negate(cond))
|
||||||
|
|
||||||
def by_sender(self, query: Query, operand: str, maybe_negate: ConditionTransform) -> Query:
|
def by_sender(self, query: Query, operand: Union[str, int], maybe_negate: ConditionTransform) -> Query:
|
||||||
try:
|
try:
|
||||||
sender = get_user_including_cross_realm(operand, self.user_realm)
|
if isinstance(operand, str):
|
||||||
|
sender = get_user_including_cross_realm(operand, self.user_realm)
|
||||||
|
else:
|
||||||
|
sender = get_user_by_id_in_realm_including_cross_realm(operand, self.user_realm)
|
||||||
except UserProfile.DoesNotExist:
|
except UserProfile.DoesNotExist:
|
||||||
raise BadNarrowOperator('unknown user ' + operand)
|
raise BadNarrowOperator('unknown user ' + str(operand))
|
||||||
|
|
||||||
cond = column("sender_id") == literal(sender.id)
|
cond = column("sender_id") == literal(sender.id)
|
||||||
return query.where(maybe_negate(cond))
|
return query.where(maybe_negate(cond))
|
||||||
@@ -513,9 +517,14 @@ def narrow_parameter(json: str) -> Optional[List[Dict[str, Any]]]:
|
|||||||
# Make sure to sync this list to frontend also when adding a new operator.
|
# Make sure to sync this list to frontend also when adding a new operator.
|
||||||
# that supports user IDs. Relevant code is located in static/js/message_fetch.js
|
# that supports user IDs. Relevant code is located in static/js/message_fetch.js
|
||||||
# in handle_user_ids_supported_operators function where you will need to update
|
# in handle_user_ids_supported_operators function where you will need to update
|
||||||
# the user_ids_supported_operator.
|
# user_id_supported_operator, or user_ids_supported_operator array.
|
||||||
|
user_id_supported_operator = ['sender']
|
||||||
user_ids_supported_operators = ['pm-with']
|
user_ids_supported_operators = ['pm-with']
|
||||||
if elem.get('operator', '') in user_ids_supported_operators:
|
|
||||||
|
operator = elem.get('operator', '')
|
||||||
|
if operator in user_id_supported_operator:
|
||||||
|
operand_validator = check_string_or_int
|
||||||
|
elif operator in user_ids_supported_operators:
|
||||||
operand_validator = check_string_or_int_list
|
operand_validator = check_string_or_int_list
|
||||||
else:
|
else:
|
||||||
operand_validator = check_string
|
operand_validator = check_string
|
||||||
|
|||||||
Reference in New Issue
Block a user