Exemple #1
0
    def _create_conversation(self, _request, _rule, _target_services):
        _rule_uuid = None
        if _rule != None:
            _rule_uuid = _rule.get("uuid")

        _app_uuid = _request.get("app_uuid")
        _user_uuid = _request.get("user_uuid")

        _key = DeviceUser.__tablename__ + ".uuid." + _user_uuid
        _portal_user_name = self.redis.hget(_key, "user_fullname")
        _portal_user_icon = self.redis.hget(_key, "user_icon")

        _group_icon = create_group_icon(self.redis, _target_services)

        _assigned_uuid = None
        if len(_target_services) == 1:
            _assigned_uuid = _target_services[0]

        _conversation_uuid = str(uuid.uuid1())
        _row = ConversationInfo(uuid=_conversation_uuid,
                                app_uuid=_app_uuid,
                                user_uuid=_user_uuid,
                                assigned_uuid=_assigned_uuid,
                                rule_uuid=_rule_uuid,
                                status=CONVERSATION_STATUS.NEW,
                                conversation_type=CONVERSATION_TYPE.P2S)

        _row.async_add(self.redis)
        _row.create_redis_keys(self.redis)

        _conversation_name = []
        for _user in _target_services:
            _key = DeviceUser.__tablename__ + ".uuid." + _user
            _conversation_name.append(self.redis.hget(_key, "user_fullname"))
        _conversation_name = ",".join(_conversation_name)

        _row = ConversationUserData(
            uuid=str(uuid.uuid1()),
            app_uuid=_app_uuid,
            user_uuid=_user_uuid,
            conversation_uuid=_conversation_uuid,
            conversation_name=_conversation_name,
            conversation_icon=_group_icon,
            conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add(self.redis)
        _row.create_redis_keys(self.redis)

        for _user in _target_services:
            _row = ConversationUserData(
                uuid=str(uuid.uuid1()),
                app_uuid=_app_uuid,
                user_uuid=_user,
                conversation_uuid=_conversation_uuid,
                conversation_name=_portal_user_name,
                conversation_icon=_portal_user_icon,
                conversation_status=CONVERSATION_STATUS.NEW)
            _row.async_add(self.redis)
            _row.create_redis_keys(self.redis)

        return
    def _new_conversation(self):
        _service_users = DeviceUser.__tablename__ + ".is_service_user.True"
        _service_users = self.application.redis.smembers(_service_users)

        if not _service_users:
            logging.error("no service user ???????")
            return

        _service_users = list(_service_users)
        _peer_uuid = _service_users[0]
        if len(_service_users) != 1:
            _peer_uuid = None

        _key = DeviceUser.__tablename__ + ".uuid." + self._user_uuid
        _portal_user_name = self.application.redis.hget(_key, "user_fullname")
        _portal_user_icon = self.application.redis.hget(_key, "user_icon")

        _conversation_uuid = str(uuid.uuid1())
        _row = ConversationInfo(
            uuid=_conversation_uuid,
            user_uuid=self._user_uuid
        )
        _row.async_add(self.application.redis)
        _row.create_redis_keys(self.application.redis)
        
        _conversation_name = []
        for _user in _service_users:
            _key = DeviceUser.__tablename__ + ".uuid." + _user
            _name = self.application.redis.hget(_key, "user_fullname")
            if not _name:
                continue
            _conversation_name.append(_name)
        _conversation_name = ",".join(_conversation_name)

        _row = ConversationUserData(uuid=str(uuid.uuid1()),
                                    user_uuid=self._user_uuid,
                                    peer_uuid=_peer_uuid,
                                    conversation_uuid=_conversation_uuid,
                                    conversation_name=_conversation_name,
                                    conversation_type=CONVERSATION_TYPE.P2S,
                                    conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add(self.application.redis)
        _row.create_redis_keys(self.application.redis)

        
        for _user in _service_users:
            _row = ConversationUserData(uuid=str(uuid.uuid1()),
                                        user_uuid=_user,
                                        peer_uuid=self._user_uuid,
                                        conversation_uuid=_conversation_uuid,
                                        conversation_name=_portal_user_name,
                                        conversation_icon=_portal_user_icon,
                                        conversation_type=CONVERSATION_TYPE.S2P,
                                        conversation_status=CONVERSATION_STATUS.NEW)
            _row.async_add(self.application.redis)
            _row.create_redis_keys(self.application.redis)
        return
Exemple #3
0
    def _all(self, _app_uuid, _user_uuid, _device_uuid):
        _key = AppUserData.__tablename__ + ".app_uuid." + _app_uuid + \
               ".is_service_user.True"
        _allocated_users = self.redis.smembers(_key)
        if _allocated_users == None or len(_allocated_users) == 0:
            self._ack_error(_device_uuid)
            return

        _key = DeviceUser.__tablename__ + ".uuid." + _user_uuid
        _portal_user_name = self.redis.hget(_key, "user_fullname")
        _portal_user_icon = self.redis.hget(_key, "user_icon")

        _group_icon = create_group_icon(self.redis, _allocated_users)

        _conversation_uuid = str(uuid.uuid1())
        _row = CoversationInfo(uuid=_conversation_uuid,
                               app_uuid=_app_uuid,
                               user_uuid=_user_uuid,
                               status=CONVESATION_STATUS.NEW,
                               conversation_type=CONVERSATION_TYPE.P2S)
        _row.async_add()
        _row.create_redis_keys(self.redis)

        _conversation_name = []
        for _user in _allocated_users:
            _key = DeviceUser.__tablename__ + ".uuid." + _user
            _conversation_name.append(self.redis.hget(_key, "user_fullname"))
        _conversation_name = ",".join(_conversation_name)

        _row = ConversationUserData(
            uuid=str(uuid.uuid1()),
            app_uuid=_app_uuid,
            user_uuid=_user_uuid,
            conversation_uuid=_conversation_uuid,
            conversation_name=_conversation_name,
            conversation_icon=_group_icon,
            conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add()
        _row.create_redis_keys(self.redis)

        for _user in _allocated_users:
            _row = ConversationUserData(
                uuid=str(uuid.uuid1()),
                app_uuid=_app_uuid,
                user_uuid=_user,
                conversation_uuid=_conversation_uuid,
                conversation_name=_portal_user_name,
                conversation_icon=_portal_user_icon,
                conversation_status=CONVERSATION_STATUS.NEW)
            _row.async_add()
            _row.create_redis_keys(self.redis)

        self._ack_success(_device_uuid, _conversation_uuid)
        return
Exemple #4
0
    def _create(self, _member_uuid, _request):
        _app_uuid = _request.get("app_uuid")
        _user_uuid = _request.get("user_uuid")
        _redis = self.application.redis

        _key = DeviceUser.__tablename__ + ".uuid." + _user_uuid
        _portal_user_name = _redis.hget(_key, "user_name")
        _portal_user_icon = _redis.hget(_key, "user_icon")

        _key = DeviceUser.__tablename__ + ".uuid." + _member_uuid
        _member_user_name = _redis.hget(_key, "user_name")
        _member_user_icon = _redis.hget(_key, "user_icon")

        _conversation_uuid = str(uuid.uuid1())
        _values = {
            "uuid": _conversation_uuid,
            "app_uuid": _app_uuid,
            "user_uuid": _user_uuid,
            "assigned_uuid": _member_uuid,
            "conversation_type": CONVERSATION_TYPE.P2S,
            "status": CONVERSATION_STATUS.NEW,
        }
        # create it
        _row = ConversationInfo(**_values)
        _row.async_add()
        _row.create_redis_keys(_redis)

        _row = ConversationUserData(
            uuid=str(uuid.uuid1()),
            app_uuid=_app_uuid,
            user_uuid=_user_uuid,
            conversation_uuid=_conversation_uuid,
            conversation_type=CONVERSATION_TYPE.P2S,
            conversation_name=_member_user_name,
            conversation_icon=_member_user_icon,
            conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add()
        _row.create_redis_keys(_redis)

        _row = ConversationUserData(
            uuid=str(uuid.uuid1()),
            app_uuid=_app_uuid,
            user_uuid=_member_uuid,
            conversation_uuid=_conversation_uuid,
            conversation_type=CONVERSATION_TYPE.P2S,
            conversation_name=_portal_user_name,
            conversation_icon=_portal_user_icon,
            conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add()
        _row.create_redis_keys(_redis)

        self._return(_conversation_uuid, _request)
        return
 def _close(self, _conversation_uuid, _user_uuid):
     _redis = self.application.redis
     _key = ConversationUserData.__tablename__ + \
            ".user_uuid." + _user_uuid + \
            ".conversation_uuid." + _conversation_uuid
     _uuid = _redis.get(_key)
     if _uuid == None:
         logging.error("no such conversation data: %s" % _key)
         self.setErrorCode(API_ERR.NO_CONVERSATION)
         return
     _row = ConversationUserData(uuid=_uuid, conversation_status=CONVERSATION_STATUS.CLOSE)
     _row.async_update(_redis)
     _row.update_redis_keys(_redis)
     return
 def _open(self, _user_uuid, _conversation_uuid):
     _redis = self.application.redis
     _key = ConversationUserData.__tablename__ + \
            ".user_uuid." + _user_uuid + \
            ".conversation_uuid." + _conversation_uuid
     _data_uuid = _redis.get(_key)
     if _data_uuid == None:
         self.setErrorCode(API_ERR.NO_CONVERSATION)
         return
     
     _row = ConversationUserData(uuid=_data_uuid, conversation_status=CONVERSATION_STATUS.OPEN)
     _row.async_update(_redis)
     _row.update_redis_keys(_redis)
     return
 def _remove(self):
     _redis = self.application.redis
     for _user_uuid in self._member_list:
         key = ConversationUserData.__tablename__ + \
               ".app_uuid." + self._app_uuid + \
               ".user_uuid." + _user_uuid + \
               ".conversation_uuid." + self._conv_uuid
         _uuid = _redis.get(key)
         if _uuid == None:
             continue
         _row = ConversationUserData(uuid=_uuid)
         _row.async_delete()
         _row.delete_redis_keys(_redis)
     return
 def _datarow(self, _user_uuid, _user_name, _conversation_type, _conversation_uuid, _conversation_name, _conversation_icon):
     _values = {
         "uuid": str(uuid.uuid1()),
         "user_uuid": _user_uuid,
         "user_name": _user_name,
         "conversation_type": _conversation_type,
         "conversation_uuid": _conversation_uuid,
         "conversation_name": _conversation_name,
         "conversation_icon": _conversation_icon,
         "conversation_status": CONVERSATION_STATUS.NEW,
     }
     _row = ConversationUserData(**_values)
     _row.async_add(self._redis)
     _row.create_redis_keys(self._redis)
     return
Exemple #9
0
    def _create(self, _member_uuid, _request):
        _user_uuid = _request.get("user_uuid")
        _redis = self.application.redis

        _key = DeviceUser.__tablename__ + ".uuid." + _user_uuid
        _portal_user_name = _redis.hget(_key, "user_fullname")
        _portal_user_icon = _redis.hget(_key, "user_icon")

        _key = DeviceUser.__tablename__ + ".uuid." + _member_uuid
        _member_user_name = _redis.hget(_key, "user_fullname")
        _member_user_icon = _redis.hget(_key, "user_icon")
        
        _conversation_uuid = str(uuid.uuid1())
        _values = {
            "uuid": _conversation_uuid,
            "user_uuid": _user_uuid
        }
        # create it
        _row = ConversationInfo(**_values)
        _row.async_add(_redis)
        _row.create_redis_keys(_redis)

        _row = ConversationUserData(uuid=str(uuid.uuid1()),
                                    user_uuid=_user_uuid,
                                    peer_uuid=_member_uuid,
                                    conversation_uuid=_conversation_uuid,
                                    conversation_type=CONVERSATION_TYPE.P2S,
                                    conversation_name=_member_user_name,
                                    conversation_icon=_member_user_icon,
                                    conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add(_redis)
        _row.create_redis_keys(_redis)

        _row = ConversationUserData(uuid=str(uuid.uuid1()),
                                    user_uuid=_member_uuid,
                                    peer_uuid=_user_uuid,
                                    conversation_uuid=_conversation_uuid,
                                    conversation_type=CONVERSATION_TYPE.S2P,
                                    conversation_name=_portal_user_name,
                                    conversation_icon=_portal_user_icon,
                                    conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add(_redis)
        _row.create_redis_keys(_redis)

        logging.info("return from new")
        return self._return(_conversation_uuid, _request)
 def _add(self):
     _redis = self.application.redis        
     for _user_uuid in self._member_list:
         key = ConversationUserData.__tablename__ + \
               ".app_uuid." + self._app_uuid + \
               ".user_uuid." + _user_uuid + \
               ".conversation_uuid." + self._conv_uuid
         if _redis.exists(key):
             continue
         _values = {
             "uuid": str(uuid.uuid1()),
             "user_uuid": _user_uuid,
             "app_uuid": self._app_uuid,
             "conversation_uuid": self._conv_uuid,
             "conversation_status": CONVERSATION_STATUS.OPEN,
             "conversation_type": self._conv["conversation_type"],
         }
         _row = ConversationUserData(**_values)
         _row.async_add()
         _row.create_redis_keys(_redis)
     return
 def _remove(self):
     _redis = self.application.redis
     for _user_uuid in self._member_list:
         key = ConversationUserData.__tablename__ + \
               ".user_uuid." + _user_uuid + \
               ".conversation_uuid." + self._conv_uuid
         _uuid = _redis.get(key)
         if _uuid == None:
             continue
         _row = ConversationUserData(uuid=_uuid)
         _row.async_delete(_redis)
         _row.delete_redis_keys(_redis)
     return
 def _datarow(self, _user_uuid, _user_name, _conversation_type, _conversation_uuid, _conversation_name, _conversation_icon):
     _values = {
         "uuid": str(uuid.uuid1()),
         "user_uuid": _user_uuid,
         "user_name": _user_name,
         "conversation_type": _conversation_type,
         "conversation_uuid": _conversation_uuid,
         "conversation_name": _conversation_name,
         "conversation_icon": _conversation_icon,
         "conversation_status": CONVERSATION_STATUS.NEW,
     }
     _row = ConversationUserData(**_values)
     _row.async_add(self._redis)
     _row.create_redis_keys(self._redis)
     return
Exemple #13
0
    def _open(self, _user_uuid, _conversation_uuid):
        _redis = self.application.redis
        _key = ConversationUserData.__tablename__ + \
               ".user_uuid." + _user_uuid + \
               ".conversation_uuid." + _conversation_uuid
        _data_uuid = _redis.get(_key)
        if _data_uuid == None:
            self.setErrorCode(API_ERR.NO_CONVERSATION)
            return

        _row = ConversationUserData(
            uuid=_data_uuid, conversation_status=CONVERSATION_STATUS.OPEN)
        _row.async_update(_redis)
        _row.update_redis_keys(_redis)
        return
 def _close(self, _conversation_uuid, _user_uuid):
     _redis = self.application.redis
     _key = ConversationUserData.__tablename__ + \
            ".user_uuid." + _user_uuid + \
            ".conversation_uuid." + _conversation_uuid
     _uuid = _redis.get(_key)
     if _uuid == None:
         logging.error("no such conversation data: %s" % _key)
         self.setErrorCode(API_ERR.NO_CONVERSATION)
         return
     _row = ConversationUserData(
         uuid=_uuid, conversation_status=CONVERSATION_STATUS.CLOSE)
     _row.async_update(_redis)
     _row.update_redis_keys(_redis)
     return
Exemple #15
0
    def save(self):
        _task = {
            "uuid": self._uuid,
            "app_uuid": self._app_uuid,
            "conversation_uuid": self._conversation_uuid,
            "conversation_type": self._conversation_type,
            "message_type": self._message_type,
            "message_subtype": self._message_subtype,
            "from_uuid": self._from_uuid,
            "from_type": self._from_type,
            "from_device_uuid": self._from_device_uuid,
            "to_uuid": self._to_uuid,
            "to_type": self._to_type,
            "body": self._message_body,
            "task_status": TASK_STATUS.PENDING,
        }
        _row = MessagePushTask(**_task)
        _row.async_add()
        _row.create_redis_keys(self._redis)

        _row = ConversationInfo(uuid=self._conversation_uuid,
                                status=CONVERSATION_STATUS.OPEN,
                                latest_task=self._uuid)
        _row.async_update()
        _row.update_redis_keys(self._redis)

        _m = {"task_uuid": self._uuid}
        self._redis.rpush(REDIS_DISPATCHER_NOTIFICATION_KEY, json.dumps(_m))

        _key = ConversationUserData.__tablename__ + ".conversation_uuid." + self._conversation_uuid + ".datas"
        _datas = self._redis.smembers(_key)
        for _data_uuid in _datas:
            _row = ConversationUserData(
                uuid=_data_uuid, conversation_status=CONVERSATION_STATUS.OPEN)
            _row.async_update()
            _row.update_redis_keys(self._redis)

        # for message routing algorithm
        self._user_latest_send_message_time()
        return
 def _add(self):
     _redis = self.application.redis        
     for _user_uuid in self._member_list:
         key = ConversationUserData.__tablename__ + \
               ".user_uuid." + _user_uuid + \
               ".conversation_uuid." + self._conv_uuid
         if _redis.exists(key):
             continue
         _values = {
             "uuid": str(uuid.uuid1()),
             "user_uuid": _user_uuid,
             "conversation_uuid": self._conv_uuid,
             "conversation_status": CONVERSATION_STATUS.OPEN,
             "conversation_type": self._conv["conversation_type"],
         }
         _row = ConversationUserData(**_values)
         _row.async_add(_redis)
         _row.create_redis_keys(_redis)
     return
Exemple #17
0
    def _smart(self, _app_uuid, _user_uuid, _device_uuid):
        _key = AppUserData.__tablename__ + ".app_uuid." + _app_uuid + \
               ".is_service_user.True"
        _service_users = self.redis.smembers(_key)
        if _service_users == None or len(_service_users) == 0:
            self._ack_error(_device_uuid)
            return

        _user_hashs = {}
        for _user in _service_users:
            _user_hashs[_user] = redis_hash_to_dict(self.redis, DeviceUser,
                                                    _user)

        _device_names = ["mobile_device_uuid", "browser_device_uuid"]

        _online_users = []
        for _user in _service_users:
            _user_hash = _user_hashs[_user]
            _online_devices = []
            for _device_name in _device_names:
                _user_device_uuid = _user_hash[_device_name]
                if _user_device_uuid == None or len(_user_device_uuid) == 0:
                    continue
                _key = DeviceInfo.__tablename__ + ".uuid." + _user_device_uuid
                if self.redis.hget(_key, "device_is_online") == "True":
                    _online_devices.append(_device)
            if len(_online_devices) > 0:
                _online_users.append(_user)

        if len(_online_users) == 0:
            return self._group(_app_uuid, _user_uuid, _device_uuid)

        _allocated_user = random.randint(0, len(_online_users) - 1)
        _allocated_user = _online_users[_allocated_user]

        _key = DeviceUser.__tablename__ + ".uuid." + _allocated_user
        _allocated_user_name = _user_hashs[_allocated_user]["user_fullname"]
        _allocated_user_icon = _user_hashs[_allocated_user]["user_icon"]

        _key = DeviceUser.__tablename__ + ".uuid." + _user_uuid
        _portal_user_name = self.redis.hget(_key, "user_fullname")
        _portal_user_icon = self.redis.hget(_key, "user_icon")

        _conversation_uuid = str(uuid.uuid1())
        _row = CoversationInfo(uuid=_conversation_uuid,
                               app_uuid=_app_uuid,
                               user_uuid=_user_uuid,
                               status=CONVESATION_STATUS.NEW,
                               conversation_type=CONVERSATION_TYPE.P2S)
        _row.async_add()
        _row.create_redis_keys(self.redis)

        _row = ConversationUserData(
            uuid=str(uuid.uuid1()),
            app_uuid=_app_uuid,
            user_uuid=_user_uuid,
            conversation_uuid=_conversation_uuid,
            conversation_name=_allocated_user_name,
            conversation_icon=_allocated_user_icon,
            conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add()
        _row.create_redis_keys(self.redis)

        _row = ConversationUserData(
            uuid=str(uuid.uuid1()),
            app_uuid=_app_uuid,
            user_uuid=_allocated_user,
            conversation_uuid=_conversation_uuid,
            conversation_name=_portal_user_name,
            conversation_icon=_portal_user_icon,
            conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add()
        _row.create_redis_keys(self.redis)

        self._ack_success(_device_uuid, _conversation_uuid)
        return
Exemple #18
0
    def _group(self, _app_uuid, _user_uuid, _device_uuid, _group_uuid):
        if _group_uuid == None:
            # find the primary group
            _key = OrgGroup.__tablename__ + ".app_uuid." + _app_uuid + \
                   ".is_distributor.True"
            _group_uuid = self.redis.get(_key)

        if _group_uuid == None:
            logging.error("no distributor group in app: %s" % _app_uuid)
            self._ack_error(_device_uuid)
            return True

        _key = OrgUserGroupData.__tablename__ + ".group_uuid." + _group_uuid
        _users = self.reids.smembers(_key)
        if _users == None or len(_users) == 0:
            logging.error("no service user in group: %s" % _group_uuid)
            self._ack_error(_device_uuid)
            return True

        _ready_users = []
        for _user in _users:
            _key = DeviceUser.__tablename__ + ".uuid." + _user
            _service_user_status = self.redis.hget(_key, "service_user_status")
            if _service_user_status == SERVICE_USER_STATUS.READY:
                _ready_users.append(_user)

        if len(_ready_users) == 0:
            logging.info("waiting group user ready: %s" % _group_uuid)
            self._ack_waiting(_device_uuid)
            self._back_to_queue(_app_uuid, _user_uuid, _device_uuid,
                                _group_uuid)
            return False

        _allocated_user = random.randint(0, len(_ready_users) - 1)
        _allocated_user = _users[_allocated_user]

        _allocated_user_dict = redis_hash_to_dict(self.redis, DeviceUser,
                                                  _allocated_user)
        _portal_user_dict = redis_hash_to_dict(self.redis, DeviceUser,
                                               _user_uuid)

        _conversation_uuid = str(uuid.uuid1())
        _row = CoversationInfo(uuid=_conversation_uuid,
                               app_uuid=_app_uuid,
                               group_uuid=_group_uuid,
                               user_uuid=_user_uuid,
                               assigned_uuid=_allocated_user,
                               status=CONVESATION_STATUS.NEW,
                               conversation_type=CONVERSATION_TYPE.P2S)

        _row.async_add()
        _row.create_redis_keys(self.redis)

        _row = ConversationUserData(
            uuid=str(uuid.uuid1()),
            app_uuid=_app_uuid,
            user_uuid=_user_uuid,
            conversation_uuid=_conversation_uuid,
            conversation_name=_allocated_user_dict["user_fullname"],
            conversation_icon=_allocated_user_dict["user_icon"],
            conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add()
        _row.create_redis_keys(self.redis)

        _row = ConversationUserData(
            uuid=str(uuid.uuid1()),
            app_uuid=_app_uuid,
            user_uuid=_allocated_user,
            conversation_uuid=_conversation_uuid,
            conversation_name=_portal_user_dict["user_fullname"],
            conversation_icon=_portal_user_dict["user_icon"],
            conversation_status=CONVERSATION_STATUS.NEW)
        _row.async_add()
        _row.create_redis_keys(self.redis)

        self._ack_success(_device_uuid, _conversation_uuid)
        return True