Example #1
0
 def _eval_context_for_combinations(self):
     """Returns a dictionary to use as evaluation context for
        ir.rule domains, when the goal is to obtain python lists
        that are easier to parse and combine, but not to
        actually execute them."""
     return {'user': unquote('user'),
             'time': unquote('time')}
Example #2
0
 def _eval_context_for_combinations(self):
     """Returns a dictionary to use as evaluation context for
        ir.rule domains, when the goal is to obtain python lists
        that are easier to parse and combine, but not to
        actually execute them."""
     return {'user': unquote('user'),
             'time': unquote('time')}
 def _read_flat(self, cr, uid, ids, fields_to_read, context=None, load='_classic_read'):
     res = super(IrActionsActWindow, self)._read_flat(cr, uid, ids, fields_to_read, context, load)
     if (not fields_to_read or 'context' in fields_to_read) and isinstance(ids, list):
         eval_dict = {'active_id': unquote("active_id"), 'active_ids': unquote("active_ids"),
                      'active_model': unquote("active_model"), 'uid': uid, 'context': context}
         for vals in res:
             try:
                 vals['context'] = eval(vals['context'], eval_dict) or {}
             except:
                 continue
             if 'window_action_id' not in context:
                 vals['context']['window_action_id'] = vals['id']
             vals['context'] = unicode(vals['context'])
     return res
Example #4
0
 def _update_context(self):
     eval_dict = {
         'active_id': unquote("active_id"),
         'active_ids': unquote("active_ids"),
         'active_model': unquote("active_model"),
         'uid': self._uid,
         'context': self._context,
     }
     try:
         context = eval(self.context or '{}', eval_dict) or {}
         if 'act_window_id' not in context:
             context['act_window_id'] = self.id
             self.context = '%s' % context
     except:
         pass
Example #5
0
    def get_actions(self, cr, uid, action_slot, model, res_id=False, context=None):
        """Retrieves the list of actions bound to the given model's action slot.
           See the class description for more details about the various action
           slots: :class:`~.ir_values`.

           :param string action_slot: the action slot to which the actions should be
                                      bound to - one of ``client_action_multi``,
                                      ``client_print_multi``, ``client_action_relate``,
                                      ``tree_but_open``.
           :param string model: model name
           :param int res_id: optional record id - will bind the action only to a
                              specific record of the model, not all records.
           :return: list of action tuples of the form ``(id, name, action_def)``,
                    where ``id`` is the ID of the default entry, ``name`` is the
                    action label, and ``action_def`` is a dict containing the
                    action definition as obtained by calling
                    :meth:`~openerp.osv.osv.osv.read` on the action record.
        """
        assert action_slot in ACTION_SLOTS, 'Illegal action slot value: %s' % action_slot
        # use a direct SQL query for performance reasons,
        # this is called very often
        # Add by Smile #
        context = context or {}
        query = """SELECT v.id, v.name, v.value FROM ir_values v
                   WHERE v.key = %s AND v.key2 = %s
                        AND v.model = %s
                        AND (v.res_id = %s
                             OR v.res_id IS NULL
                             OR v.res_id = 0)
                         AND (v.window_actions IS NULL
                              OR v.window_actions=', , '
                              OR v.window_actions like %s)
                    ORDER BY v.sequence, v.id"""
        cr.execute(query, ('action', action_slot, model, res_id or None, ', %s, ' % context.get('window_action_id', '')))
        ################
        results = {}
        for action in cr.dictfetchall():
            if not action['value']:
                continue    # skip if undefined
            action_model, id = action['value'].split(',')
            fields = [field for field in self.pool.get(action_model)._all_columns
                      if field not in EXCLUDED_FIELDS]
            # FIXME: needs cleanup
            try:
                action_def = self.pool.get(action_model).read(cr, uid, int(id), fields, context)
                if action_def:
                    if action_model in ('ir.actions.report.xml', 'ir.actions.act_window',
                                        'ir.actions.wizard'):
                        groups = action_def.get('groups_id')
                        if groups:
                            cr.execute('SELECT 1 FROM res_groups_users_rel WHERE gid IN %s AND uid=%s',
                                       (tuple(groups), uid))
                            if not cr.fetchone():
                                if action['name'] == 'Menuitem':
                                    raise orm.except_orm('Error !',
                                                         'You do not have the permission to perform this operation !!!')
                                continue
                # keep only the first action registered for each action name
                # Add by Smile #
                if action_slot == 'tree_but_open' and action_def['type'] == 'ir.actions.act_window':
                    try:
                        action_context = eval(action_def['context'], {'active_id': unquote("active_id"), 'uid': uid})
                        action_context['window_action_id'] = action_def['id']
                        action_def['context'] = unicode(action_context)
                    except Exception as e:
                        logging.getLogger('smile.base').warning('Error in eval: %s - %s' % (action_def['context'], repr(e)))
                ################
                results[action['name']] = (action['id'], action['name'], action_def)
            except orm.except_orm:
                continue
        return sorted(results.values())
