Comment 58 for bug 1073087

Revision history for this message
Carlos Pueyo (cpueyo) wrote :

Hello.

I only found one solution for me, i delete all rules in development environment, and i try to create new rules with work fine.
I make a little add in openerp/addons/base/ir/ir_rule.py for see what domain is applied.

Method _compute_domain: Line No. 108

    def _compute_domain(self, cr, uid, model_name, mode="read"):
        # ALCA
        # print model_name
        # if model_name == 'hr.holidays' or model_name == 'sale.config.settings':
            # pdb.set_trace()
        # END ALCA

        if mode not in self._MODES:
            raise ValueError('Invalid mode: %r' % (mode,))

        if uid == SUPERUSER_ID:
            return None
        cr.execute("""SELECT r.id
                FROM ir_rule r
                JOIN ir_model m ON (r.model_id = m.id)
                WHERE m.model = %s
                AND r.active is True
                AND r.perm_""" + mode + """
                AND (r.id IN (SELECT rule_group_id FROM rule_group_rel g_rel
                            JOIN res_groups_users_rel u_rel ON (g_rel.group_id = u_rel.gid)
                            WHERE u_rel.uid = %s) OR r.global)""", (model_name, uid))
        rule_ids = [x[0] for x in cr.fetchall()]
        if rule_ids:
            # browse user as super-admin root to avoid access errors!
            user = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid)
            global_domains = [] # list of domains
            group_domains = {} # map: group -> list of domains
            for rule in self.browse(cr, SUPERUSER_ID, rule_ids):
                # read 'domain' as UID to have the correct eval context for the rule.
                rule_domain = self.read(cr, uid, rule.id, ['domain'])['domain']

                # ALCA
                rule_name = self.read(cr, uid, rule.id, ['name'])['name']
                rule_domain_force = self.read(cr, uid, rule.id, ['domain_force'])['domain_force']
                print "Regla ID: "+str(rule.id)+" - Nombre: "+str(rule_name)
                print "Dominio: "+str(rule_domain)+" - Dominio Forzado: "+str(rule_domain_force)
                print "."
                # END ALCA

                dom = expression.normalize_domain(rule_domain)
                for group in rule.groups:
                    if group in user.groups_id:
                        group_domains.setdefault(group, []).append(dom)
                if not rule.groups:
                    global_domains.append(dom)
            # combine global domains and group domains
            if group_domains:
                group_domain = expression.OR(map(expression.OR, group_domains.values()))
            else:
                group_domain = []
            domain = expression.AND(global_domains + [group_domain])
            return domain
        return []