[v8] Leer en javascripts si un usuario pertenece a un grupo dado

183 views
Skip to first unread message

Alejandro Santana

unread,
Apr 20, 2015, 6:02:25 AM4/20/15
to openerp-s...@googlegroups.com
Hola.

Para un par de módulos para Odoo v8 me encuentro en la necesidad de saber en un archivo javascript si el usuario actual pertenece a un grupo específico.

Esto lo estoy intentando con lo siguiente:
var Users = new openerp.web.Model('res.users');
var allowed = Users.call('has_group', ['my_module.my_group']);

Pero no soy capaz de que la variable 'allowed' tome un valor booleano, siempre coge valor 'object'.
¿Alguna idea de como resolver esto?

cubells

unread,
Apr 20, 2015, 6:08:18 AM4/20/15
to openerp-s...@googlegroups.com
El 20/04/15 a les 12:02, Alejandro Santana ha escrit:
Esa función has_group devuelve una lista de todos los grupos del
usuario, por eso recibes un object. Por ahí van los tiros, no?

--
Atentament, cubells.
--

Alejandro Santana

unread,
Apr 20, 2015, 8:53:08 AM4/20/15
to openerp-s...@googlegroups.com
Pues has_group debería devolver un booleano.

La función es esta:
@tools.ormcache(skiparg=2)
    def has_group(self, cr, uid, group_ext_id):
        """Checks whether user belongs to given group.
        :param str group_ext_id: external ID (XML ID) of the group.
           Must be provided in fully-qualified form (``module.ext_id``), as there
           is no implicit module to use..
        :return: True if the current user is a member of the group with the
           given external ID (XML ID), else False.
        """
        assert group_ext_id and '.' in group_ext_id, "External ID must be fully qualified"
        module, ext_id = group_ext_id.split('.')
        cr.execute("""SELECT 1 FROM res_groups_users_rel WHERE uid=%s AND gid IN
                        (SELECT res_id FROM ir_model_data WHERE module=%s AND name=%s)""",
                   (uid, module, ext_id))
        return bool(cr.fetchone())

Creo que me estoy liando con el ámbito de las variables y con el .done, .fail, .then y .self en javascript. O la asincronicidad de js.
Sigo en ello.

cubells

unread,
Apr 20, 2015, 9:48:47 AM4/20/15
to openerp-s...@googlegroups.com
El 20/04/15 a les 14:53, Alejandro Santana ha escrit:
> Pues /has_group/ debería devolver un booleano.
>
> La función es esta:
>
> @tools.ormcache(skiparg=2)
> def has_group(self, cr, uid, group_ext_id):
> """Checks whether user belongs to given group.
> :param str group_ext_id: external ID (XML ID) of the group.
> Must be provided in fully-qualified form
> (``module.ext_id``), as there
> is no implicit module to use..
> :return: True if the current user is a member of the group
> with the
> given external ID (XML ID), else False.
> """
> assert group_ext_id and '.' in group_ext_id, "External ID
> must be fully qualified"
> module, ext_id = group_ext_id.split('.')
> cr.execute("""SELECT 1 FROM res_groups_users_rel WHERE
> uid=%s AND gid IN
> (SELECT res_id FROM ir_model_data WHERE
> module=%s AND name=%s)""",
> (uid, module, ext_id))
> return bool(cr.fetchone())
>


Pues tienes razón. No sé por qué creía que sí.
>
> Creo que me estoy liando con el ámbito de las variables y con el .done,
> .fail, .then y .self en javascript. O la asincronicidad de js.
> Sigo en ello.
>

Mi respuesta sigue siendo la misma: yo creo que te llega un objeto
porque te llega un array no el booleano que esperas.


--
Atentament, cubells.
--

Alejandro Santana