Example #6
0
    def get_actions(self,
                    cr,
                    uid,
                    action_slot,
                    model,
                    res_id=False,
                    context=None):
        """Retrieves the list of actions bound to the given model's action slot.
           See the class description for more details about the various action
           slots: :class:`~.ir_values`.

           :param string action_slot: the action slot to which the actions should be
                                      bound to - one of ``client_action_multi``,
                                      ``client_print_multi``, ``client_action_relate``,
                                      ``tree_but_open``.
           :param string model: model name
           :param int res_id: optional record id - will bind the action only to a
                              specific record of the model, not all records.
           :return: list of action tuples of the form ``(id, name, action_def)``,
                    where ``id`` is the ID of the default entry, ``name`` is the
                    action label, and ``action_def`` is a dict containing the
                    action definition as obtained by calling
                    :meth:`~openerp.osv.osv.osv.read` on the action record.
        """
        assert action_slot in ACTION_SLOTS, 'Illegal action slot value: %s' % action_slot
        # use a direct SQL query for performance reasons,
        # this is called very often
        # Add by Smile #
        context = context or {}
        query = """SELECT v.id, v.name, v.value FROM ir_values v
                   WHERE v.key = %s AND v.key2 = %s
                        AND v.model = %s
                        AND (v.res_id = %s
                             OR v.res_id IS NULL
                             OR v.res_id = 0)
                         AND (v.window_actions IS NULL
                              OR v.window_actions=', , '
                              OR v.window_actions like %s)
                    ORDER BY v.sequence, v.id"""
        cr.execute(query,
                   ('action', action_slot, model, res_id
                    or None, ', %s, ' % context.get('window_action_id', '')))
        ################
        results = {}
        for action in cr.dictfetchall():
            if not action['value']:
                continue  # skip if undefined
            action_model, id = action['value'].split(',')
            fields = [
                field for field in self.pool.get(action_model)._all_columns
                if field not in EXCLUDED_FIELDS
            ]
            # FIXME: needs cleanup
            try:
                action_def = self.pool.get(action_model).read(
                    cr, uid, int(id), fields, context)
                if action_def:
                    if action_model in ('ir.actions.report.xml',
                                        'ir.actions.act_window',
                                        'ir.actions.wizard'):
                        groups = action_def.get('groups_id')
                        if groups:
                            cr.execute(
                                'SELECT 1 FROM res_groups_users_rel WHERE gid IN %s AND uid=%s',
                                (tuple(groups), uid))
                            if not cr.fetchone():
                                if action['name'] == 'Menuitem':
                                    raise orm.except_orm(
                                        'Error !',
                                        'You do not have the permission to perform this operation !!!'
                                    )
                                continue
                # keep only the first action registered for each action name
                # Add by Smile #
                if action_slot == 'tree_but_open' and action_def[
                        'type'] == 'ir.actions.act_window':
                    try:
                        action_context = eval(action_def['context'], {
                            'active_id': unquote("active_id"),
                            'uid': uid
                        })
                        action_context['window_action_id'] = action_def['id']
                        action_def['context'] = unicode(action_context)
                    except Exception as e:
                        logging.getLogger('smile.base').warning(
                            'Error in eval: %s - %s' %
                            (action_def['context'], repr(e)))
                ################
                results[action['name']] = (action['id'], action['name'],
                                           action_def)
            except orm.except_orm:
                continue
        return sorted(results.values())