| Index: dashboard/dashboard/models/alert.py
 | 
| diff --git a/dashboard/dashboard/models/alert.py b/dashboard/dashboard/models/alert.py
 | 
| index 8e73f782fe035ebcbe15fa2b845a705fbe3fb9fb..91c11f282b4d283bd3e38dfe93164813361a2dc0 100644
 | 
| --- a/dashboard/dashboard/models/alert.py
 | 
| +++ b/dashboard/dashboard/models/alert.py
 | 
| @@ -41,88 +41,6 @@ class Alert(internal_only_model.InternalOnlyModel):
 | 
|    # kind=alert_group.AlertGroup can be added.
 | 
|    group = ndb.KeyProperty(indexed=True)
 | 
|  
 | 
| -  def _pre_put_hook(self):
 | 
| -    """Updates the alert's group."""
 | 
| -    # TODO(qyearsley): Extract sub-methods from this method in order
 | 
| -    # to make it shorter.
 | 
| -
 | 
| -    # The group should not be updated if this is the first time that the
 | 
| -    # the Alert is being put. (If the key is auto-assigned, then key.id()
 | 
| -    # will be None the first time.)
 | 
| -    if not self.key.id():
 | 
| -      return
 | 
| -
 | 
| -    # The previous state of this alert. (If this is the first time the
 | 
| -    # alert is being put, then this will be None.
 | 
| -    original_alert = self.key.get(use_cache=False)
 | 
| -    if original_alert is None:
 | 
| -      return
 | 
| -
 | 
| -    # If the alert does not have a group, don't do anything.
 | 
| -    if not self.group:
 | 
| -      return
 | 
| -    # If the group key is "AnomalyGroup" (the previous incarnation of
 | 
| -    # AlertGroup), we can just leave it as is. This will only apply to
 | 
| -    # already-existing Anomaly entities, not new Anomaly entities.
 | 
| -    if self.group.kind() != 'AlertGroup':
 | 
| -      self.group = None
 | 
| -      return
 | 
| -    group = self.group.get()
 | 
| -    if not group:
 | 
| -      return
 | 
| -
 | 
| -    # Each AlertGroup should only be associated with entities of one class;
 | 
| -    # i.e. an Anomaly entity shouldn't be grouped with a StoppageAlert entity.
 | 
| -    alert_class = self.__class__
 | 
| -
 | 
| -    # When the bug ID changes, this alert may be updated to belong
 | 
| -    # to the new group.
 | 
| -    if self.bug_id != original_alert.bug_id:
 | 
| -      grouped_alerts = alert_class.query(
 | 
| -          alert_class.group == group.key).fetch()
 | 
| -      grouped_alerts.append(self)
 | 
| -
 | 
| -      # The alert has been assigned a real bug ID.
 | 
| -      # Update the group bug ID if necessary.
 | 
| -      if self.bug_id > 0 and group.bug_id != self.bug_id:
 | 
| -        group.bug_id = self.bug_id
 | 
| -        group.put()
 | 
| -
 | 
| -      # The bug has been marked invalid/ignored. Kick it out of the group.
 | 
| -      elif self.bug_id < 0 and self.bug_id is not None:
 | 
| -        self._RemoveFromGroup(grouped_alerts)
 | 
| -        grouped_alerts.remove(self)
 | 
| -
 | 
| -      # The bug has been un-triaged. Update the group's bug ID if this is
 | 
| -      # the only alert in the group.
 | 
| -      elif self.bug_id is None and len(grouped_alerts) == 1:
 | 
| -        group.bug_id = None
 | 
| -        group.put()
 | 
| -
 | 
| -      # Check and update the group's revision range if necessary.
 | 
| -      group.UpdateRevisionRange(grouped_alerts)
 | 
| -
 | 
| -    elif (self.end_revision != original_alert.end_revision or
 | 
| -          self.start_revision != original_alert.start_revision):
 | 
| -      grouped_alerts = alert_class.query(alert_class.group == group.key).fetch()
 | 
| -      grouped_alerts.append(self)
 | 
| -      group.UpdateRevisionRange(grouped_alerts)
 | 
| -
 | 
| -  def _RemoveFromGroup(self, grouped_alerts):
 | 
| -    """Removes an alert from its group and updates the group's properties.
 | 
| -
 | 
| -    Args:
 | 
| -      grouped_alerts: The list of alerts in |group| used to calculate
 | 
| -          new revision range; none are modified.
 | 
| -    """
 | 
| -    group = self.group.get()
 | 
| -    self.group = None
 | 
| -    grouped_alerts.remove(self)
 | 
| -    if not grouped_alerts:
 | 
| -      group.key.delete()
 | 
| -      return
 | 
| -    # Update minimum revision range for group.
 | 
| -    group.UpdateRevisionRange(grouped_alerts)
 | 
|  
 | 
|    def GetTestMetadataKey(self):
 | 
|      """Get the key for the TestMetadata entity of this alert.
 | 
| 
 |