diff --git a/addons/base_address_city/models/res_partner.py b/addons/base_address_city/models/res_partner.py
index 2f43935b0c2..5b98ac65ef6 100644
--- a/addons/base_address_city/models/res_partner.py
+++ b/addons/base_address_city/models/res_partner.py
@@ -25,17 +25,58 @@ class Partner(models.Model):
# render the partner address accordingly to address_view_id
doc = etree.fromstring(arch)
if doc.xpath("//field[@name='city_id']"):
- return arch
- for city_node in doc.xpath("//field[@name='city']"):
- replacement_xml = """
+ return arch
+
+ replacement_xml = """
-
-
+
+
- """ % (_('City'), _('City'))
- city_id_node = etree.fromstring(replacement_xml)
- city_node.getparent().replace(city_node, city_id_node)
+ """
+
+ replacement_data = {
+ 'placeholder': _('City'),
+ }
+
+ def _arch_location(node):
+ in_subview = False
+ view_type = False
+ parent = node.getparent()
+ while parent is not None and (not view_type or not in_subview):
+ if parent.tag == 'field':
+ in_subview = True
+ elif parent.tag in ['list', 'tree', 'kanban', 'form']:
+ view_type = parent.tag
+ parent = parent.getparent()
+ return {
+ 'view_type': view_type,
+ 'in_subview': in_subview,
+ }
+
+ for city_node in doc.xpath("//field[@name='city']"):
+ location = _arch_location(city_node)
+ replacement_data['parent_condition'] = ''
+ if location['view_type'] == 'form' or not location['in_subview']:
+ replacement_data['parent_condition'] = ", ('parent_id', '!=', False)"
+
+ replacement_formatted = replacement_xml % replacement_data
+ for replace_node in etree.fromstring(replacement_formatted).getchildren():
+ city_node.addprevious(replace_node)
+ parent = city_node.getparent()
+ parent.remove(city_node)
arch = etree.tostring(doc, encoding='unicode')
return arch