def test_basic(self):
        span = SimpleXMLElement(
            '<span><a href="python.org.ar">pyar</a>'
            '<prueba><i>1</i><float>1.5</float></prueba></span>')
        span1 = SimpleXMLElement('<span><a href="google.com">google</a>'
                                 '<a>yahoo</a><a>hotmail</a></span>')
        self.eq([str(a) for a in span1.a()], ['google', 'yahoo', 'hotmail'])

        span1.add_child('a', 'altavista')
        span1.b = "ex msn"
        d = {'href': 'http://www.bing.com/', 'alt': 'Bing'}
        span1.b[:] = d
        self.eq(sorted([(k, v) for k, v in span1.b[:]]), sorted(d.items()))

        xml = ('<?xml version="1.0" encoding="UTF-8"?><span>'
               '<a href="google.com">google</a><a>yahoo</a>'
               '<a>hotmail</a><a>altavista</a>'
               '<b alt="Bing" href="http://www.bing.com/">ex msn</b></span>')
        self.eq(span1.as_xml(), xml if PY2 else xml.encode('utf-8'))
        self.assertTrue('b' in span1)

        span.import_node(span1)
        xml = (
            '<?xml version="1.0" encoding="UTF-8"?><span>'
            '<a href="python.org.ar">pyar</a><prueba><i>1</i>'
            '<float>1.5</float></prueba><span><a href="google.com">google</a>'
            '<a>yahoo</a><a>hotmail</a><a>altavista</a>'
            '<b alt="Bing" href="http://www.bing.com/">ex msn</b>'
            '</span></span>')
        self.eq(span.as_xml(), xml if PY2 else xml.encode('utf-8'))

        types = {'when': datetime.datetime}
        when = datetime.datetime.now()
        dt = SimpleXMLElement('<when>%s</when>' % when.isoformat())
        self.eq(dt.unmarshall(types)['when'], when)
示例#2
0
def serializar(regs):
    "Dado una lista de comprobantes (diccionarios), convierte a xml"
    xml = SimpleXMLElement(XML_BASE)

    comprobantes = []
    for reg in regs:
        dic = {}
        for k, v in list(MAP_ENC.items()):
            dic[v] = reg[k]

        dic.update({
            'detalles': [{
                'detalle': mapear({}, det, MAP_DET, swap=True),
            } for det in reg['detalles']],
            'tributos': [{
                'tributo': mapear({}, trib, MAP_TRIB, swap=True),
            } for trib in reg['tributos']],
            'ivas': [{
                'iva': mapear({}, iva, MAP_IVA, swap=True),
            } for iva in reg['ivas']],
            'formaspago': [{
                'formapago': {
                    'codigo': '',
                    'descripcion': reg['forma_pago'],
                }}]
        })
        comprobantes.append(dic)

    for comprobante in comprobantes:
        xml.marshall("comprobante", comprobante)
    return xml.as_xml()
示例#3
0
def serializar(regs):
    "Dado una lista de comprobantes (diccionarios), convierte a xml"
    xml = SimpleXMLElement(XML_BASE)

    comprobantes = []
    for reg in regs:
        dic = {}
        for k, v in MAP_ENC.items():
            dic[v] = reg[k]
                
        dic.update({
                'detalles': [{
                    'detalle': mapear({}, det, MAP_DET, swap=True),
                    } for det in reg['detalles']],                
                'tributos': [{
                    'tributo': mapear({}, trib, MAP_TRIB, swap=True),
                    } for trib in reg['tributos']],
                'ivas': [{
                    'iva': mapear({}, iva, MAP_IVA, swap=True),
                    } for iva in reg['ivas']],
                'formaspago': [{
                'formapago': {
                    'codigo': '',
                    'descripcion': reg['forma_pago'],
                    }}]
                })
        comprobantes.append(dic)

    for comprobante in comprobantes:
        xml.marshall("comprobante", comprobante)
    return xml.as_xml()
示例#4
0
 def call(self, method, *args, **kwargs):
     "Prepara el xml y realiza la llamada SOAP, devuelve un SimpleXMLElement"
     # Mensaje de Solicitud SOAP básico:
     xml = self.__xml % dict(method=method,
                             namespace=self.namespace,
                             ns=self.__ns,
                             soap_ns=self.__soap_ns,
                             soap_uri=soap_namespaces[self.__soap_ns])
     request = SimpleXMLElement(xml,
                                namespace=self.__ns and self.namespace,
                                prefix=self.__ns)
     # parsear argumentos
     if kwargs:
         parameters = kwargs.items()
     else:
         parameters = args
     for k, v in parameters:  # dict: tag=valor
         self.parse(getattr(request, method), k, v)
     self.xml_request = request.as_xml()
     self.xml_response = self.send(method, self.xml_request)
     response = SimpleXMLElement(self.xml_response,
                                 namespace=self.namespace)
     if self.exceptions and ("soapenv:Fault" in response
                             or "soap:Fault" in response):
         raise SoapFault(unicode(response.faultcode),
                         unicode(response.faultstring))
     return response
