[pyar] Problema <type 'exceptions.SyntaxError'> No fields to update en Heroku con Web2py y facebook login

Leonardo M. Rocha leo.m.rocha en gmail.com
Vie Mar 8 09:52:50 ART 2013


Pseudosolucion al problema, Diganme si no meti la pata mallll!!!!


Cuento que fui haciendo hasta que se me ocurrio:

2013/3/8 Leonardo M. Rocha <leo.m.rocha en gmail.com>:
> Hola,
>
> Estoy jugando con una APP en facebook, con Web2py y en heroku.
> Todo marcha bien en general, excepto, que de vez en cuando despues de
> un reinicio del server (sea porque heroku lo quiere o porque hago un
> push, o sea en el server local con foreman start) cuando hago el
> login, me salta:
>  <type 'exceptions.SyntaxError'> No fields to update

En realidad no pasa cuando se reinicia el server, sino que pasa en la
segunda vez que un usuario se loguea. Lo que por un lado es mejor
(porque al menos es repetible) pero por otro lado apesta (porque no
anda)

Por lo que veo que pasa es que al loguearse por segunda vez un usuario
no entiendo por que se llama a dal.py

RecordUpdater.__call__(**fields)

donde fields: {registration_id: u11111111111111}

y despues, como registration_id not in table.fields [id, first_name,
last_name, username, password, registration_key]
(es la tabla de auth_user definida en el ejemplo facebook)
borra el unico campo en la lineas

if not fieldname in table.fields or table[fieldname].type=='id':
                del newfields[fieldname]

pasando una llamada vacia al update y por lo tanto lanzando el error.

Ahora bien, segun lo que veo, registration_id deberia estar como
username en vez para que siga la tabla:

auth_table = db.define_table(
    auth.settings.table_user_name,
    Field('first_name', length=128, default=""),
    Field('last_name', length=128, default=""),
    Field('username', length=128, default="", unique=True),
    #Field('registration_id', length=128, default="", unique=True),
    Field('password', 'password', length=256,
          readable=False, label='Password'),
    Field('registration_key', length=128, default= "",
          writable=False, readable=False))

probe con: Field('registration_id', length=128, default="",
unique=True), en vez del campo username, pero auth se queja que no hay
un campo email en vez (ya es demasiado loco el tema) Supongo que esto
es porque registration_id es un keyword en tools.py, en la funcion
get_or_create_user(self, keys, update_fields=['email'])


Descubri que la llamada a:
RecordUpdater.__call__(**fields) se genera solo cuando el usuario ya
esta el campo en el username de la DB (solo para usuarios ya
registrados!) lo que quiere decir que si se fijo que el campo existe y
la pregunta es otra vez: Por que lo quiere actualizar??!! Y en ese
caso, porque no pasa el campo con el nombre correcto??

me puse  a ver cada parte del trace, y a probar varias opciones, pero
esta vez, tocando el codigo de
gluon/tools.py
y
gluon/dal.py

asi que juntando coraje, y buscando un poco, se me ocurrio que SI,
deberia poder poner registration_id en los campos y asi evitar que sea
borrado del update, pero por que se queja que falta un email??
la respuesta la encontre en gluon/tools.py  en la funcion login (alla
por la linea 1930 aprox),
La cuestion es que: Facebook me devuelve un registration_id en algun
lado (o no entiendo como aparece ese valor en el medio de la nada)

        if self.settings.login_userfield:
            username = self.settings.login_userfield
        elif 'username' in table_user.fields:
            username = 'username'
        else:
            username = 'email'
        if 'username' in table_user.fields or \
                not self.settings.login_email_validate:
            tmpvalidator = IS_NOT_EMPTY(error_message=self.messages.is_empty)

y es por eso, quiere o bien username o email en la tabla auth_user

entonces le agregue:
        if self.settings.login_userfield:
            username = self.settings.login_userfield
        elif 'username' in table_user.fields:
            username = 'username'
        elif 'registration_id' in table_user.fields:
            username = 'registration_id'
        else:
            username = 'email'
        if 'username' in table_user.fields or 'registration_id' in
table_user.fields or \
                not self.settings.login_email_validate:
            tmpvalidator = IS_NOT_EMPTY(error_message=self.messages.is_empty)



Bueno, hasta aca parece todo que va a andar, pero quiero ver si no
meti la pata MAL modificando el sistema de autenticacion en tools.py,
asi que sigo buscando un poco.

Igual, tengo la mala impresion que lo que hice NO deberia hacerse!!!
(algo en la funcion get_or_create_user(self, keys,
update_fields=['email']) de tools.py )

Sugestiones??



Exitos

Leo



More information about the pyar mailing list