def get_status_dict_by_realm(realm_id: int, slim_presence: bool = False) -> Dict[str, Dict[str, Any]]: user_profile_ids = UserProfile.objects.filter( realm_id=realm_id, is_active=True, is_bot=False ).order_by('id').values_list('id', flat=True) user_profile_ids = list(user_profile_ids) if not user_profile_ids: # nocoverage # This conditional is necessary because query_for_ids # throws an exception if passed an empty list. # # It's not clear this condition is actually possible, # though, because it shouldn't be possible to end up with # a realm with 0 active users. return {} two_weeks_ago = timezone_now() - datetime.timedelta(weeks=2) query = UserPresence.objects.filter( timestamp__gte=two_weeks_ago ).values( 'client__name', 'status', 'timestamp', 'user_profile__email', 'user_profile__id', 'user_profile__enable_offline_push_notifications', ) query = query_for_ids( query=query, user_ids=user_profile_ids, field='user_profile_id' ) presence_rows = list(query) mobile_query = PushDeviceToken.objects.distinct( 'user_id' ).values_list( 'user_id', flat=True ) mobile_query = query_for_ids( query=mobile_query, user_ids=user_profile_ids, field='user_id' ) mobile_user_ids = set(mobile_query) return get_status_dicts_for_rows(presence_rows, mobile_user_ids, slim_presence)
def bulk_hydrate_sender_info(objs: List[Dict[str, Any]]) -> None: sender_ids = list({obj['sender_id'] for obj in objs}) if not sender_ids: return query = UserProfile.objects.values( 'id', 'full_name', 'short_name', 'delivery_email', 'email', 'realm__string_id', 'avatar_source', 'avatar_version', 'is_mirror_dummy', ) rows = query_for_ids(query, sender_ids, 'zerver_userprofile.id') sender_dict = {row['id']: row for row in rows} for obj in objs: sender_id = obj['sender_id'] user_row = sender_dict[sender_id] obj['sender_full_name'] = user_row['full_name'] obj['sender_short_name'] = user_row['short_name'] obj['sender_email'] = user_row['email'] obj['sender_delivery_email'] = user_row['delivery_email'] obj['sender_realm_str'] = user_row['realm__string_id'] obj['sender_avatar_source'] = user_row['avatar_source'] obj['sender_avatar_version'] = user_row['avatar_version'] obj['sender_is_mirror_dummy'] = user_row['is_mirror_dummy']
def bulk_hydrate_sender_info(objs: List[Dict[str, Any]]) -> None: sender_ids = list({obj["sender_id"] for obj in objs}) if not sender_ids: return query = UserProfile.objects.values( "id", "full_name", "delivery_email", "email", "realm__string_id", "avatar_source", "avatar_version", "is_mirror_dummy", ) rows = query_for_ids(query, sender_ids, "zerver_userprofile.id") sender_dict = {row["id"]: row for row in rows} for obj in objs: sender_id = obj["sender_id"] user_row = sender_dict[sender_id] obj["sender_full_name"] = user_row["full_name"] obj["sender_email"] = user_row["email"] obj["sender_delivery_email"] = user_row["delivery_email"] obj["sender_realm_str"] = user_row["realm__string_id"] obj["sender_avatar_source"] = user_row["avatar_source"] obj["sender_avatar_version"] = user_row["avatar_version"] obj["sender_is_mirror_dummy"] = user_row["is_mirror_dummy"]
def bulk_hydrate_sender_info(objs): # type: (List[Dict[str, Any]]) -> None sender_ids = list({ obj['sender_id'] for obj in objs }) if not sender_ids: return query = UserProfile.objects.values( 'id', 'full_name', 'short_name', ) rows = query_for_ids(query, sender_ids, 'id') sender_dict = { row['id']: row for row in rows } for obj in objs: sender_id = obj['sender_id'] user_row = sender_dict[sender_id] obj['sender_full_name'] = user_row['full_name'] obj['sender_short_name'] = user_row['short_name']
def get_status_dict_by_realm( realm_id: int, slim_presence: bool = False) -> Dict[str, Dict[str, Any]]: two_weeks_ago = timezone_now() - datetime.timedelta(weeks=2) query = UserPresence.objects.filter( realm_id=realm_id, timestamp__gte=two_weeks_ago, user_profile__is_active=True, user_profile__is_bot=False, ).values( "client__name", "status", "timestamp", "user_profile__email", "user_profile__id", "user_profile__enable_offline_push_notifications", ) presence_rows = list(query) mobile_query = PushDeviceToken.objects.distinct("user_id").values_list( "user_id", flat=True, ) user_profile_ids = [ presence_row["user_profile__id"] for presence_row in presence_rows ] if len(user_profile_ids) == 0: # This conditional is necessary because query_for_ids # throws an exception if passed an empty list. # # It's not clear this condition is actually possible, # though, because it shouldn't be possible to end up with # a realm with 0 active users. return {} mobile_query = query_for_ids( query=mobile_query, user_ids=user_profile_ids, field="user_id", ) mobile_user_ids = set(mobile_query) return get_status_dicts_for_rows(presence_rows, mobile_user_ids, slim_presence)
def bulk_hydrate_sender_info(objs): # type: (List[Dict[str, Any]]) -> None sender_ids = list({ obj['sender_id'] for obj in objs }) if not sender_ids: return query = UserProfile.objects.values( 'id', 'full_name', 'short_name', 'email', 'realm__string_id', 'avatar_source', 'avatar_version', 'is_mirror_dummy', ) rows = query_for_ids(query, sender_ids, 'zerver_userprofile.id') sender_dict = { row['id']: row for row in rows } for obj in objs: sender_id = obj['sender_id'] user_row = sender_dict[sender_id] obj['sender_full_name'] = user_row['full_name'] obj['sender_short_name'] = user_row['short_name'] obj['sender_email'] = user_row['email'] obj['sender_realm_str'] = user_row['realm__string_id'] obj['sender_avatar_source'] = user_row['avatar_source'] obj['sender_avatar_version'] = user_row['avatar_version'] obj['sender_is_mirror_dummy'] = user_row['is_mirror_dummy']