示例#5
0
def makeNRPSrequest(seqs):
    root = SimpleXMLElement("<predict></predict>",prefix="ws",namespace="http://ws.NRPSpredictor2.roettig.org/")
    root.add_child("request",ns=True)
    print root.as_xml(pretty=True)
    arg0_node = root.children()[0]
    

    idx = 1
    for seq in seqs:
        seqs_node = arg0_node.add_child("sequence",ns=True)
        seqs_node.add_child("id","%d"%idx,ns=True)
        seqs_node.add_child("kingdom","0",ns=True)
        seqs_node.add_child("seqString",seq,ns=True)
        seqs_node.add_child("sequenceType","0",ns=True)
        idx+=1
    print root.as_xml(pretty=True)    
    return root
    def test_marshall_cdata(self):
        span = SimpleXMLElement('<span/>')
        cdata = CDATASection()
        cdata.data = 'python'
        span.add_child('a', cdata)

        xml = '<?xml version="1.0" encoding="UTF-8"?><span><a><![CDATA[python]]></a></span>'
        self.eq(span.as_xml(), xml if PY2 else xml.encode('utf-8'))
    def test_marshall_cdata(self):
        span = SimpleXMLElement('<span/>')
        cdata = CDATASection()
        cdata.data = 'python'
        span.add_child('a', cdata)

        xml = '<?xml version="1.0" encoding="UTF-8"?><span><a><![CDATA[python]]></a></span>'
        self.eq(span.as_xml(), xml if PY2 else xml.encode('utf-8'))
示例#8
0
def makeNRPSrequest(seqs):
    root = SimpleXMLElement("<predict></predict>",
                            prefix="ws",
                            namespace="http://ws.NRPSpredictor2.roettig.org/")
    root.add_child("request", ns=True)
    print root.as_xml(pretty=True)
    arg0_node = root.children()[0]

    idx = 1
    for seq in seqs:
        seqs_node = arg0_node.add_child("sequence", ns=True)
        seqs_node.add_child("id", "%d" % idx, ns=True)
        seqs_node.add_child("kingdom", "0", ns=True)
        seqs_node.add_child("seqString", seq, ns=True)
        seqs_node.add_child("sequenceType", "0", ns=True)
        idx += 1
    print root.as_xml(pretty=True)
    return root
    def test_basic(self):
        span = SimpleXMLElement('<span><a href="python.org.ar">pyar</a><prueba><i>1</i><float>1.5</float></prueba></span>')
        span1 = SimpleXMLElement('<span><a href="google.com">google</a><a>yahoo</a><a>hotmail</a></span>')
        self.eq([str(a) for a in span1.a()], ['google', 'yahoo', 'hotmail'])

        span1.add_child('a', 'altavista')
        span1.b = "ex msn"
        d = {'href': 'http://www.bing.com/', 'alt': 'Bing'}
        span1.b[:] = d
        self.eq(sorted([(k, v) for k, v in span1.b[:]]), sorted(d.items()))

        xml = '<?xml version="1.0" encoding="UTF-8"?><span><a href="google.com">google</a><a>yahoo</a><a>hotmail</a><a>altavista</a><b alt="Bing" href="http://www.bing.com/">ex msn</b></span>'
        self.eq(span1.as_xml(), xml)
        self.assertTrue('b' in span1)

        span.import_node(span1)
        xml = '<?xml version="1.0" encoding="UTF-8"?><span><a href="python.org.ar">pyar</a><prueba><i>1</i><float>1.5</float></prueba><span><a href="google.com">google</a><a>yahoo</a><a>hotmail</a><a>altavista</a><b alt="Bing" href="http://www.bing.com/">ex msn</b></span></span>'
        self.eq(span.as_xml(), xml)

        types = {'when': datetime.datetime}
        when = datetime.datetime.now()
        dt = SimpleXMLElement('<when>%s</when>' % when.isoformat())
        self.eq(dt.unmarshall(types)['when'], when)
