import logging
from typing import Union
from lxml import etree
from q2_sdk.hq.models.hq_response import HqResponse
DEFAULT_LOGGER = logging.getLogger()
[docs]
class BackOfficeResponse(HqResponse):
"""
Wraps a response from HQ up as a handy object to work with
"""
def __init__(self, raw_response: Union[str, dict], logger=None):
super().__init__(raw_response, logger=logger)
self.clean_result_node()
self.q2_token = self.headers.get("q2token")
[docs]
def clean_result_node(self):
"""
Cleans up the grossness of the BackOffice response in a few ways:
1. Removes namespaces
2. Moves children of diffgrams to the diffgram's parent
3. Removes the diffgram node
4. Removes schema nodes
5. Objects from BackOffice typically have a parent and child node named
the same thing. Only store the child
"""
if self.result_node is None:
return
children_to_migrate = []
for elem in self.result_node.iter():
elem.tag = etree.QName(elem.tag).localname
for elem in self.result_node.iter("schema"):
elem.getparent().remove(elem)
for elem in self.result_node.iter("diffgram"):
for child in elem.getchildren():
elem.getparent().append(child)
elem.getparent().remove(elem)
for elem in self.result_node.iter():
if elem.getparent().tag == elem.tag:
children_to_migrate.append(elem)
for elem in children_to_migrate:
parent = elem.getparent()
parent.getparent().append(elem)
if not parent.getchildren():
parent.getparent().remove(parent)
@staticmethod
def is_success(inner_response):
if inner_response.ErrorReturnCode.pyval != 0:
return False
return True
[docs]
@staticmethod
def get_hq_return_error(inner_response: etree.Element):
"""
Parses HQ response and returns an error message if one exists
:param inner_response: Result Node from HQ response
"""
msg = None
if inner_response.ErrorReturnCode.pyval != 0:
tag = etree.QName(inner_response.tag).localname
code = inner_response.ErrorReturnCode.pyval
msg = f"Backoffice {tag} ErrorCode: {code}"
return msg
@staticmethod
def get_error_code(inner_response: etree.Element):
return inner_response.ErrorReturnCode.pyval