2016-05-29 16:52:55 +02:00
|
|
|
from zerver.lib.request import JsonableError
|
2018-11-10 22:50:28 +01:00
|
|
|
from zerver.lib.topic import (
|
|
|
|
get_topic_from_message_info,
|
|
|
|
)
|
2016-05-25 15:02:02 +02:00
|
|
|
from django.utils.translation import ugettext as _
|
|
|
|
|
2018-05-21 17:44:00 +02:00
|
|
|
from typing import Any, Callable, Dict, Iterable, Mapping, Sequence
|
2016-06-04 20:38:42 +02:00
|
|
|
|
2013-12-10 16:28:16 +01:00
|
|
|
|
2018-05-10 19:13:36 +02:00
|
|
|
def check_supported_events_narrow_filter(narrow: Iterable[Sequence[str]]) -> None:
|
2013-12-10 16:28:16 +01:00
|
|
|
for element in narrow:
|
|
|
|
operator = element[0]
|
|
|
|
if operator not in ["stream", "topic", "sender", "is"]:
|
2016-05-25 15:02:02 +02:00
|
|
|
raise JsonableError(_("Operator %s not supported.") % (operator,))
|
2013-12-10 16:28:16 +01:00
|
|
|
|
2018-05-21 17:44:00 +02:00
|
|
|
def is_web_public_compatible(narrow: Iterable[Dict[str, str]]) -> bool:
|
|
|
|
for element in narrow:
|
|
|
|
operator = element['operator']
|
|
|
|
if 'operand' not in element:
|
|
|
|
return False
|
|
|
|
if operator not in ["stream", "topic", "sender", "has", "search", "near", "id"]:
|
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
2018-05-10 19:13:36 +02:00
|
|
|
def build_narrow_filter(narrow: Iterable[Sequence[str]]) -> Callable[[Mapping[str, Any]], bool]:
|
2016-07-20 23:16:28 +02:00
|
|
|
"""Changes to this function should come with corresponding changes to
|
|
|
|
BuildNarrowFilterTest."""
|
2013-12-10 16:28:16 +01:00
|
|
|
check_supported_events_narrow_filter(narrow)
|
2016-11-29 07:22:02 +01:00
|
|
|
|
2017-11-05 11:15:10 +01:00
|
|
|
def narrow_filter(event: Mapping[str, Any]) -> bool:
|
2013-12-10 16:28:16 +01:00
|
|
|
message = event["message"]
|
|
|
|
flags = event["flags"]
|
|
|
|
for element in narrow:
|
|
|
|
operator = element[0]
|
|
|
|
operand = element[1]
|
|
|
|
if operator == "stream":
|
|
|
|
if message["type"] != "stream":
|
|
|
|
return False
|
|
|
|
if operand.lower() != message["display_recipient"].lower():
|
|
|
|
return False
|
|
|
|
elif operator == "topic":
|
|
|
|
if message["type"] != "stream":
|
|
|
|
return False
|
2018-11-10 22:50:28 +01:00
|
|
|
topic_name = get_topic_from_message_info(message)
|
|
|
|
if operand.lower() != topic_name.lower():
|
2013-12-10 16:28:16 +01:00
|
|
|
return False
|
|
|
|
elif operator == "sender":
|
|
|
|
if operand.lower() != message["sender_email"].lower():
|
|
|
|
return False
|
|
|
|
elif operator == "is" and operand == "private":
|
|
|
|
if message["type"] != "private":
|
|
|
|
return False
|
|
|
|
elif operator == "is" and operand in ["starred"]:
|
|
|
|
if operand not in flags:
|
|
|
|
return False
|
2017-06-19 03:21:48 +02:00
|
|
|
elif operator == "is" and operand == "unread":
|
|
|
|
if "read" in flags:
|
|
|
|
return False
|
2013-12-10 16:28:16 +01:00
|
|
|
elif operator == "is" and operand in ["alerted", "mentioned"]:
|
|
|
|
if "mentioned" not in flags:
|
|
|
|
return False
|
|
|
|
|
|
|
|
return True
|
|
|
|
return narrow_filter
|