示例#10
0
 def call(self, method, *args, **kwargs):
     "Prepara el xml y realiza la llamada SOAP, devuelve un SimpleXMLElement"
     # Mensaje de Solicitud SOAP básico:
     xml = self.__xml % dict(method=method, namespace=self.namespace, ns=self.__ns,
                             soap_ns=self.__soap_ns, soap_uri=soap_namespaces[self.__soap_ns])
     request = SimpleXMLElement(xml,namespace=self.__ns and self.namespace, prefix=self.__ns)
     # parsear argumentos
     if kwargs:
         parameters = kwargs.items()
     else:
         parameters = args
     for k,v in parameters: # dict: tag=valor
         self.parse(getattr(request,method),k,v)
     self.xml_request = request.as_xml()
     self.xml_response = self.send(method, self.xml_request)
     response = SimpleXMLElement(self.xml_response, namespace=self.namespace)
     if self.exceptions and ("soapenv:Fault" in response or "soap:Fault" in response):
         raise SoapFault(unicode(response.faultcode), unicode(response.faultstring))
     return response
示例#11
0
def serializar(regs):
    "Dado una lista de comprobantes (diccionarios), convierte a xml"
    xml = SimpleXMLElement(XML_BASE)

    comprobantes = []
    for reg in regs:
        dic = {}
        for k, v in list(MAP_ENC.items()):
            dic[v] = reg[k]

        dic.update({
            "detalles": [{
                "detalle": mapear({}, det, MAP_DET, swap=True),
            } for det in reg["detalles"]],
            "tributos": [{
                "tributo": mapear({}, trib, MAP_TRIB, swap=True),
            } for trib in reg["tributos"]],
            "cmpasociados": [{
                "cmpasociado":
                mapear({}, iva, MAP_CBTE_ASOC, swap=True),
            } for iva in reg["cbtes_asoc"]],
            "opcionales": [{
                "opcional":
                mapear({}, iva, MAP_OPCIONAL, swap=True),
            } for iva in reg["opcionales"]],
            "ivas": [{
                "iva": mapear({}, iva, MAP_IVA, swap=True),
            } for iva in reg["ivas"]],
            "formaspago": [{
                "formapago": {
                    "codigo": "",
                    "descripcion": reg["forma_pago"],
                }
            }],
        })
        comprobantes.append(dic)

    for comprobante in comprobantes:
        xml.marshall("comprobante", comprobante)
    return xml.as_xml()
