Esempio n. 1
0
    def resolve_to_string(self, client_context):

        conversation = client_context.bot.get_conversation(client_context)
        name = self.name.resolve(client_context)
        value = self.resolve_children(client_context)

        if self.property_type == 'var':
            YLogger.debug(client_context, "[%s] resolved to var: [%s] => [%s]",
                          self.to_string(), name, value)
            conversation.current_question().set_property(name, value)
        elif self.property_type == 'data':
            YLogger.debug(client_context,
                          "[%s] resolved to data: [%s] => [%s]",
                          self.to_string(), name, value)
            conversation.set_data_property(name, value)
        elif self.property_type == 'name':
            YLogger.debug(client_context,
                          "[%s] resolved to name: [%s] => [%s]",
                          self.to_string(), name, value)
            value = conversation.set_property(name, value)

        YLogger.debug(client_context, "[%s] resolved to [%s]",
                      self.to_string(), value)

        if value == '':
            value = TemplateGetNode.get_default_value(client_context)
        return value
Esempio n. 2
0
    def resolve_to_string(self, client_context):
        result = self.resolve_children_to_string(client_context)
        resolved = TemplateGetNode.get_default_value(client_context)
        if result != "":
            try:
                data = json.loads(result)
                if isinstance(data, list):
                    if len(data) > 0:
                        resolved = json.dumps(data[0])
                else:
                    raise Exception("Not what I wanted")
            except Exception:
                words = client_context.brain.tokenizer.texts_to_words(result)
                if len(words) > 0:
                    resolved = words[0]

        YLogger.debug(client_context, "[%s] resolved to [%s]", self.to_string(), resolved)

        return resolved
Esempio n. 3
0
    def resolve_to_string(self, client_context):
        resolved = ""
        conversation = client_context.bot.get_conversation(client_context)
        slotName = self._slotName.resolve(client_context)
        itemName = self._itemName.resolve(client_context)
        try:
            slotIndex = int(self._index.resolve(client_context))
        except Exception:
            slotIndex = 0

        try:
            if self._varName is None:
                value = conversation.current_question().property(
                    "__SYSTEM_NLUDATA__")
                if value is None:
                    YLogger.error(
                        self, "TemplateNluSlotNode __SYSTEM_NLUDATA__ is None")
                    resolved = TemplateGetNode.get_default_value(
                        client_context)
                    return resolved
            else:
                if self._varType == 'name':
                    value = conversation.property(self._varName)
                elif self._varType == 'data':
                    value = conversation.data_property(self._varName)
                else:
                    value = conversation.current_question().property(
                        self._varName)
                if value is None:
                    YLogger.error(
                        self, "TemplateNluSlotNode %s is None" % self._varName)
                    resolved = TemplateGetNode.get_default_value(
                        client_context)
                    return resolved
        except Exception:
            YLogger.error(self,
                          "TemplateNluSlotNode failed to load NLU result")
            resolved = TemplateGetNode.get_default_value(client_context)
            return resolved

        slots = None
        try:
            json_dict = json.loads(value)
            if self._keys is not None:
                first = True
                for key in self._keys:
                    if first:
                        first = False
                        continue
                    json_dict = json_dict[key]
                    if key == self._keys[-1]:
                        break
            slots = json_dict["slots"]
        except Exception:
            YLogger.error(
                self, "TemplateNluSlotNode slots not found in target data")
            resolved = TemplateGetNode.get_default_value(client_context)
            return resolved

        slotsKeyName = "slot"

        slotKeys = [slot.get(slotsKeyName) for slot in slots]
        if itemName == "count":
            if slotName == "*":
                resolved = str(len(slotKeys))
            else:
                resolved = str(slotKeys.count(slotName))

            YLogger.debug(client_context, "nluslot [%s] resolved to [%s]",
                          itemName, resolved)
            return resolved

        index = None
        try:
            if slotName == "*":
                index = 0
                if slotIndex != 0:
                    index = slotIndex
            else:
                if slotIndex != 0:
                    slotCounter = 0
                    targetCounter = 0
                    for name in slotKeys:
                        if name == slotName:
                            if targetCounter == slotIndex:
                                index = slotCounter
                                break
                            targetCounter += 1
                        slotCounter += 1
                else:
                    index = slotKeys.index(slotName)
        except Exception:
            YLogger.debug(client_context, "nluslot non search keys:%s",
                          slotName)

        if index is not None:
            YLogger.debug(client_context, "nluintent index[%s]", index)
            try:
                if itemName in slots[index]:
                    resolved = str(slots[index].get(itemName))
            except Exception:
                YLogger.debug(client_context, "nluslot non search item:%s",
                              itemName)

        if resolved == '':
            YLogger.debug(client_context, "nluslot failed slot=[%s] item=[%s]",
                          slotName, itemName)
            resolved = TemplateGetNode.get_default_value(client_context)

        YLogger.debug(client_context, "nluslot [%s] resolved to [%s:%s]",
                      slotName, itemName, resolved)

        return resolved
