@classmethod
  @gen.coroutine
  def _SendDeviceAlert(cls, client, user_id, viewpoint_id, badge, alert_text, exclude_device_id=None, sound=None):
    # Possible failure of push notification should not propagate.
    try:
      # Alert_text can be None, which will still result in update of badge.
      extra = {'v': viewpoint_id} if viewpoint_id is not None and alert_text is not None else None
      yield gen.Task(Device.PushNotification,
                     client,
                     user_id,
                     alert_text,
                     badge,
                     exclude_device_id=exclude_device_id,
                     extra=extra,
                     sound=sound)
    except:
      logging.exception('failed to push notification to user %d', user_id)
Test parsing a 'salt://' URL
dataset/ETHPy150Open viewfinderco/viewfinder/backend/op/alert_manager.py/AlertManager._SendDeviceAlert--crossover with--dataset/ETHPy150Open saltstack/salt/tests/unit/utils/url_test.py/UrlTestCase.test_parse_salt_url