예제 #1
0
파일: anno.py 프로젝트: usersource/anno
    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