def getEngagedUsers(cls, anno_id, auth_user, include_auth_user=False): from model.userannostate import UserAnnoState userannostates = UserAnnoState.list_users_by_anno(anno_id=anno_id, projection=[UserAnnoState.user]) users = [] for userannostate in userannostates: current_user = userannostate.user.get() users.append(UserMessage(id=current_user.key.id(), user_email=current_user.user_email, display_name=current_user.display_name, image_url=current_user.image_url)) # removing auth_user if auth_user: if include_auth_user: if not any(user_info.user_email == auth_user.user_email for user_info in users): users.append(UserMessage(id=auth_user.key.id(), user_email=auth_user.user_email, display_name=auth_user.display_name, image_url=auth_user.image_url)) else: [ users.remove(user_info) for user_info in users if user_info.user_email == auth_user.user_email ] # sorting users alphabetically return sorted(users, key=lambda user_info: user_info.display_name.lower())
def get_noft_devices(cls, first_user, anno, action_type): """ Get list of device ids to which notification to be sent :param ndb.Model first_user: "******" datastore of user who did anno action :param ndb.Model anno: "anno" datastore :param str action_type: one of the :py:class:`.AnnoActionType` :returns: list of device ids for iOS and Android devices :rtype: dict """ interested_user_deviceids = {PlatformType.IOS: [], PlatformType.ANDROID: []} community_manager_deviceids = {PlatformType.IOS: [], PlatformType.ANDROID: []} # get all interested users for anno if action_type is other than "created" if action_type != AnnoActionType.CREATED: interested_user_list = UserAnnoState.list_users_by_anno( anno_key=anno.key, projection=[UserAnnoState.user, UserAnnoState.last_read] ) interested_user_deviceids = cls.list_deviceid(interested_user_list) # anno is in community-scope then send notification to all managers of that community if anno.community: community_id = anno.community.id() community_manager_list = UserRole.community_user_list(community_id=community_id, only_managers=True) community_manager_deviceids = cls.list_deviceid(community_manager_list) # merging device ids of interested users and community managers notf_devices = { platform: list(set(interested_user_deviceids[platform] + community_manager_deviceids[platform])) for platform in interested_user_deviceids } # removing first user from push notification task if first_user.device_id and first_user.device_type: if first_user.device_id in notf_devices[first_user.device_type]: notf_devices[first_user.device_type].remove(first_user.device_id) return notf_devices