48 lines
1.9 KiB
Python
48 lines
1.9 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
from lxml import etree
|
||
|
from odoo.tools.misc import file_open
|
||
|
|
||
|
|
||
|
def check_with_xsd(tree_or_str, stream):
|
||
|
raise UserError("Method 'check_with_xsd' deprecated ")
|
||
|
|
||
|
|
||
|
def _check_with_xsd(tree_or_str, stream):
|
||
|
if not isinstance(tree_or_str, etree._Element):
|
||
|
tree_or_str = etree.fromstring(tree_or_str)
|
||
|
xml_schema_doc = etree.parse(stream)
|
||
|
xsd_schema = etree.XMLSchema(xml_schema_doc)
|
||
|
try:
|
||
|
xsd_schema.assertValid(tree_or_str)
|
||
|
except etree.DocumentInvalid as xml_errors:
|
||
|
#import UserError only here to avoid circular import statements with tools.func being imported in exceptions.py
|
||
|
from odoo.exceptions import UserError
|
||
|
raise UserError('\n'.join(str(e) for e in xml_errors.error_log))
|
||
|
|
||
|
|
||
|
def create_xml_node_chain(first_parent_node, nodes_list, last_node_value=None):
|
||
|
""" Utility function for generating XML files nodes. Generates as a hierarchical
|
||
|
chain of nodes (each new node being the son of the previous one) based on the tags
|
||
|
contained in `nodes_list`, under the given node `first_parent_node`.
|
||
|
It will also set the value of the last of these nodes to `last_node_value` if it is
|
||
|
specified. This function returns the list of created nodes.
|
||
|
"""
|
||
|
res = []
|
||
|
current_node = first_parent_node
|
||
|
for tag in nodes_list:
|
||
|
current_node = etree.SubElement(current_node, tag)
|
||
|
res.append(current_node)
|
||
|
|
||
|
if last_node_value is not None:
|
||
|
current_node.text = last_node_value
|
||
|
return res
|
||
|
|
||
|
def create_xml_node(parent_node, node_name, node_value=None):
|
||
|
""" Utility function for managing XML. It creates a new node with the specified
|
||
|
`node_name` as a child of given `parent_node` and assigns it `node_value` as value.
|
||
|
:param parent_node: valid etree Element
|
||
|
:param node_name: string
|
||
|
:param node_value: string
|
||
|
"""
|
||
|
return create_xml_node_chain(parent_node, [node_name], node_value)[0]
|