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)
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()
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()
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
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 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)
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
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()
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)