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

« back to all changes in this revision

Viewing changes to analytic_distribution/destination_tools.py

  • Committer: Quentin THEURET
  • Date: 2011-11-30 13:31:37 UTC
  • mto: This revision was merged to the branch mainline in revision 515.
  • Revision ID: qt@tempo-consulting.fr-20111130133137-mdf2fp6hkqmwbppn
UF-647 [ADD] Added a line in Purchase Order to have information about international transport costs

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'