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
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
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
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
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
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
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
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))
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))
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))