Add attributes and elements on XML views' checks to avoid errors with Studio (renamed_field and studio_groups) (#19623)

This commit is contained in:
kujiu
2017-09-21 16:21:53 +02:00
committed by GitHub
parent c6b184bb23
commit fc5d6e1ab9
8 changed files with 150 additions and 108 deletions
+1
View File
@@ -30,6 +30,7 @@
</rng:optional>
<rng:zeroOrMore>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
</rng:zeroOrMore>
<rng:optional>
<rng:element name="template">
+141 -107
View File
@@ -64,9 +64,11 @@
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
<rng:ref name="group"/>
<rng:ref name="button"/>
<rng:ref name="label" />
<rng:ref name="renamed_label"/>
<rng:ref name="separator"/>
<rng:ref name="image"/>
<rng:ref name="filter"/>
@@ -91,40 +93,52 @@
</rng:element>
</rng:define>
<rng:define name="labelContent">
<rng:ref name="overload"/>
<rng:ref name="access_rights"/>
<rng:ref name="modifiable"/>
<rng:optional><rng:attribute name="invisible"/></rng:optional>
<rng:optional><rng:attribute name="align"/></rng:optional>
<rng:optional><rng:attribute name="nolabel"/></rng:optional>
<rng:optional><rng:attribute name="colspan"/></rng:optional>
<rng:optional><rng:attribute name="string"/></rng:optional>
<rng:optional><rng:attribute name="angle"/></rng:optional>
<rng:optional><rng:attribute name="fill"/></rng:optional>
<rng:optional><rng:attribute name="help"/></rng:optional>
<rng:optional><rng:attribute name="width"/></rng:optional>
<rng:optional><rng:attribute name="wrap"/></rng:optional>
<rng:optional><rng:attribute name="name"/></rng:optional>
<rng:optional>
<!-- @for: allows to explicitely link a label to a field -->
<rng:attribute name="for"/>
</rng:optional>
<rng:zeroOrMore>
<rng:choice>
<rng:text/>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
<rng:ref name="group"/>
<rng:ref name="button"/>
<rng:ref name="label" />
<rng:ref name="renamed_label"/>
<rng:ref name="separator"/>
<rng:ref name="image"/>
<rng:ref name="filter"/>
<rng:ref name="html"/>
<rng:element name="newline"><rng:empty/></rng:element>
</rng:choice>
</rng:zeroOrMore>
</rng:define>
<rng:define name="label">
<rng:element name="label">
<rng:ref name="overload"/>
<rng:ref name="access_rights"/>
<rng:ref name="modifiable"/>
<rng:optional><rng:attribute name="invisible"/></rng:optional>
<rng:optional><rng:attribute name="align"/></rng:optional>
<rng:optional><rng:attribute name="nolabel"/></rng:optional>
<rng:optional><rng:attribute name="colspan"/></rng:optional>
<rng:optional><rng:attribute name="string"/></rng:optional>
<rng:optional><rng:attribute name="angle"/></rng:optional>
<rng:optional><rng:attribute name="fill"/></rng:optional>
<rng:optional><rng:attribute name="help"/></rng:optional>
<rng:optional><rng:attribute name="width"/></rng:optional>
<rng:optional><rng:attribute name="wrap"/></rng:optional>
<rng:optional><rng:attribute name="name"/></rng:optional>
<rng:optional>
<!-- @for: allows to explicitely link a label to a field -->
<rng:attribute name="for"/>
</rng:optional>
<rng:zeroOrMore>
<rng:choice>
<rng:text/>
<rng:ref name="field"/>
<rng:ref name="group"/>
<rng:ref name="button"/>
<rng:ref name="label" />
<rng:ref name="separator"/>
<rng:ref name="image"/>
<rng:ref name="filter"/>
<rng:ref name="html"/>
<rng:element name="newline"><rng:empty/></rng:element>
</rng:choice>
</rng:zeroOrMore>
<rng:ref name="labelContent"></rng:ref>
</rng:element>
</rng:define>
<rng:define name="renamed_label">
<rng:element name="renamed_label">
<rng:ref name="labelContent"></rng:ref>
</rng:element>
</rng:define>
@@ -161,7 +175,9 @@
<rng:ref name="separator"/>
<rng:ref name="button"/>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
<rng:ref name="label" />
<rng:ref name="renamed_label"/>
<rng:ref name="group" />
<rng:ref name="filter"/>
<rng:ref name="html"/>
@@ -190,7 +206,9 @@
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
<rng:ref name="label"/>
<rng:ref name="renamed_label"/>
<rng:ref name="separator"/>
<rng:ref name="xpath"/>
<rng:ref name="button"/>
@@ -203,83 +221,96 @@
</rng:element>
</rng:define>
<rng:define name="fieldContent">
<rng:attribute name="name" />
<rng:ref name="overload"/>
<rng:ref name="access_rights"/>
<rng:ref name="modifiable"/>
<rng:optional><rng:attribute name="domain_filter"/></rng:optional>
<rng:optional><rng:attribute name="attrs"/></rng:optional>
<rng:optional><rng:attribute name="class"/></rng:optional>
<rng:optional><rng:attribute name="string"/></rng:optional>
<rng:optional><rng:attribute name="completion"/></rng:optional>
<rng:optional><rng:attribute name="width"/></rng:optional>
<rng:optional><rng:attribute name="type"/></rng:optional>
<rng:optional><rng:attribute name="ref"/></rng:optional>
<rng:optional><rng:attribute name="eval"/></rng:optional>
<rng:optional><rng:attribute name="search"/></rng:optional>
<rng:optional><rng:attribute name="model"/></rng:optional>
<rng:optional><rng:attribute name="use"/></rng:optional>
<rng:optional><rng:attribute name="on_change"/></rng:optional>
<rng:optional><rng:attribute name="domain"/></rng:optional>
<rng:optional><rng:attribute name="filter_domain"/></rng:optional>
<rng:optional><rng:attribute name="invisible"/></rng:optional>
<rng:optional><rng:attribute name="password"/></rng:optional>
<rng:optional><rng:attribute name="comparator"/></rng:optional>
<rng:optional><rng:attribute name="sum"/></rng:optional>
<rng:optional><rng:attribute name="bold"/></rng:optional>
<rng:optional><rng:attribute name="avg"/></rng:optional>
<rng:optional><rng:attribute name="select"/></rng:optional>
<rng:optional><rng:attribute name="group"/></rng:optional>
<rng:optional><rng:attribute name="studio_groups"/></rng:optional>
<rng:optional><rng:attribute name="operator"/></rng:optional>
<rng:optional><rng:attribute name="colspan"/></rng:optional>
<rng:optional><rng:attribute name="nolabel"/></rng:optional>
<rng:optional><rng:attribute name="required"/></rng:optional>
<rng:optional><rng:attribute name="readonly"/></rng:optional>
<rng:optional><rng:attribute name="view_mode"/></rng:optional>
<rng:optional><rng:attribute name="widget"/></rng:optional>
<rng:optional><rng:attribute name="context"/></rng:optional>
<rng:optional><rng:attribute name="states"/></rng:optional>
<rng:optional><rng:attribute name="digits"/></rng:optional>
<rng:optional><rng:attribute name="icon"/></rng:optional>
<rng:optional><rng:attribute name="mode"/></rng:optional>
<rng:optional><rng:attribute name="img_width"/></rng:optional>
<rng:optional><rng:attribute name="img_height"/></rng:optional>
<rng:optional><rng:attribute name="size"/></rng:optional>
<rng:optional><rng:attribute name="filename"/></rng:optional>
<rng:optional><rng:attribute name="height"/></rng:optional>
<rng:optional><rng:attribute name="rowspan"/></rng:optional>
<rng:optional><rng:attribute name="align"/></rng:optional>
<rng:optional><rng:attribute name="selection"/></rng:optional>
<rng:optional><rng:attribute name="default_focus"/></rng:optional>
<rng:optional><rng:attribute name="filters"/></rng:optional>
<rng:optional><rng:attribute name="statusbar_visible"/></rng:optional>
<rng:optional><rng:attribute name="can_create" /></rng:optional>
<rng:optional><rng:attribute name="can_write" /></rng:optional>
<rng:optional><rng:attribute name="interval" /></rng:optional>
<rng:optional><rng:attribute name="avatar_field" /></rng:optional>
<rng:optional><rng:attribute name="write_model" /></rng:optional>
<rng:optional><rng:attribute name="write_field" /></rng:optional>
<!-- Widget *static* options defined as an arbitrary JSON dict, with
widget-dependent parameters. To be ignored if widget/client does
not support them. -->
<rng:optional><rng:attribute name="options"/></rng:optional>
<rng:optional><rng:attribute name="placeholder"/></rng:optional>
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="data"/>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
<rng:ref name="label"/>
<rng:ref name="renamed_label"/>
<rng:ref name="separator"/>
<rng:ref name="xpath"/>
<rng:ref name="button"/>
<rng:ref name="group"/>
<rng:ref name="filter"/>
<rng:ref name="html"/>
<rng:element name="newline"><rng:empty/></rng:element>
</rng:choice>
</rng:zeroOrMore>
</rng:define>
<rng:define name="field">
<rng:element name="field">
<rng:attribute name="name" />
<rng:ref name="overload"/>
<rng:ref name="access_rights"/>
<rng:ref name="modifiable"/>
<rng:optional><rng:attribute name="domain_filter"/></rng:optional>
<rng:optional><rng:attribute name="attrs"/></rng:optional>
<rng:optional><rng:attribute name="class"/></rng:optional>
<rng:optional><rng:attribute name="string"/></rng:optional>
<rng:optional><rng:attribute name="completion"/></rng:optional>
<rng:optional><rng:attribute name="width"/></rng:optional>
<rng:optional><rng:attribute name="type"/></rng:optional>
<rng:optional><rng:attribute name="ref"/></rng:optional>
<rng:optional><rng:attribute name="eval"/></rng:optional>
<rng:optional><rng:attribute name="search"/></rng:optional>
<rng:optional><rng:attribute name="model"/></rng:optional>
<rng:optional><rng:attribute name="use"/></rng:optional>
<rng:optional><rng:attribute name="on_change"/></rng:optional>
<rng:optional><rng:attribute name="domain"/></rng:optional>
<rng:optional><rng:attribute name="filter_domain"/></rng:optional>
<rng:optional><rng:attribute name="invisible"/></rng:optional>
<rng:optional><rng:attribute name="password"/></rng:optional>
<rng:optional><rng:attribute name="comparator"/></rng:optional>
<rng:optional><rng:attribute name="sum"/></rng:optional>
<rng:optional><rng:attribute name="bold"/></rng:optional>
<rng:optional><rng:attribute name="avg"/></rng:optional>
<rng:optional><rng:attribute name="select"/></rng:optional>
<rng:optional><rng:attribute name="group"/></rng:optional>
<rng:optional><rng:attribute name="operator"/></rng:optional>
<rng:optional><rng:attribute name="colspan"/></rng:optional>
<rng:optional><rng:attribute name="nolabel"/></rng:optional>
<rng:optional><rng:attribute name="required"/></rng:optional>
<rng:optional><rng:attribute name="readonly"/></rng:optional>
<rng:optional><rng:attribute name="view_mode"/></rng:optional>
<rng:optional><rng:attribute name="widget"/></rng:optional>
<rng:optional><rng:attribute name="context"/></rng:optional>
<rng:optional><rng:attribute name="states"/></rng:optional>
<rng:optional><rng:attribute name="digits"/></rng:optional>
<rng:optional><rng:attribute name="icon"/></rng:optional>
<rng:optional><rng:attribute name="mode"/></rng:optional>
<rng:optional><rng:attribute name="img_width"/></rng:optional>
<rng:optional><rng:attribute name="img_height"/></rng:optional>
<rng:optional><rng:attribute name="size"/></rng:optional>
<rng:optional><rng:attribute name="filename"/></rng:optional>
<rng:optional><rng:attribute name="height"/></rng:optional>
<rng:optional><rng:attribute name="rowspan"/></rng:optional>
<rng:optional><rng:attribute name="align"/></rng:optional>
<rng:optional><rng:attribute name="selection"/></rng:optional>
<rng:optional><rng:attribute name="default_focus"/></rng:optional>
<rng:optional><rng:attribute name="filters"/></rng:optional>
<rng:optional><rng:attribute name="statusbar_visible"/></rng:optional>
<rng:optional><rng:attribute name="can_create" /></rng:optional>
<rng:optional><rng:attribute name="can_write" /></rng:optional>
<rng:optional><rng:attribute name="interval" /></rng:optional>
<rng:optional><rng:attribute name="avatar_field" /></rng:optional>
<rng:optional><rng:attribute name="write_model" /></rng:optional>
<rng:optional><rng:attribute name="write_field" /></rng:optional>
<!-- Widget *static* options defined as an arbitrary JSON dict, with
widget-dependent parameters. To be ignored if widget/client does
not support them. -->
<rng:optional><rng:attribute name="options"/></rng:optional>
<rng:optional><rng:attribute name="placeholder"/></rng:optional>
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="data"/>
<rng:ref name="field"/>
<rng:ref name="label"/>
<rng:ref name="separator"/>
<rng:ref name="xpath"/>
<rng:ref name="button"/>
<rng:ref name="group"/>
<rng:ref name="filter"/>
<rng:ref name="html"/>
<rng:element name="newline"><rng:empty/></rng:element>
</rng:choice>
</rng:zeroOrMore>
<rng:ref name="fieldContent"></rng:ref>
</rng:element>
</rng:define>
<rng:define name="renamed_field">
<rng:element name="renamed_field">
<rng:ref name="fieldContent"></rng:ref>
</rng:element>
</rng:define>
@@ -302,6 +333,7 @@
<rng:optional><rng:attribute name="invisible"/></rng:optional>
<rng:zeroOrMore>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
</rng:zeroOrMore>
<rng:ref name="container"/>
</rng:element>
@@ -332,6 +364,7 @@
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="field" />
<rng:ref name="renamed_field"/>
<rng:ref name="xpath" />
<rng:ref name="separator"/>
<rng:ref name="button"/>
@@ -366,6 +399,7 @@
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="field" />
<rng:ref name="renamed_field"/>
<rng:ref name="xpath" />
<rng:ref name="separator"/>
<rng:ref name="button"/>
+3
View File
@@ -14,6 +14,7 @@
<rng:ref name="arrow"/>
<rng:zeroOrMore>
<rng:ref name="label"/>
<rng:ref name="renamed_label"/>
</rng:zeroOrMore>
</rng:element>
</rng:define>
@@ -26,6 +27,7 @@
<rng:optional><rng:attribute name="form_view_ref"/></rng:optional>
<rng:zeroOrMore>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
</rng:zeroOrMore>
</rng:element>
</rng:define>
@@ -39,6 +41,7 @@
<rng:optional><rng:attribute name="label"/></rng:optional>
<rng:zeroOrMore>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
</rng:zeroOrMore>
</rng:element>
</rng:define>
+1
View File
@@ -24,6 +24,7 @@
<rng:optional><rng:attribute name="interval"/></rng:optional>
<rng:zeroOrMore>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
</rng:zeroOrMore>
</rng:element>
</rng:define>
+1
View File
@@ -14,6 +14,7 @@
<rng:optional><rng:attribute name="disable_linking"/></rng:optional>
<rng:zeroOrMore>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
</rng:zeroOrMore>
</rng:element>
</rng:define>
+1
View File
@@ -13,6 +13,7 @@
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
<rng:ref name="group"/>
<rng:ref name="separator"/>
<rng:ref name="filter"/>
+1
View File
@@ -53,6 +53,7 @@
<rng:zeroOrMore>
<rng:choice>
<rng:ref name="field"/>
<rng:ref name="renamed_field"/>
<rng:ref name="separator"/>
<rng:ref name="tree"/>
<rng:ref name="group"/>
+1 -1
View File
@@ -75,7 +75,7 @@ def valid_field_in_graph(arch):
def valid_field_in_tree(arch):
""" Children of ``tree`` view must be ``field`` or ``button``."""
return all(
child.tag in ('field', 'button')
child.tag in ('field', 'button', 'renamed_field')
for child in arch.xpath('/tree/*')
)