Merge lp:~openerp-dev/openobject-server/trunk-improve-store-set-value-xmo into lp:openobject-server

Proposed by Xavier (Open ERP)
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-server/trunk-improve-store-set-value-xmo
Merge into: lp:openobject-server
Diff against target: 125 lines (+31/-42)
1 file modified
openerp/osv/orm.py (+31/-42)
To merge this branch: bzr merge lp:~openerp-dev/openobject-server/trunk-improve-store-set-value-xmo
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+168972@code.launchpad.net

Description of the change

Improvements/internal rejiggerings and refactorings of _store_set_values to make it slightly less unreadable.

To post a comment you must log in.

Unmerged revisions

4896. By Xavier (Open ERP)

[IMP] reduce nesting and attempt to make _store_set_values not unreadable

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openerp/osv/orm.py'
2--- openerp/osv/orm.py 2013-06-10 15:06:57 +0000
3+++ openerp/osv/orm.py 2013-06-12 14:59:03 +0000
4@@ -38,6 +38,7 @@
5 - functions
6
7 """
8+import collections
9
10 import babel.dates
11 import calendar
12@@ -4353,7 +4354,6 @@
13 else:
14 tocreate[v] = {'id': vals[self._inherits[v]]}
15 (upd0, upd1, upd2) = ('', '', [])
16- upd_todo = []
17 unknown_fields = []
18 for v in vals.keys():
19 if v in self._inherit_fields and v not in self._columns:
20@@ -4432,6 +4432,7 @@
21
22 if not edit:
23 vals.pop(field)
24+ upd_todo = []
25 for field in vals:
26 if self._columns[field]._classic_write:
27 upd0 = upd0 + ',"' + field + '"'
28@@ -4599,45 +4600,32 @@
29 respecting ``multi`` attributes), and stores the resulting values in the database directly."""
30 if not ids:
31 return True
32- field_flag = False
33- field_dict = {}
34+ field_dict = collections.defaultdict(list)
35 if self._log_access:
36 cr.execute('select id,write_date from '+self._table+' where id IN %s', (tuple(ids),))
37- res = cr.fetchall()
38- for r in res:
39- if r[1]:
40- field_dict.setdefault(r[0], [])
41- res_date = time.strptime((r[1])[:19], '%Y-%m-%d %H:%M:%S')
42- write_date = datetime.datetime.fromtimestamp(time.mktime(res_date))
43- for i in self.pool._store_function.get(self._name, []):
44- if i[5]:
45- up_write_date = write_date + datetime.timedelta(hours=i[5])
46- if datetime.datetime.now() < up_write_date:
47- if i[1] in fields:
48- field_dict[r[0]].append(i[1])
49- if not field_flag:
50- field_flag = True
51+ for id, write_date in cr.fetchall():
52+ if not write_date: continue
53+ write_datetime = datetime.datetime.strptime(
54+ write_date[:19], '%Y-%m-%d %H:%M:%S')
55+ for i in self.pool._store_function.get(self._name, []):
56+ if not i[5]: continue
57+ up_write_date = write_datetime + datetime.timedelta(hours=i[5])
58+ if i[1] in fields and datetime.datetime.now() < up_write_date:
59+ field_dict[id].append(i[1])
60 todo = {}
61- keys = []
62 for f in fields:
63- if self._columns[f]._multi not in keys:
64- keys.append(self._columns[f]._multi)
65- todo.setdefault(self._columns[f]._multi, [])
66- todo[self._columns[f]._multi].append(f)
67- for key in keys:
68- val = todo[key]
69- if key:
70+ todo.setdefault(self._columns[f]._multi, []).append(f)
71+ for multi_group, group_fields in todo.iteritems():
72+ if multi_group:
73 # use admin user for accessing objects having rules defined on store fields
74- result = self._columns[val[0]].get(cr, self, ids, val, SUPERUSER_ID, context=context)
75+ result = self._columns[group_fields[0]].get(cr, self, ids, group_fields, SUPERUSER_ID, context=context)
76 for id, value in result.items():
77- if field_flag:
78- for f in value.keys():
79- if f in field_dict[id]:
80- value.pop(f)
81+ value = dict((f, v) for f, v in value.iteritems()
82+ if f not in field_dict.get(id, ()))
83 upd0 = []
84 upd1 = []
85 for v in value:
86- if v not in val:
87+ if v not in group_fields:
88 continue
89 if self._columns[v]._type == 'many2one':
90 try:
91@@ -4652,22 +4640,23 @@
92 ','.join(upd0) + ' where id = %s', upd1)
93
94 else:
95- for f in val:
96+ for f in group_fields:
97+ column = self._columns[f]
98 # use admin user for accessing objects having rules defined on store fields
99- result = self._columns[f].get(cr, self, ids, f, SUPERUSER_ID, context=context)
100- for r in result.keys():
101- if field_flag:
102- if r in field_dict.keys():
103- if f in field_dict[r]:
104- result.pop(r)
105- for id, value in result.items():
106- if self._columns[f]._type == 'many2one':
107+ result = column.get(cr, self, ids, f, SUPERUSER_ID, context=context)
108+ result = (
109+ (id, value) for id, value in result.iteritems()
110+ if f not in field_dict.get(id, ())
111+ )
112+ for id, value in result:
113+ if column._type == 'many2one':
114 try:
115 value = value[0]
116 except:
117 pass
118- cr.execute('update "' + self._table + '" set ' + \
119- '"'+f+'"='+self._columns[f]._symbol_set[0] + ' where id = %s', (self._columns[f]._symbol_set[1](value), id))
120+ cr.execute('UPDATE "%s" SET "%s"=%s WHERE id=%%s' % (
121+ self._table, f, column._symbol_set[0]
122+ ), (column._symbol_set[1](value), id))
123 return True
124
125 #