← Back to team overview

openerp-community-reviewer team mailing list archive

[Merge] lp:~therp-nl/ocb-server/6.1-fix_o2m_write_date_and_user into lp:ocb-server/6.1

 

Stefan Rijnhart (Therp) has proposed merging lp:~therp-nl/ocb-server/6.1-fix_o2m_write_date_and_user into lp:ocb-server/6.1.

Requested reviews:
  OpenERP Community Backports (ocb)

For more details, see:
https://code.launchpad.net/~therp-nl/ocb-server/6.1-fix_o2m_write_date_and_user/+merge/249936

[FIX] orm: Ignore orm (4, *) operations on one2many if link already exists.
    
    Web client returns (4, ) operations for unchanged line in one2many widgets. 
    This allows to skip orm write on object where potentially has no access (eg: timesheet line with another user). (opw 599494)
  
Additionally, this prevents the reset of o2m resource write date and user

Verbatim backport of http://bazaar.launchpad.net/~openerp/openobject-server/7.0/revision/5162
and http://bazaar.launchpad.net/~openerp/openobject-server/7.0/revision/5267
-- 
Your team OpenERP Community Backports is requested to review the proposed merge of lp:~therp-nl/ocb-server/6.1-fix_o2m_write_date_and_user into lp:ocb-server/6.1.
=== modified file 'openerp/osv/fields.py'
--- openerp/osv/fields.py	2013-09-10 14:15:41 +0000
+++ openerp/osv/fields.py	2015-02-17 10:02:55 +0000
@@ -584,8 +584,13 @@
                 else:
                     cr.execute('update '+_table+' set '+self._fields_id+'=null where id=%s', (act[1],))
             elif act[0] == 4:
-                # Must use write() to recompute parent_store structure if needed
-                obj.write(cr, user, [act[1]], {self._fields_id:id}, context=context or {})
+                # table of the field (parent_model in case of inherit)
+                field_model = self._fields_id in obj.pool[self._obj]._columns and self._obj or obj.pool[self._obj]._all_columns[self._fields_id].parent_model
+                field_table = obj.pool[field_model]._table
+                cr.execute("select 1 from {0} where id=%s and {1}=%s".format(field_table, self._fields_id), (act[1], id))
+                if not cr.fetchone():
+                    # Must use write() to recompute parent_store structure if needed and check access rules
+                    obj.write(cr, user, [act[1]], {self._fields_id:id}, context=context or {})
             elif act[0] == 5:
                 reverse_rel = obj._all_columns.get(self._fields_id)
                 assert reverse_rel, 'Trying to unlink the content of a o2m but the pointed model does not have a m2o'


Follow ups