Merge lp:~openerp-dev/openobject-server/6.0-opw-383628-xal into lp:openobject-server/6.0

Proposed by Xavier ALT
Status: Merged
Approved by: Naresh(OpenERP)
Approved revision: 3611
Merged at revision: 3611
Proposed branch: lp:~openerp-dev/openobject-server/6.0-opw-383628-xal
Merge into: lp:openobject-server/6.0
Diff against target: 53 lines (+23/-0)
1 file modified
bin/osv/osv.py (+23/-0)
To merge this branch: bzr merge lp:~openerp-dev/openobject-server/6.0-opw-383628-xal
Reviewer Review Type Date Requested Status
Naresh(OpenERP) Pending
Review via email: mp+100559@code.launchpad.net

Description of the change

Hi,

This force copy of "float" fields upon module loading, so that the "digits" cache inside the fields is specific to the pool, not server-wide. This was causing problem of decimal precision changing server-wide when connecter to a new DB.

NOTE: This is a backport of v6.1, but the fix in v6.1 only work for inherited object, base objects are still facing the problem - this MP will fix both.

Steps:
- Create a database "A" - with sale module
- Create a database "B" - with sale module
- Connect to database "A", change "Sale" precision to 4, check on sale order line - precision is 4.
- Connect to database "B"
- Re-connect to database "A", check on sale order line - precision is now 2 (*wrong*)

Current: float field precision are overwritten uppon when a new database is loaded
Expected: float field precision should be per-pool (per database)

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/osv/osv.py'
2--- bin/osv/osv.py 2011-05-25 13:26:12 +0000
3+++ bin/osv/osv.py 2012-04-03 07:06:26 +0000
4@@ -303,12 +303,23 @@
5 for c in new.keys():
6 if new[c].manual:
7 del new[c]
8+ # Duplicate float fields because they have a .digits
9+ # cache (which must be per-pool, not server-wide).
10+ for c in new.keys():
11+ if new[c]._type == 'float':
12+ new[c] = copy.copy(new[c])
13 if hasattr(new, 'update'):
14 new.update(cls.__dict__.get(s, {}))
15 else:
16 new.extend(cls.__dict__.get(s, []))
17 nattr[s] = new
18 cls = type(name, (cls, parent_class), nattr)
19+ else:
20+ # Duplicate float fields because they have a .digits
21+ # cache (which must be per-pool, not server-wide).
22+ for field_name, field in cls._columns.items():
23+ if field._type == 'float':
24+ cls._columns[field_name] = copy.copy(field)
25
26 obj = object.__new__(cls)
27 obj.__init__(pool, cr)
28@@ -342,6 +353,12 @@
29 for c in new.keys():
30 if new[c].manual:
31 del new[c]
32+ # Duplicate float fields because they have a .digits
33+ # cache (which must be per-pool, not server-wide).
34+ for c in new.keys():
35+ if new[c]._type == 'float':
36+ new[c] = copy.copy(new[c])
37+
38 if hasattr(new, 'update'):
39 new.update(cls.__dict__.get(s, {}))
40 else:
41@@ -365,6 +382,12 @@
42 new.extend(cls.__dict__.get(s, []))
43 nattr[s] = new
44 cls = type(name, (cls, parent_class), nattr)
45+ else:
46+ # Duplicate float fields because they have a .digits
47+ # cache (which must be per-pool, not server-wide).
48+ for field_name, field in cls._columns.items():
49+ if field._type == 'float':
50+ cls._columns[field_name] = copy.copy(field)
51 obj = object.__new__(cls)
52 obj.__init__(pool, cr)
53 return obj