Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/features/send_notifications.py b/features/send_notifications.py
new file mode 100644
index 0000000..e7ee4d4
--- /dev/null
+++ b/features/send_notifications.py
@@ -0,0 +1,118 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file or at
+# https://developers.google.com/open-source/licenses/bsd
+
+"""Functions that prepare and send email notifications of issue changes."""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+
+
+import logging
+
+from features import features_constants
+from framework import cloud_tasks_helpers
+from framework import framework_constants
+from framework import urls
+from tracker import tracker_bizobj
+
+
+def PrepareAndSendIssueChangeNotification(
+    issue_id, hostport, commenter_id, send_email=True,
+    old_owner_id=framework_constants.NO_USER_SPECIFIED, comment_id=None):
+  """Create a task to notify users that an issue has changed.
+
+  Args:
+    issue_id: int ID of the issue that was changed.
+    hostport: string domain name and port number from the HTTP request.
+    commenter_id: int user ID of the user who made the comment.
+    send_email: True if email notifications should be sent.
+    old_owner_id: optional user ID of owner before the current change took
+      effect. They will also be notified.
+    comment_id: int Comment ID of the comment that was entered.
+
+  Returns nothing.
+  """
+  if old_owner_id is None:
+    old_owner_id = framework_constants.NO_USER_SPECIFIED
+  params = dict(
+      issue_id=issue_id, commenter_id=commenter_id, comment_id=comment_id,
+      hostport=hostport, old_owner_id=old_owner_id, send_email=int(send_email))
+  task = cloud_tasks_helpers.generate_simple_task(
+      urls.NOTIFY_ISSUE_CHANGE_TASK + '.do', params)
+  cloud_tasks_helpers.create_task(
+      task, queue=features_constants.QUEUE_NOTIFICATIONS)
+
+  task = cloud_tasks_helpers.generate_simple_task(
+      urls.PUBLISH_PUBSUB_ISSUE_CHANGE_TASK + '.do', params)
+  cloud_tasks_helpers.create_task(task, queue=features_constants.QUEUE_PUBSUB)
+
+
+def PrepareAndSendIssueBlockingNotification(
+    issue_id, hostport, delta_blocker_iids, commenter_id, send_email=True):
+  """Create a task to follow up on an issue blocked_on change."""
+  if not delta_blocker_iids:
+    return  # No notification is needed
+
+  params = dict(
+      issue_id=issue_id, commenter_id=commenter_id, hostport=hostport,
+      send_email=int(send_email),
+      delta_blocker_iids=','.join(str(iid) for iid in delta_blocker_iids))
+
+  task = cloud_tasks_helpers.generate_simple_task(
+      urls.NOTIFY_BLOCKING_CHANGE_TASK + '.do', params)
+  cloud_tasks_helpers.create_task(
+      task, queue=features_constants.QUEUE_NOTIFICATIONS)
+
+
+def PrepareAndSendApprovalChangeNotification(
+    issue_id, approval_id, hostport, comment_id, send_email=True):
+  """Create a task to follow up on an approval change."""
+
+  params = dict(
+      issue_id=issue_id, approval_id=approval_id, hostport=hostport,
+      comment_id=comment_id, send_email=int(send_email))
+
+  task = cloud_tasks_helpers.generate_simple_task(
+      urls.NOTIFY_APPROVAL_CHANGE_TASK + '.do', params)
+  cloud_tasks_helpers.create_task(
+      task, queue=features_constants.QUEUE_NOTIFICATIONS)
+
+
+def SendIssueBulkChangeNotification(
+    issue_ids, hostport, old_owner_ids, comment_text, commenter_id,
+    amendments, send_email, users_by_id):
+  """Create a task to follow up on an issue blocked_on change."""
+  amendment_lines = []
+  for up in amendments:
+    line = '    %s: %s' % (
+        tracker_bizobj.GetAmendmentFieldName(up),
+        tracker_bizobj.AmendmentString(up, users_by_id))
+    if line not in amendment_lines:
+      amendment_lines.append(line)
+
+  params = dict(
+      issue_ids=','.join(str(iid) for iid in issue_ids),
+      commenter_id=commenter_id, hostport=hostport, send_email=int(send_email),
+      old_owner_ids=','.join(str(uid) for uid in old_owner_ids),
+      comment_text=comment_text, amendments='\n'.join(amendment_lines))
+
+  task = cloud_tasks_helpers.generate_simple_task(
+      urls.NOTIFY_BULK_CHANGE_TASK + '.do', params)
+  cloud_tasks_helpers.create_task(
+      task, queue=features_constants.QUEUE_NOTIFICATIONS)
+
+
+def PrepareAndSendDeletedFilterRulesNotification(
+    project_id, hostport, filter_rule_strs):
+  """Create a task to notify project owners of deleted filter rules."""
+
+  params = dict(
+      project_id=project_id, filter_rules=','.join(filter_rule_strs),
+      hostport=hostport)
+
+  task = cloud_tasks_helpers.generate_simple_task(
+      urls.NOTIFY_RULES_DELETED_TASK + '.do', params)
+  cloud_tasks_helpers.create_task(
+      task, queue=features_constants.QUEUE_NOTIFICATIONS)