Re: [bofhers] Sobre Odoo, DNI, Codigos postales

  • From: Reset Reboot <reset.reboot@xxxxxxxxx>
  • To: bofhers@xxxxxxxxxxxxx
  • Date: Wed, 14 Dec 2016 12:05:11 +0100

Chicos, segundo aviso de offtopic. Si podéis hacer el favor de seguir esta 
conversación en privado o en otro foro público, se agradecería. 

El 14 de diciembre de 2016 12:02:46 CET, marco garcia baturan 
<marcogb81@xxxxxxxxxxx> escribió:

He procedido a probar loq ue me indicas y sigue erre que erre:

   intnumero = numero[:7]
TypeError: 'bool' object has no attribute '__getitem__'

Incluso he tenido en cuentala posición del array:

50322420

01234567

Aunque es más correcto

numero[:8] para que abarque los
digitos



________________________________
De: bofhers-bounce@xxxxxxxxxxxxx <bofhers-bounce@xxxxxxxxxxxxx> en
nombre de Daniel Garcia <dani.garcia@xxxxxxxxx>
Enviado: miércoles, 14 de diciembre de 2016 11:56
Para: bofhers@xxxxxxxxxxxxx
Asunto: Re: [bofhers] Sobre Odoo, DNI, Codigos postales

Bufff, bueno, este es otro error. Pero sigue siendo un error de tipo.

prueba a cambiar

intnumero = numero[:8]

por

intnumero = int(numero[0:7])

2016-12-14 11:46 GMT+01:00 marco garcia baturan
<marcogb8@xxxxxxxxx<mailto:marcogb8@xxxxxxxxx>>:
Mira, he desarrollado una cosa tal que así:

# función que opera con el ingreso de dni y le agrega la letra
automaticamente
@api.onchange('Nif') # decorador
def letraDNI(self): #funcion
   numero = self.Nif # cogemos el imput del campo
   intnumero = numero[:8] # extraemos solo los numeros
diccionario = {0: "T", 1: "R", 2: "W", 3: "A", 4: "G", 5: "M", 6: "Y",
7: "F", 8: "P", 9: "D", 10: "X",11: "B", 12: "N", 13: "J", 14: "Z", 15:
"S", 16: "Q", 17: "V", 18: "H", 19: "L",20: "C", 21: "K", 22: "E"}
 resto = intnumero % 23 # sacamos el resto para operar con diccionario
   letra = diccionario.get(resto) #obtenemos letra
self.Nif = numero+letra # agrego numero y letra al mismo campo sobre
escribiendo

Pero me da este error:

File "/opt/odoo/odoo-server/addons/admision/models.py", line 56, in
letraDNI
   intnumero = numero[:8]
TypeError: 'bool' object has no attribute '__getitem__'


Por que el formato es  99999999-Z



El 14 de diciembre de 2016, 11:00, Daniel Garcia
<dani.garcia@xxxxxxxxx<mailto:dani.garcia@xxxxxxxxx>> escribió:
Mas o menos, lo que diccionario.get(resto) hace es devolverte la letra
correspondiente, o sea que al final en self.Nif tendras una letra. Te
falta concatenar esa letra al resto.

Lo que yo haria es usar una variable intermedia para componer todo el
campo de nif en el formulario, por un lado el numero que ha metido el
usuario y por otro la letra que obtienes con esa funcion.

2016-12-14 10:39 GMT+01:00 marco garcia baturan
<marcogb8@xxxxxxxxx<mailto:marcogb8@xxxxxxxxx>>:
Entiendo,
Así que en vez de;
self.Nif = diccionario.get(str(resto))
es mejor:
self.Nif = diccionario.get(resto)

Ya que debe agregarle la letra final.


El 14 de diciembre de 2016, 10:16, Daniel Garcia
<dani.garcia@xxxxxxxxx<mailto:dani.garcia@xxxxxxxxx>> escribió:
Correcto, pero la funcion get del diccionario lo unico que hace es
buscar una clave en el diccionario y devolverte su campo asociado, lo
que pasa es que tu le estas pasando a esa funcion un tipo de datos
string, y las claves que has definido en el diccionario son de tipo
numerico, por eso al hacer la comparacion te falla, porque no puede
comparar un string con un int.

Prueba a quitar la conversion a string de la funcion get. Es decir.

diccionario.get(str(resto)) y cambialo a diccionario.get(resto)

2016-12-14 10:03 GMT+01:00 marco garcia baturan
<marcogb81@xxxxxxxxxxx<mailto:marcogb81@xxxxxxxxxxx>>:

Hola,