示例#12
0
class IIBB(object):
    "Interfaz para el servicio de IIBB ARBA"
    _public_methods_ = [
        "Conectar",
        "ConsultarContribuyentes",
        "LeerContribuyente",
        "LeerErrorValidacion",
        "AnalizarXml",
        "ObtenerTagXml",
    ]
    _public_attrs_ = [
        "Usuario",
        "Password",
        "XmlResponse",
        "Version",
        "Excepcion",
        "Traceback",
        "InstallDir",
        "NumeroComprobante",
        "CantidadContribuyentes",
        "CodigoHash",
        "CuitContribuyente",
        "AlicuotaPercepcion",
        "AlicuotaRetencion",
        "GrupoPercepcion",
        "GrupoRetencion",
        "TipoError",
        "CodigoError",
        "MensajeError",
    ]

    _reg_progid_ = "IIBB"
    _reg_clsid_ = "{2C7E29D2-0C99-49D8-B04B-A16B807BB123}"

    Version = "%s %s" % (__version__, H**O and "Homologación" or "")

    def __init__(self):
        self.Usuario = self.Password = None
        self.TipoError = self.CodigoError = self.MensajeError = ""
        self.InstallDir = INSTALL_DIR
        self.client = None
        self.xml = None
        self.limpiar()

    def limpiar(self):
        self.NumeroComprobante = self.CodigoHash = ""
        self.CantidadContribuyentes = 0
        self.CuitContribuyente = ""
        self.AlicuotaPercepcion = 0
        self.AlicuotaRetencion = 0
        self.GrupoPercepcion = 0
        self.GrupoRetencion = 0
        self.contribuyentes = []
        self.errores = []
        self.XmlResponse = ""
        self.Excepcion = self.Traceback = ""
        self.TipoError = self.CodigoError = self.MensajeError = ""

    def Conectar(
        self, url=None, proxy="", wrapper=None, cacert=None, trace=False, testing=""
    ):
        if H**O or not url:
            url = URL
        self.client = WebClient(location=url, trace=trace, cacert=cacert)
        self.testing = testing

    def ConsultarContribuyentes(self, fecha_desde, fecha_hasta, cuit_contribuyente):
        "Realiza la consulta remota a ARBA, estableciendo los resultados"
        self.limpiar()
        try:

            self.xml = SimpleXMLElement(XML_ENTRADA_BASE)
            self.xml.fechaDesde = fecha_desde
            self.xml.fechaHasta = fecha_hasta
            self.xml.contribuyentes.contribuyente.cuitContribuyente = cuit_contribuyente

            xml = self.xml.as_xml()
            self.CodigoHash = md5.md5(xml).hexdigest()
            nombre = "DFEServicioConsulta_%s.xml" % self.CodigoHash

            # guardo el xml en el archivo a enviar y luego lo re-abro:
            archivo = open(os.path.join(tempfile.gettempdir(), nombre), "w")
            archivo.write(xml)
            archivo.close()
            archivo = open(os.path.join(tempfile.gettempdir(), nombre), "r")

            if not self.testing:
                response = self.client(
                    user=self.Usuario, password=self.Password, file=archivo
                )
            else:
                response = open(self.testing).read()
            self.XmlResponse = response
            self.xml = SimpleXMLElement(response)
            if "tipoError" in self.xml:
                self.TipoError = str(self.xml.tipoError)
                self.CodigoError = str(self.xml.codigoError)
                self.MensajeError = (
                    str(self.xml.mensajeError)
                    .decode("latin1")
                    .encode("ascii", "replace")
                )
            if "numeroComprobante" in self.xml:
                self.NumeroComprobante = str(self.xml.numeroComprobante)
                self.CantidadContribuyentes = int(self.xml.cantidadContribuyentes)
                if "contribuyentes" in self.xml:
                    for contrib in self.xml.contribuyente:
                        c = {
                            "CuitContribuytente": str(contrib.cuitContribuyente),
                            "AlicuotaPercepcion": str(contrib.alicuotaPercepcion),
                            "AlicuotaRetencion": str(contrib.alicuotaRetencion),
                            "GrupoPercepcion": str(contrib.grupoPercepcion),
                            "GrupoRetencion": str(contrib.grupoRetencion),
                            "Errores": [],
                        }
                        self.contribuyentes.append(c)
                    # establecer valores del primer contrib (sin eliminarlo)
                    self.LeerContribuyente(pop=False)
            return True
        except Exception as e:
            ex = traceback.format_exception(
                sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]
            )
            self.Traceback = "".join(ex)
            try:
                self.Excepcion = traceback.format_exception_only(
                    sys.exc_info()[0], sys.exc_info()[1]
                )[0]
            except:
                self.Excepcion = u"<no disponible>"
            return False

    def LeerContribuyente(self, pop=True):
        "Leeo el próximo contribuyente"
        # por compatibilidad hacia atras, la primera vez no remueve de la lista
        # (llamado de ConsultarContribuyentes con pop=False)
        if self.contribuyentes:
            contrib = self.contribuyentes[0]
            if pop:
                del self.contribuyentes[0]
        else:
            contrib = {}
        self.CuitContribuyente = contrib.get("CuitContribuytente", "")
        self.AlicuotaPercepcion = contrib.get("AlicuotaPercepcion", "")
        self.AlicuotaRetencion = contrib.get("AlicuotaRetencion", "")
        self.GrupoPercepcion = contrib.get("GrupoPercepcion", "")
        self.GrupoRetencion = contrib.get("GrupoRetencion", "")
        self.errores = contrib.get("Errores", [])
        return len(contrib) > 0

    def LeerErrorValidacion(self):
        if self.errores:
            error = self.errores.pop()
            self.TipoError = ""
            self.CodigoError = error[0]
            self.MensajeError = error[1]
            return True
        else:
            self.TipoError = ""
            self.CodigoError = ""
            self.MensajeError = ""
            return False

    def AnalizarXml(self, xml=""):
        "Analiza un mensaje XML (por defecto la respuesta)"
        try:
            if not xml:
                xml = self.XmlResponse
            self.xml = SimpleXMLElement(xml)
            return True
        except Exception as e:
            self.Excepcion = u"%s" % (e)
            return False

    def ObtenerTagXml(self, *tags):
        "Busca en el Xml analizado y devuelve el tag solicitado"
        # convierto el xml a un objeto
        try:
            if self.xml:
                xml = self.xml
                # por cada tag, lo busco segun su nombre o posición
                for tag in tags:
                    xml = xml(tag)  # atajo a getitem y getattr
                # vuelvo a convertir a string el objeto xml encontrado
                return str(xml)
        except Exception as e:
            self.Excepcion = u"%s" % (e)