~unifield-team/unifield-wm/us-826

« back to all changes in this revision

Viewing changes to analytic_distribution/destination_tools.py

  • Committer: Olivier DOSSMANN
  • Date: 2013-05-31 14:22:09 UTC
  • mto: This revision was merged to the branch mainline in revision 1687.
  • Revision ID: od@tempo-consulting.fr-20130531142209-sbcwvzuema11guzz
UF-1991 [FIX] Problem with wizard on "msg" field. Change it to "name".

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
 
 
3
from osv import fields, osv
 
4
import warnings
 
5
import pooler
 
6
 
 
7
class many2many_sorted(fields.many2many):
 
8
    def __init__(self, obj, rel, id1, id2, string='unknown', limit=None, **args):
 
9
        super(many2many_sorted, self).__init__(obj, rel, id1, id2, string, limit, **args)
 
10
 
 
11
    def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
 
12
        if not context:
 
13
            context = {}
 
14
        if not values:
 
15
            values = {}
 
16
        res = {}
 
17
        if not ids:
 
18
            return res
 
19
        for id in ids:
 
20
            res[id] = []
 
21
        if offset:
 
22
            warnings.warn("Specifying offset at a many2many.get() may produce unpredictable results.",
 
23
                      DeprecationWarning, stacklevel=2)
 
24
        obj = obj.pool.get(self._obj)
 
25
 
 
26
        # static domains are lists, and are evaluated both here and on client-side, while string
 
27
        # domains supposed by dynamic and evaluated on client-side only (thus ignored here)
 
28
        # FIXME: make this distinction explicit in API!
 
29
        domain = isinstance(self._domain, list) and self._domain or []
 
30
 
 
31
        wquery = obj._where_calc(cr, user, domain, context=context)
 
32
        obj._apply_ir_rules(cr, user, wquery, 'read', context=context)
 
33
        from_c, where_c, where_params = wquery.get_sql()
 
34
        if where_c:
 
35
            where_c = ' AND ' + where_c
 
36
 
 
37
        order_by = ''
 
38
        if obj._order:
 
39
            order_by = ' ORDER BY '
 
40
            order_tab = []
 
41
            for order in obj._order.split(','):
 
42
                order_tab.append('%s.%s' %(from_c, order.strip()))
 
43
            order_by += ','.join(order_tab)
 
44
 
 
45
        limit_str = ''
 
46
        if self._limit is not None:
 
47
            limit_str = ' LIMIT %d' % self._limit
 
48
 
 
49
        query = 'SELECT %(rel)s.%(id2)s, %(rel)s.%(id1)s \
 
50
                   FROM %(rel)s, %(from_c)s \
 
51
                  WHERE %(rel)s.%(id1)s IN %%s \
 
52
                    AND %(rel)s.%(id2)s = %(tbl)s.id \
 
53
                 %(where_c)s  \
 
54
                 %(order_by)s \
 
55
                 %(limit)s \
 
56
                 OFFSET %(offset)d' \
 
57
            % {'rel': self._rel,
 
58
               'from_c': from_c,
 
59
               'tbl': obj._table,
 
60
               'id1': self._id1,
 
61
               'id2': self._id2,
 
62
               'where_c': where_c,
 
63
               'limit': limit_str,
 
64
               'order_by': order_by,
 
65
               'offset': offset,
 
66
              }
 
67
        cr.execute(query, [tuple(ids),] + where_params)
 
68
        for r in cr.fetchall():
 
69
            res[r[1]].append(r[0])
 
70
        return res
 
71
 
 
72
 
 
73
class many2many_notlazy(many2many_sorted):
 
74
    def __init__(self, obj, rel, id1, id2, string='unknown', limit=None, **args):
 
75
        super(many2many_notlazy, self).__init__(obj, rel, id1, id2, string, limit, **args)
 
76
 
 
77
    def set(self, cr, obj, id, name, values, user=None, context=None):
 
78
        if context is None:
 
79
            context = {}
 
80
        if not values:
 
81
            return
 
82
        obj = obj.pool.get(self._obj)
 
83
        newargs = []
 
84
        for act in values:
 
85
            if not (isinstance(act, list) or isinstance(act, tuple)) or not act:
 
86
                continue
 
87
            if act[0] == 6:
 
88
                d1, d2,tables = obj.pool.get('ir.rule').domain_get(cr, user, obj._name, context=context)
 
89
                if d1:
 
90
                    d1 = ' and ' + ' and '.join(d1)
 
91
                else:
 
92
                    d1 = ''
 
93
                args = [id, id]+d2
 
94
                if not act[2]:
 
95
                    args.append((0,))
 
96
                else:
 
97
                    args.append(tuple(act[2]))
 
98
                cr.execute('delete from '+self._rel+' where '+self._id1+'=%s AND '+self._id2+' IN (SELECT '+self._rel+'.'+self._id2+' FROM '+self._rel+', '+','.join(tables)+' WHERE '+self._rel+'.'+self._id1+'=%s AND '+self._rel+'.'+self._id2+' = '+obj._table+'.id '+ d1 +' and '+self._rel+'.'+self._id2+' not in %s)', args)
 
99
 
 
100
                cr.execute('select '+self._id2+' from '+self._rel+' where '+self._id1+'=%s', [id, ])
 
101
                existing = [x[0] for x in cr.fetchall()]
 
102
 
 
103
                for act_nbr in act[2]:
 
104
                    if act_nbr not in existing:
 
105
                        if self._rel == 'account_destination_link':
 
106
                            link_obj = pooler.get_pool(cr.dbname).get('account.destination.link')
 
107
                            link_obj.create(cr, user, {self._id1: id, self._id2: act_nbr})
 
108
                        else:
 
109
                            cr.execute('insert into '+self._rel+' ('+self._id1+','+self._id2+') values (%s, %s)', (id, act_nbr))
 
110
                        
 
111
            else:
 
112
                newargs.append(act)
 
113
        if newargs:
 
114
            return super(many2many_notlazy, self).set(cr, obj, id, name, newargs, user=user, context=context)
 
115
 
 
116