Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions data_spec/dialog_schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,28 +118,32 @@
</xs:attribute>
</xs:complexType>

<xs:complexType name="genericSchema">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="textValues" type="textValuesSchema" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
</xs:sequence>
<xs:attribute name="scope" type="xs:string"/>
<xs:attribute name="structure">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="listItem"/>
<xs:enumeration value="emptyList"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>

<xs:complexType name="outputSchema">
<xs:choice minOccurs="1" maxOccurs="1">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="generic" type="genericSchema" minOccurs="0" maxOccurs="1"/>
<xs:element name="text" type="textSchema" minOccurs="0" maxOccurs="1"/>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="textValues" type="textValuesSchema" minOccurs="0" maxOccurs="1"/>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="response" type="responseSchema" minOccurs="0" maxOccurs="1"/>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:choice>
<xs:attribute name="scope" type="xs:string"/>
<xs:attribute name="structure">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="listItem"/>
<xs:enumeration value="emptyList"/>
<xs:enumeration value="emptyDict"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
Expand Down
23 changes: 17 additions & 6 deletions scripts/dialog_json2xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,12 +139,23 @@ def convertNode(nodeJSON):
if genericItemXML.find('response_type') is None:
logger.error("'response_type' is missing in the output of the node " + nodeJSON['dialog_node'])
elif genericItemXML.find('response_type').text == 'text': # TODO check other response_types
if genericItemXML.findall('values') is not None:
if len(genericItemXML.findall('values')) == 1:
if not 'structure' in genericItemXML.find('values').attrib: # structure is not specified yet
# values has to be of type array
genericItemXML.find('values').attrib['structure'] = 'listItem'
logger.verbose("setting 'listitem' attribute to 'values' tag")
if genericItemXML.findall('values') is not None and genericItemXML.findall('text') is not None:
# join text elements into one element <textValues>
texts_values = []
textValuesNode = LET.Element("textValues")
for x in genericItemXML.findall('values'):
texts_values.append(x[0].text)
values_item = LET.Element("values")
values_item.attrib['structure'] = 'listItem'
logger.verbose("setting 'listitem' attribute to 'values' tag")
values_item.text = x[0].text
textValuesNode.append(values_item)
genericItemXML.remove(x)
if genericItemXML.find('selection_policy') is not None:
textValuesNode.append(genericItemXML.find('selection_policy'))
genericItemXML.append(textValuesNode)
# No need for response type since we are talking about textValues
genericItemXML.remove(genericItemXML.find("response_type"))

#goto
if 'next_step' in nodeJSON:
Expand Down
38 changes: 33 additions & 5 deletions scripts/dialog_xml2json.py
Original file line number Diff line number Diff line change
Expand Up @@ -668,14 +668,41 @@ def printNodes(root, parent, dialogJSON):
outputNodeXML.append(outputNodeTextXML)
# TODO save againMessage
outputNodeXML.text = None
if outputNodeXML.find('textValues') is not None:
outputNodeTextXML = outputNodeXML.find('textValues')

# output has one child element which is <text>
if outputNodeXML.find('text') is not None:
genericNode = LET.Element('generic')
text_element = outputNodeXML.find('text')
values_list = LET.Element("values")
values_list.append(text_element)
values_list.attrib['structure'] = "listItem"
genericNode.append(values_list)
genericNode.attrib['structure'] = "listItem"
response_type_elem = LET.Element("response_type")
response_type_elem.text = "text"
genericNode.append(response_type_elem)
outputNodeXML.append(genericNode)
# transform textValues context to ( "values": [ { "text" : "text1", "text" : "text2" } ], response_type: "text" )
if outputNodeXML.find('.//textValues') is not None:
outputNodeTextXML = outputNodeXML.find('.//textValues')
if outputNodeTextXML.get('structure') is not None:
for outputNodeTextValueXML in outputNodeTextXML.findall('values'):
outputNodeTextValueXML.attrib['structure'] = outputNodeTextXML.get('structure')
outputNodeTextXML.attrib.pop('structure')
#rename textValues element to text
outputNodeTextXML.tag = 'text'
outputNodeTextXML.tag = "values_parent"
parentNode = outputNodeTextXML.getparent()
for child in outputNodeTextXML.getchildren():
if child.tag == 'values':
textIs = child.text
newElem = LET.Element('text')
newElem.text = textIs
child.append(newElem)
parentNode.append(child)
parentNode.remove(outputNodeTextXML)
outputNodeTextXML = parentNode
response_type = LET.Element('response_type')
response_type.text = "text"
outputNodeTextXML.append(response_type)

#if len(outputNodeXML.getchildren()) == 0: # remove empy output ("output": Null cannot be uploaded to WA)
# nodeXML.remove(outputNodeXML)
Expand Down Expand Up @@ -830,7 +857,8 @@ def convertAll(upperNodeJson, nodeXml):
for name in nodeNameMap:
# structure=listItem attribute results in generating array rather then object
#if len(nodeNameMap[name]) == 1 and nodeNameMap[name][0].get('structure') != 'listItem' and name!='values':
if len(nodeNameMap[name]) == 1 and nodeNameMap[name][0].get('structure') != 'listItem' :
# generic node has special case where it has to be list even if it contains one element
if len(nodeNameMap[name]) == 1 and nodeNameMap[name][0].get('structure') != 'listItem' and len(nodeNameMap[name]) == 1 and name != "generic":
convertAll(upperNodeJson[key], nodeNameMap[name][0])
logger.verbose("Subtag is tag")
else:
Expand Down