unread,
Apr 20, 2015, 2:37:37 PM4/20/15
to openerp-s...@googlegroups.com
Cubells, ya consigo obtener correctamente el valor booleano.
Para ello recojo el valor de has_group en una variable de una función dentro de .then, .done o .fail, así:

            Users.call('has_group', ['import_csv_restrict.group_import_csv_allow'])
            .then(function(result) {
                import_enabled = result;
                instance.web.ListView.prototype.defaults.import_enabled = import_enabled;
                console.log('>> result = ' + result);
                console.log('>> import_enabled = ' + import_enabled);
                console.log('>> instance.web.ListView.prototype.defaults.import_enabled = ' + instance.web.ListView.prototype.defaults.import_enabled);
            });

Pero:
- parece que esto se llama 2 veces cada vez que cargo una vista lista,
- y tengo un problema enorme con el orden en que se ejecutan las cosas: parece que lo que hay dentro de Users.call siempre se ejecuta después del resto de código (o lo hace incontrolablemente asíncrono), con lo que hace inútil cualquier comparación que haga en base a eso después.

Y si intento meter todo dentro del Users.call, las llamadas a this.$buttons me dan problemas dentro del .then/.done, no es capaz de encontrarlos.

Por ahora tengo esto:

openerp.import_csv_restrict = function(instance) {
    var QWeb = instance.web.qweb;
    var _t = instance.web._t;
    var _lt = instance.web._lt;
    var allow_import_ = false;

    instance.web.ListView.prototype.defaults.import_enabled = true;
    import_csv_restricted = instance.web.ListView.include({
        load_list: function () {
            console.log('- - - - - - - - - - -');
            var self = this;
            var add_button = false;
            var remove_button = false;
            var import_enabled = false;

            var Users = new openerp.web.Model('res.users');
            
            Users.call('has_group', ['import_csv_restrict.group_import_csv_allow'])
            .then(function(result) {
                import_enabled = result;
                instance.web.ListView.prototype.defaults.import_enabled = import_enabled;
            });

            this._super.apply(this, arguments);
            if (!this.$buttons) {
                add_button = import_enabled;
            } else {
                remove_button = !import_enabled;
            }
            
            if(add_button) {
                this.$buttons.on('click', '.oe_list_button_import', function() {
                    self.do_action({
                        type: 'ir.actions.client',
                        tag: 'import',
                        params: {
                            model: self.dataset.model,
                            // self.dataset.get_context() could be a compound?
                            // not sure. action's context should be evaluated
                            // so safer bet. Odd that timezone & al in it
                            // though
                            context: self.getParent().action.context,
                        }
                    }, {
                        on_reverse_breadcrumb: function () {
                            self.reload();
                        },
                    });
                    return false;
                });
            } else if (remove_button) {
                $('a.oe_list_button_import').remove();
                $('span.oe_fade').remove();
            }
        },
    });
};

Pedro Manuel Baeza Romero

unread,
Apr 20, 2015, 5:24:14 PM4/20/15
to openerp-s...@googlegroups.com

--
Has recibido este mensaje porque estás suscrito al grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Alejandro Santana

unread,
Apr 21, 2015, 8:44:52 AM4/21/15
to openerp-s...@googlegroups.com
Bueno, leo tarde tu email, Pedro. Ya está resuelto.
En cuanto pueda limpio el módulo y lo propongo a OCA.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-users+unsub...@googlegroups.com.

Alejandro Santana

unread,
Apr 21, 2015, 10:52:05 PM4/21/15
to openerp-s...@googlegroups.com
He hecho un PR al proyecto server-tools de OCA con la solución: https://github.com/OCA/server-tools/pull/154
Era un problema de ámbito de variables y lidiar con la asincronicida de javascript.

Aún así, supongo que por desconocimiento de javascript, hay un parpadeo cuando el usuario no tiene permiso, ya que la primera vez que se carga una lista se genera el botón y luego se elimina.
Por ahora no sé cómo solucionarlo, pero es un defecto leve que no impide la funcionalidad buscada.
Reply all
Reply to author
Forward
0 new messages