[FIX] website: improve COW feature readability

This commit only re-indents the COW feature code and adds comments to
help understand its tricky parts. Also evaluate the 'no_cow' flag only
once per write.

closes odoo/odoo#28753
This commit is contained in:
qsm-odoo
2018-11-19 09:39:37 +00:00
parent ccd1552b83
commit 551eb34f92
+52 -34
View File
@@ -36,43 +36,61 @@ class View(models.Model):
websites. Also this way newly created websites will only
contain the default views.
'''
current_website_id = self._context.get('website_id')
if current_website_id:
# Optional views are inactive but we need to write them
# if their parent is copied
for view in self.with_context(active_test=False):
if not view.key and not vals.get('key'):
view.with_context(no_cow=True).key = 'website.key_%s' % str(uuid.uuid4())[:6]
if not view.website_id and current_website_id and not self._context.get('no_cow'):
# If already a specific view for this generic view, write on it
website_specific_view = view.search([
('key', '=', view.key),
('website_id', '=', current_website_id)
], limit=1)
if not website_specific_view:
# Set key to avoid copy() to generate an unique key as we want the specific view to have the same key
copy_vals = {'website_id': current_website_id, 'key': view.key}
if vals.get('inherit_id'):
copy_vals['inherit_id'] = vals['inherit_id']
website_specific_view = view.copy(copy_vals)
view._create_website_specific_pages_for_view(website_specific_view,
view.env['website'].browse(current_website_id))
current_website_id = self.env.context.get('website_id')
if not current_website_id or self.env.context.get('no_cow'):
return super(View, self).write(vals)
for inherit_child in view.inherit_children_ids.filter_duplicate():
# COW won't be triggered if there is already a website_id on the view, we should copy the view ourself
if inherit_child.website_id.id == current_website_id:
inherit_child.copy({'inherit_id': website_specific_view.id, 'key': inherit_child.key})
# We should unlink website specific view from generic tree as it now copied on specific tree
inherit_child.unlink()
else:
# trigger COW on inheriting views
inherit_child.write({'inherit_id': website_specific_view.id})
# We need to consider inactive views when handling multi-website cow
# feature (to copy inactive children views, to search for specific
# views, ...)
for view in self.with_context(active_test=False):
# Make sure views which are written in a website context receive
# a value for their 'key' field
if not view.key and not vals.get('key'):
view.with_context(no_cow=True).key = 'website.key_%s' % str(uuid.uuid4())[:6]
super(View, website_specific_view).write(vals)
continue
# No need of COW if the view is already specific
if view.website_id:
super(View, view).write(vals)
else:
super(View, self).write(vals)
continue
# If already a specific view for this generic view, write on it
website_specific_view = view.search([
('key', '=', view.key),
('website_id', '=', current_website_id)
], limit=1)
if website_specific_view:
super(View, website_specific_view).write(vals)
continue
# Set key to avoid copy() to generate an unique key as we want the
# specific view to have the same key
copy_vals = {'website_id': current_website_id, 'key': view.key}
# Copy with the 'inherit_id' field value that will be written to
# ensure the copied view's validation works
if vals.get('inherit_id'):
copy_vals['inherit_id'] = vals['inherit_id']
website_specific_view = view.copy(copy_vals)
view._create_website_specific_pages_for_view(website_specific_view,
view.env['website'].browse(current_website_id))
for inherit_child in view.inherit_children_ids.filter_duplicate():
if inherit_child.website_id.id == current_website_id:
# In the case the child was already specific to the current
# website, we cannot just reattach it to the new specific
# parent: we have to copy it there and remove it from the
# original tree. Indeed, the order of children 'id' fields
# must remain the same so that the inheritance is applied
# in the same order in the copied tree.
inherit_child.copy({'inherit_id': website_specific_view.id, 'key': inherit_child.key})
inherit_child.unlink()
else:
# Trigger COW on inheriting views
inherit_child.write({'inherit_id': website_specific_view.id})
super(View, website_specific_view).write(vals)
return True
@api.multi