Source code for pyepp.base_command

"""
Base command
"""

from typing import Any

import uuid

from dataclasses import dataclass
from html import escape

from pyepp.epp import EppCommunicator, EppResultData
from pyepp.command_templates import template_engine


[docs] class ErrorCodeInResultException(Exception): """ Error code in result exception """
# pylint: disable=too-few-public-methods
[docs] class BaseCommand: """ Base command class. Other EPP commands will inherit this class. """ PARAMS = () def __init__(self, epp_communicator: EppCommunicator) -> None: """ :param epp_communicator: EPP Communicator object """ self._epp_communicator = epp_communicator
[docs] def execute(self, xml_command: str, **kwargs) -> EppResultData: """This receives an EPP XML command and the arguments and send to the EPP server to be executed. :param xml_command: XML command :param kwargs: Keyword arguments :return: Response Object """ cmd = self._prepare_command(xml_command, **kwargs) result = self._epp_communicator.execute(cmd) return result
def _prepare_command(self, cmd: str, **kwargs: Any) -> str: """Prepare an EPP XML command for execution by setting up the arguments. :param cmd: Command in XML format :param kwargs: Keyword arguments :return: XML command """ if cmd.find("client_transaction_id") != -1 and not kwargs.get( "client_transaction_id" ): kwargs["client_transaction_id"] = str(uuid.uuid4()) kwargs = {key: value for key, value in kwargs.items() if value is not None} new_kwargs = self.__escape_dict(kwargs) template = template_engine.from_string(cmd) xml = template.render(**new_kwargs) return xml def __escape_list(self, input_list: list) -> list: result = [] for value in input_list: if isinstance(value, list): result.append(self.__escape_list(value)) elif isinstance(value, dict): result.append(self.__escape_dict(value)) elif isinstance(value, str): result.append(escape(value)) elif value is not None: result.append(value) return result def __escape_dict(self, input_dict: dict) -> dict: result = {} for key, value in input_dict.items(): if isinstance(value, list): result[key] = self.__escape_list(value) elif isinstance(value, dict): result[key] = self.__escape_dict(value) elif isinstance(value, str): result[key] = escape(value) elif value is not None: result[key] = value return result def _data_to_dict(self, data: dataclass) -> dict: """Convert a dataclass to a dict. :param data: data :return: data """