Esempio n. 4
0
    def resolve_to_string(self, client_context):
        resolved = self.resolve_children(client_context)
        resolved = resolved.strip()
        conversation = client_context.bot.get_conversation(client_context)
        name = self._name.resolve(client_context)

        try:
            key = self._key.resolve(client_context)
            name = name + "." + key
        except Exception:
            pass

        try:
            self.function = self._function.resolve(client_context)
            if self.function not in ['len', 'delete', 'insert']:
                YLogger.debug(self, "JSON unknown function type [%s]",
                              self.function)
                return ''
        except Exception:
            self.function = 'None'
        try:
            self.index = self._index.resolve(client_context)
            try:
                int(self.index)
            except ValueError:
                YLogger.debug("JSON index not numeric [%s]", self.index)
        except Exception:
            self.index = ""
        try:
            self.item = self._item.resolve(client_context)
        except Exception:
            self.item = "value"

        if self.function == 'insert' and self.index == "":
            YLogger.debug(self, "JSON insert-function needs index parameter")
            return ''

        if self.function == 'delete':
            resolved = ''

        try:
            self.keys = name.split('.')
            if '' in self.keys:
                YLogger.debug(self, "JSON invalid key")
                if len(resolved) == 0 and self.function != 'delete':
                    return TemplateGetNode.get_default_value(client_context)
                else:
                    return ''

            if self._type == "var":
                if conversation.has_current_question():
                    value = conversation.current_question().property(
                        self.keys[0])
            elif self._type == "data":
                value = conversation.data_property(self.keys[0])
            elif self._type == "name":
                value = conversation.property(self.keys[0])
            else:
                YLogger.debug(self, "JSON invalid variables type")
                return ''
            json_dict = json.loads(value)
        except Exception:
            if len(resolved) == 0:
                json_dict = None
            else:
                json_dict = {}

        if len(resolved) > 0:
            resolved = self._json_set_elements(client_context, json_dict,
                                               resolved)
        else:
            if self.function == 'delete':
                resolved = self._json_delete_elements(client_context,
                                                      json_dict)
            else:
                resolved = self._json_get_elements(client_context, json_dict)

        return resolved
Esempio n. 5
0
    def _json_get_elements(self, client_context, json_dict):
        if self.index != "":
            try:
                indexNo = int(self.index)
            except Exception:
                resolved = TemplateGetNode.get_default_value(client_context)
                YLogger.debug(
                    client_context,
                    "Template-JSON failed to get (invalid index[%s])",
                    self.index)
                return resolved

        resolved = ''
        if json_dict is not None:
            try:
                first = True
                for key in self.keys:
                    if first:
                        first = False
                        continue
                    json_dict = json_dict[key]

                if type(json_dict) is dict or type(json_dict) is list:
                    dic_len = len(json_dict)
                    if self.function == 'len':
                        resolved = str(dic_len)
                    elif self.index != "":
                        if indexNo < 0:
                            indexNo += dic_len
                            if indexNo < 0:
                                indexNo = dic_len
                        if indexNo < dic_len:
                            if type(json_dict) is dict:
                                for loop, indexKey in enumerate(json_dict):
                                    if loop == indexNo:
                                        if self.item == 'key':
                                            resolved = indexKey
                                        else:
                                            resolved = json_dict[indexKey]
                                        break
                            else:
                                resolved = json_dict[indexNo]
                                if resolved is None:
                                    resolved = 'null'
                    else:
                        resolved = json_dict
                else:
                    if self.function == 'len':
                        resolved = "1"
                    else:
                        if self.index != "":
                            if indexNo == 0 or indexNo == -1:
                                resolved = json_dict
                            else:
                                resolved = ''
                        else:
                            if json_dict is None:
                                resolved = 'null'
                            else:
                                if type(json_dict) is str and len(
                                        json_dict) == 0:
                                    resolved = '""'
                                else:
                                    resolved = json_dict

                if type(resolved) is dict or type(resolved) is list:
                    resolved = json.dumps(resolved, ensure_ascii=False)
                elif type(resolved) is int or type(resolved) is float or type(
                        resolved) is complex:
                    resolved = str(resolved)
                elif type(resolved) is bool:
                    resolved = str(resolved).lower()
            except Exception as e:
                YLogger.exception(self, "JSON failed to load JSON", e)

        if resolved == '':
            YLogger.debug(client_context,
                          "TemplateJsonNode get failed %s index=[%s]",
                          self.keys, self.index)
            resolved = TemplateGetNode.get_default_value(client_context)

        YLogger.debug(client_context, "JSON get %s resolved to [%s]",
                      self.keys, resolved)
        return resolved