Entiendo a que te refieres. Me explico; este 'onchange' hace la función
de completar el código DNI al terminar por uno añadiendo el simbolo
final que es una letra. Entonces desarrolle una función que opera con
los números que se introducen, los coje, opera con ellos y luego con el
'resto' seleccionamos el valor que corresponda en el diccionario. Que
para tal caso es la letra y la guarda de nuevo en el campo al final del
mismo.

Si yo meto 50322420 en el  campo DNI, al dar a 'enter' o tabulador
entonces debe de agregar la letra que corresponda al final, siendo el
resultado:50322420-F.

Por ejemplo.

Y el diccionario precisa que la clave sea un número y el valor una
letra para que pueda operar correctamente.


________________________________
De: bofhers-bounce@xxxxxxxxxxxxx<mailto:bofhers-bounce@xxxxxxxxxxxxx>
<bofhers-bounce@xxxxxxxxxxxxx<mailto:bofhers-bounce@xxxxxxxxxxxxx>> en
nombre de Daniel Garcia
<dani.garcia@xxxxxxxxx<mailto:dani.garcia@xxxxxxxxx>>
Enviado: miércoles, 14 de diciembre de 2016 9:47

Para: bofhers@xxxxxxxxxxxxx<mailto:bofhers@xxxxxxxxxxxxx>
Asunto: Re: [bofhers] Sobre Odoo, DNI, Codigos postales

No, me referia a la parte del codigo donde conviertes el resto de un
int a un string.

self.Nif = diccionario.get(str(resto))

Cuando has definido el diccionario, los numeros son enteros, ya que no
van entrecomillados.

diccionario = {0: "T"}

Aqui el 0 es un int y la T es de tipo string, o char... da lo mismo

Si al definir el diccionario pones las dos partes como string,
{"0":"T"} entonces tiene sentido que conviertas el resto a string, pero
si comparas el string resto con el int del diccionario pues casca.

2016-12-14 9:13 GMT+01:00 marco garcia baturan
<marcogb81@xxxxxxxxxxx<mailto:marcogb81@xxxxxxxxxxx>>:

Hola Dani

Si por transformación te refieres a la función que lo traduce a unicode
o utf-8 ya lo probe ayer y es algo extraño pues el campo es CHar y no
deberia dar mucha guerra. SImplemente que dice que el Int() no es
valido para la cadena '50322456-  ', es algo muy raro. SIgo
investigando y cuando lo encuentre subo la explicación para commpartir
la solucion.


Un saludo,

M


________________________________
De: bofhers-bounce@xxxxxxxxxxxxx<mailto:bofhers-bounce@xxxxxxxxxxxxx>
<bofhers-bounce@xxxxxxxxxxxxx<mailto:bofhers-bounce@xxxxxxxxxxxxx>> en
nombre de Daniel Garcia
<dani.garcia@xxxxxxxxx<mailto:dani.garcia@xxxxxxxxx>>
Enviado: martes, 13 de diciembre de 2016 16:01

Para: bofhers@xxxxxxxxxxxxx<mailto:bofhers@xxxxxxxxxxxxx>
Asunto: Re: [bofhers] Sobre Odoo, DNI, Codigos postales

Hola Marco,

sin querer abundar en el offtopic, creo que tu problema es que cuando
defines el diccionario los numeros no son strings, por lo que al
ejecutar el get intenta buscar por string. ¿Has probado a quitar la
funcion de trasnformacion?.

Igual ya lo has probado y yo estoy metiendo la gamba.

Salud.

2016-12-13 15:43 GMT+01:00 marco garcia baturan
<marcogb81@xxxxxxxxxxx<mailto:marcogb81@xxxxxxxxxxx>>:

Gracias Ramón por la sugerencia.

Y reitero; disculpad las molestias.

________________________________
De: bofhers-bounce@xxxxxxxxxxxxx<mailto:bofhers-bounce@xxxxxxxxxxxxx>
<bofhers-bounce@xxxxxxxxxxxxx<mailto:bofhers-bounce@xxxxxxxxxxxxx>> en
nombre de Ramon Kamibayashi
<ramonkawa@xxxxxxxxx<mailto:ramonkawa@xxxxxxxxx>>
Enviado: martes, 13 de diciembre de 2016 14:47:36
Para: bofhers@xxxxxxxxxxxxx<mailto:bofhers@xxxxxxxxxxxxx>
Asunto: Re: [bofhers] Sobre Odoo, DNI, Codigos postales

Los problemas de encoding siempre dan muchos dolores de cabeza.

Me tiene pasado que aunque tenga todos los elementos en el mismo
formato, algo casca. En general la solución es convertir los strings de
nuevo a UTF-8 aunque en teoría ya estén en ese formato.  Al final,
pegarse con prueba y error. Acabarán apareciendo las Ñ.




