~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: 2014-03-31 09:31:46 UTC
  • mto: This revision was merged to the branch mainline in revision 2086.
  • Revision ID: od@tempo-consulting.fr-20140331093146-tgvxnly1kc1hbv1s
UF-2171 [ADD] Analytic distribution reset button for recurring models

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
 
 
3
from osv import fields
 
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 i in ids:
 
20
            res[i] = []
 
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, m_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 = [m_id, m_id]+d2
 
94
                if not act[2]:
 
95
                    args.append((0,))
 
96
                else:
 
97
                    args.append(tuple(act[2]))
 
98
 
 
99
                # JIRA UTP-334
 
100
                if self._rel == 'account_destination_link':
 
101
                    cr.execute('select id 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)
 
102
                    unlink_obj = pooler.get_pool(cr.dbname).get('account.destination.link')
 
103
                    for unlinked_id in cr.fetchall():
 
104
                        unlink_obj.unlink(cr, user, unlinked_id[0])
 
105
                else:
 
106
                    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)
 
107
 
 
108
 
 
109
                cr.execute('select '+self._id2+' from '+self._rel+' where '+self._id1+'=%s', [m_id, ])
 
110
                existing = [x[0] for x in cr.fetchall()]
 
111
 
 
112
                for act_nbr in act[2]:
 
113
                    if act_nbr not in existing:
 
114
                        if self._rel == 'account_destination_link':
 
115
                            link_obj = pooler.get_pool(cr.dbname).get('account.destination.link')
 
116
                            link_obj.create(cr, user, {self._id1: m_id, self._id2: act_nbr})
 
117
                        else:
 
118
                            cr.execute('insert into '+self._rel+' ('+self._id1+','+self._id2+') values (%s, %s)', (m_id, act_nbr))
 
119
 
 
120
            else:
 
121
                newargs.append(act)
 
122
        if newargs:
 
123
            return super(many2many_notlazy, self).set(cr, obj, m_id, name, newargs, user=user, context=context)
 
124
 
 
125
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 
 
b'\\ No newline at end of file'