Esempio n. 6
0
    def resolve_to_string(self, client_context):
        resolved = ""
        conversation = client_context.bot.get_conversation(client_context)
        slotName = self._slotName.resolve(client_context)
        itemName = self._itemName.resolve(client_context)
        try:
            slotIndex = int(self._index.resolve(client_context))
        except Exception:
            slotIndex = 0

        slots = None
        try:
            value = conversation.current_question().property(
                "__SYSTEM_NLUDATA__")
            json_dict = json.loads(value)
            slots = json_dict["slots"]
        except Exception:
            YLogger.error(
                self, "TemplateNluSlotNode failed to load __SYSTEM_NLUDATA__")
            return resolved

        slotsKeyName = "slot"

        slotKeys = [slot.get(slotsKeyName) for slot in slots]
        if itemName == "count":
            if slotName == "*":
                resolved = str(len(slotKeys))
            else:
                resolved = str(slotKeys.count(slotName))

            YLogger.debug(client_context, "nluslot [%s] resolved to [%s]",
                          itemName, resolved)
            return resolved

        index = None
        try:
            if slotName == "*":
                index = 0
                if slotIndex != 0:
                    index = slotIndex
            else:
                if slotIndex != 0:
                    slotCounter = 0
                    targetCounter = 0
                    for name in slotKeys:
                        if name == slotName:
                            if targetCounter == slotIndex:
                                index = slotCounter
                                break
                            targetCounter += 1
                        slotCounter += 1
                else:
                    index = slotKeys.index(slotName)
        except Exception:
            YLogger.debug(client_context, "nluslot non search keys:%s",
                          slotName)

        if index is not None:
            YLogger.debug(client_context, "nluintent index[%s]", index)
            try:
                if itemName in slots[index]:
                    resolved = str(slots[index].get(itemName))
            except Exception:
                YLogger.debug(client_context, "nluslot non search item:%s",
                              itemName)

        if resolved == '':
            YLogger.debug(client_context, "nluslot failed slot=[%s] item=[%s]",
                          slotName, itemName)
            resolved = TemplateGetNode.get_default_value(client_context)

        YLogger.debug(client_context, "nluslot [%s] resolved to [%s:%s]",
                      slotName, itemName, resolved)

        return resolved
Esempio n. 7
0
    def resolve_to_string(self, client_context):
        resolved = ""
        conversation = client_context.bot.get_conversation(client_context)
        intentName = self._intentName.resolve(client_context)
        itemName = self._itemName.resolve(client_context)
        try:
            intentIndex = int(self._index.resolve(client_context))
        except Exception:
            intentIndex = 0

        intents = None
        try:
            value = conversation.current_question().property("__SYSTEM_NLUDATA__")
            json_dict = json.loads(value)
            intents = json_dict["intents"]
        except Exception:
            YLogger.error(self, "TemplateNluintentNode failed to load __SYSTEM_NLUDATA__")
            return resolved

        intentsKeyName = "intent"
        intentsKey = [intent.get(intentsKeyName) for intent in intents]
        if itemName == "count":
            if intentName == "*":
                resolved = str(len(intentsKey))
            else:
                resolved = str(intentsKey.count(intentName))

            YLogger.debug(client_context, "nluintent [%s] resolved to [%s]", itemName, resolved)
            return resolved

        index = None
        try:
            if intentName == "*":
                index = 0
                if intentIndex != 0:
                    index = intentIndex
            else:
                if intentIndex != 0:
                    intentCounter = 0
                    counter = 0
                    for name in intentsKey:
                        if name == intentName:
                            if counter == intentIndex:
                                index = intentCounter
                            counter += 1
                        intentCounter += 1
                else:
                    index = intentsKey.index(intentName)
        except Exception:
            YLogger.debug(client_context, "nluintent non search keys:%s", intentName)

        if index is not None:
            YLogger.debug(client_context, "nluintent index[%s]", index)
            try:
                if itemName in intents[index]:
                    resolved = str(intents[index].get(itemName))
            except Exception:
                YLogger.debug(client_context, "nluintent non search item:%s", itemName)

        if resolved == '':
            YLogger.debug(client_context, "nluintent  failed intent=[%s] item=[%s]", intentName, itemName)
            resolved = TemplateGetNode.get_default_value(client_context)

        YLogger.debug(client_context, "nluintent  [%s] resolved to [%s:%s]", intentName, itemName, resolved)

        return resolved
Esempio n. 8
0
 def test_default_value_no_value(self):
     self._client_context.bot.brain.configuration.defaults._default_get = None
     self.assertEqual(
         "unknown", TemplateGetNode.get_default_value(self._client_context))
Esempio n. 9
0
 def test_default_value_default_get(self):
     self._client_context.bot.brain.configuration.defaults._default_get = "test456"
     self.assertEqual(
         "test456", TemplateGetNode.get_default_value(self._client_context))
Esempio n. 10
0
 def test_default_value_properties(self):
     self._client_context.bot.brain.properties.add_property(
         "default_get", "test123")
     self.assertEqual(
         "test123", TemplateGetNode.get_default_value(self._client_context))