El 13 de diciembre de 2016, 14:10, marco garcia baturan
<marcogb81@xxxxxxxxxxx<mailto:marcogb81@xxxxxxxxxxx>> escribió:

BUenas tardes Bofherianos y Bofherianas de Bofheria:

Como ya algunos sabies ( por lo pesado que soy) que estoy programando
en python un módulo en Odoo (OpenERP 8). Hasta ahí todo normal. Total,
que estoy creando un módulo de admisión de pacientes en Odoo 8 bajo
Ubuntu 14.04 que en este caso tiene un subconjunto de campos que se
divide en dos partes:

DNI

y

Provincia y CP

He creado una función que lee la parte numerica del DNI para devolver
la letra e introducirla al final para hacer un mecanismo de
autocompletado. Pero falla por error de tipo:

File "/opt/odoo/odoo-server/addons/admision/models.py", line 62, in
letraDNI
11: "B", 12: "N", 13: "J", 14: "Z", 15: "S", 16: "Q", 17: "V", 18: "H",
19: "L",
TypeError: unsupported operand type(s) for +: 'bool' and 'str'

El codigo es:

# función que opera con el ingreso de dni y le agrega la letra
automaticamente
@api.onchange("Nif")
def letraDNI(self):
   numero = self.Nif
   if len(numero) == 10 and [0-9/-a-z]:
       pass
   else:
       if len(numero) == 8 and [0-9/-' ']:

       intnumero = int(numero[0:7])
diccionario = {0: "T", 1: "R", 2: "W", 3: "A", 4: "G", 5: "M", 6: "Y",
7: "F", 8: "P", 9: "D", 10: "X",

11: "B", 12: "N", 13: "J", 14: "Z", 15: "S", 16: "Q", 17: "V", 18: "H",
19: "L",

                      20: "C", 21: "K", 22: "E"}
       resto = intnumero % 23
   self.Nif = diccionario.get(str(resto))

Y la parte XML es:

<field name="Nif" data-inputmask="'mask': '99999999-a'" />

Y el caso del codigo postal es peculiar por que en si funciona y muy
bien pero al introducir porvincias con tildes o ñ esta me devuelve
vacio. El esscript esta en UTF-8 y el XML en UTF-8, incluso prove con
las iso-809-...etc y nada.

Aqui el script:

# busca código postal.
@api.onchange("Provincia_Paciente","CP_Paciente")
def buscaCP(self):
   provincia = self.Provincia_Paciente
   # buscar = provincia
   # declaro un diccionario con provincias
Diccionario = {"Alava": '01', "Albacete": '02', "Alicante": '03',
"Almería": '04', "Ávila": '05', "Badajoz": '06',
"Islas Baleares": '07', "Barcelona": '08', "Burgos": '09', "Cáceres":
10, "Cádiz": 11,
"Castellón": 12, "Ciudad Real": 13, "Córdoba": 14, "La Coruña": 15,
"Cuenca": 16,
"Gerona": 17, "Granada": 18, "Guadalajara": 19, "Guipúzcoa": 20,
"Huelva": 21, "Huesca": 21,
"Jaén": 23, "León": 24, "Lérida": 25, "La Rioja": 26, "Lugo": 27,
"Madrid": 28, "Malaga": 29,
"Murcia": 30, "Navarra": 31, "Orense": 32, "Asturias": 33, "Palencia":
34, "Las Palmas": 35,
"Pontevedra": 36, "Salamanca": 37, "Santa Cruz de Tenerife": 38,
"Cantabria": 39,
"Segovia": 40, "Sevilla": 41, "Soria": 42, "Tarragona": 43, "Teruel":
44, "Toledo": 45,                           "Valencia": 46,
"Valladolid": 47, "Vizcaya": 48, "Zamora": 49, "Zaragoza": 50, "Ceuta":
51,
                  "Melilla": 52, }
CodPos = Diccionario.get(provincia) # imprimo el codigo postal en base
a la provincia introducida
   self.CP_Paciente = CodPos

aqui el XML:

<field name="Provincia_Paciente" placeholder = "Alicante" />
<field name="CP_Paciente" data-inputmask="'mask': '99999'" />

Un saludito campeones y gracias por vuestra atención.

MGB




--
Daniel Garcia Ruiz
dani(punto)garcia(arroba)gmail(punto)com



--
Daniel Garcia Ruiz
dani(punto)garcia(arroba)gmail(punto)com



--
Daniel Garcia Ruiz
dani(punto)garcia(arroba)gmail(punto)com




--
Daniel Garcia Ruiz
dani(punto)garcia(arroba)gmail(punto)com




--
Daniel Garcia Ruiz
dani(punto)garcia(arroba)gmail(punto)com

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.

Other related posts: