def get_device_tokens(login_id):
'''
Get device tokens for a given login. Removes duplicates per provider.
'''
with session_scope() as session:
result = session.query(model.Device.platform_id,
func.coalesce(model.Device.device_token_new, model.Device.device_token).label('device_token')).\
filter(model.Device.login_id == login_id).filter(model.Device.unregistered_ts.is_(None)).all()
# only return unique device tokens per provider (gcm, apn) to avoid sending duplicates
devices = set()
provider_tokens = set()
for device in sorted(result): # sorting to make unit tests easier
platform_id, device_token = device
provider_id = (constants.PLATFORM_BY_PROVIDER.get(platform_id, 0)
or platform_id)
# NOTE: Use unique tokens per *provider* only for known providers,
# and unique tokens per *platform* in other cases, since
# it is hard to verify providers for custom senders
provider_token = (provider_id, device_token)
if provider_token not in provider_tokens:
devices.add(device)
provider_tokens.add(provider_token)
return list(devices)
评论列表
文章目录