diff options
| author | Mitali Patel <mpa@odoo.com> | 2017-09-14 13:46:00 +0530 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2017-09-14 10:16:00 +0200 |
| commit | 70942e4cfb7a8993904b4d142e3b1749a40db806 (patch) | |
| tree | 58a3d7dabba6eeb9150985aa5aa5d4201d3dd69f | |
| parent | 93d4da977a2ad41dd0547977f3faace55df2cc76 (diff) | |
[IMP] base: improve view rng validation (#17902)
Split big universal RNG into view-specific schemas and moved rng based view validation
into view_validation.py file.
Adapt old views, and remove deprecated tag `version="7.0"` from views.
| -rw-r--r-- | addons/account/views/account_payment_view.xml | 6 | ||||
| -rw-r--r-- | addons/mrp_repair/wizard/mrp_repair_cancel.py | 2 | ||||
| -rw-r--r-- | addons/pos_restaurant/views/pos_restaurant_views.xml | 14 | ||||
| -rw-r--r-- | odoo/addons/base/ir/ir_ui_view.py | 19 | ||||
| -rw-r--r-- | odoo/addons/base/module/wizard/base_module_upgrade.py | 2 | ||||
| -rw-r--r-- | odoo/addons/base/rng/calendar_view.rng | 48 | ||||
| -rw-r--r-- | odoo/addons/base/rng/common.rng | 381 | ||||
| -rw-r--r-- | odoo/addons/base/rng/diagram_view.rng | 50 | ||||
| -rw-r--r-- | odoo/addons/base/rng/gantt_view.rng | 36 | ||||
| -rw-r--r-- | odoo/addons/base/rng/graph_view.rng | 35 | ||||
| -rw-r--r-- | odoo/addons/base/rng/pivot_view.rng | 25 | ||||
| -rw-r--r-- | odoo/addons/base/rng/search_view.rng | 29 | ||||
| -rw-r--r-- | odoo/addons/base/rng/tree_view.rng | 72 | ||||
| -rw-r--r-- | odoo/addons/base/rng/view.rng | 818 | ||||
| -rw-r--r-- | odoo/addons/base/tests/test_views.py | 12 | ||||
| -rw-r--r-- | odoo/addons/test_exceptions/view.xml | 187 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/views.xml | 16 | ||||
| -rw-r--r-- | odoo/tools/view_validation.py | 31 |
18 files changed, 826 insertions, 957 deletions
diff --git a/addons/account/views/account_payment_view.xml b/addons/account/views/account_payment_view.xml index 3ad1c3ce6db..18bed5ed15c 100644 --- a/addons/account/views/account_payment_view.xml +++ b/addons/account/views/account_payment_view.xml @@ -115,7 +115,7 @@ <field name="name">account.payment.form</field> <field name="model">account.payment</field> <field name="arch" type="xml"> - <form string="Register Payment" version="7"> + <form string="Register Payment"> <header> <button name="post" class="oe_highlight" states="draft" string="Confirm" type="object"/> <button name="action_draft" class="oe_highlight" states="cancelled" string="Set To Draft" type="object"/> @@ -226,7 +226,7 @@ <field name="name">account.payment.invoice.form</field> <field name="model">account.payment</field> <field name="arch" type="xml"> - <form string="Register Payment" version="7"> + <form string="Register Payment"> <sheet> <group> <field name="payment_type" invisible="1"/> @@ -291,7 +291,7 @@ <field name="name">account.register.payments.wizard</field> <field name="model">account.register.payments</field> <field name="arch" type="xml"> - <form string="Register Payment" version="7"> + <form string="Register Payment"> <field name="payment_type" invisible="1"/> <field name="partner_type" invisible="1"/> <field name="partner_id" invisible="1"/> diff --git a/addons/mrp_repair/wizard/mrp_repair_cancel.py b/addons/mrp_repair/wizard/mrp_repair_cancel.py index edb91596d9c..f9a0ef17a16 100644 --- a/addons/mrp_repair/wizard/mrp_repair_cancel.py +++ b/addons/mrp_repair/wizard/mrp_repair_cancel.py @@ -30,7 +30,7 @@ class RepairCancel(models.TransientModel): repair = self.env['mrp.repair'].browse(repair_id) if not repair.invoiced: res['arch'] = """ - <form string="Cancel Repair" version="7.0"> + <form string="Cancel Repair"> <header> <button name="cancel_repair" string="_Yes" type="object" class="btn-primary"/> <button string="Cancel" class="btn-default" special="cancel"/> diff --git a/addons/pos_restaurant/views/pos_restaurant_views.xml b/addons/pos_restaurant/views/pos_restaurant_views.xml index fa68041285e..61f13b90081 100644 --- a/addons/pos_restaurant/views/pos_restaurant_views.xml +++ b/addons/pos_restaurant/views/pos_restaurant_views.xml @@ -105,12 +105,14 @@ <field name="name">Order Printer</field> <field name="model">restaurant.printer</field> <field name="arch" type="xml"> - <form string="POS Printer" version="7.0"> - <group col="2"> - <field name="name" /> - <field name="proxy_ip" /> - <field name="product_categories_ids" /> - </group> + <form string="POS Printer"> + <sheet> + <group> + <field name="name" /> + <field name="proxy_ip" /> + <field name="product_categories_ids" /> + </group> + </sheet> </form> </field> </record> diff --git a/odoo/addons/base/ir/ir_ui_view.py b/odoo/addons/base/ir/ir_ui_view.py index aa347f9d2ee..7279f5b6c5f 100644 --- a/odoo/addons/base/ir/ir_ui_view.py +++ b/odoo/addons/base/ir/ir_ui_view.py @@ -160,9 +160,6 @@ class View(models.Model): _name = 'ir.ui.view' _order = "priority,name,id" - # Holds the RNG schema - _relaxng_validator = None - name = fields.Char(string='View Name', required=True) model = fields.Char(index=True) key = fields.Char() @@ -283,16 +280,6 @@ actual arch. for view in self: view.xml_id = xml_ids.get(view.id, [''])[0] - def _relaxng(self): - if not self._relaxng_validator: - with tools.file_open(os.path.join('base', 'rng', 'view.rng')) as frng: - try: - relaxng_doc = etree.parse(frng) - self._relaxng_validator = etree.RelaxNG(relaxng_doc) - except Exception: - _logger.exception('Failed to load RelaxNG XML schema for views validation') - return self._relaxng_validator - def _valid_inheritance(self, arch): """ Check whether view inheritance is based on translated attribute. """ for node in arch.xpath('//*[@position]'): @@ -333,13 +320,7 @@ actual arch. if view_docs[0].tag == 'data': # A <data> element is a wrapper for multiple root nodes view_docs = view_docs[0] - validator = self._relaxng() for view_arch in view_docs: - version = view_arch.get('version', '7.0') - if parse_version(version) < parse_version('7.0') and validator and not validator.validate(view_arch): - for error in validator.error_log: - _logger.error(tools.ustr(error)) - raise ValidationError(_('Invalid view definition')) if not valid_view(view_arch): raise ValidationError(_('Invalid view definition')) return True diff --git a/odoo/addons/base/module/wizard/base_module_upgrade.py b/odoo/addons/base/module/wizard/base_module_upgrade.py index a590111e644..bd0875d1cba 100644 --- a/odoo/addons/base/module/wizard/base_module_upgrade.py +++ b/odoo/addons/base/module/wizard/base_module_upgrade.py @@ -32,7 +32,7 @@ class BaseModuleUpgrade(models.TransientModel): return res if not self.get_module_list(): - res['arch'] = '''<form string="Upgrade Completed" version="7.0"> + res['arch'] = '''<form string="Upgrade Completed"> <separator string="Upgrade Completed" colspan="4"/> <footer> <button name="config" string="Start Configuration" type="object" class="btn-primary"/> diff --git a/odoo/addons/base/rng/calendar_view.rng b/odoo/addons/base/rng/calendar_view.rng new file mode 100644 index 00000000000..949c3f48318 --- /dev/null +++ b/odoo/addons/base/rng/calendar_view.rng @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:a="http://relaxng.org/ns/annotation/1.0" + datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <!-- Handling of element overloading when inheriting from a base + template + --> + <rng:include href="common.rng"/> + <rng:define name="calendar"> + <rng:element name="calendar"> + <rng:optional><rng:attribute name="string" /></rng:optional> + <rng:optional><rng:attribute name="date_start" /></rng:optional> + <rng:optional><rng:attribute name="date_stop" /></rng:optional> + <rng:optional><rng:attribute name="date_delay" /></rng:optional> + <rng:optional><rng:attribute name="all_day" /></rng:optional> + <rng:optional><rng:attribute name="readonly_form_view_id" /></rng:optional> + <rng:optional><rng:attribute name="form_view_id" /></rng:optional> + <rng:optional><rng:attribute name="event_limit" /></rng:optional> + <rng:optional><rng:attribute name="quick_add" /></rng:optional> + <rng:optional><rng:attribute name="color" /></rng:optional> + <rng:optional><rng:attribute name="event_open_popup" /></rng:optional> + <rng:optional> + <rng:attribute name="mode"> + <rng:choice> + <rng:value>month</rng:value> + <rng:value>week</rng:value> + <rng:value>day</rng:value> + </rng:choice> + </rng:attribute> + </rng:optional> + <rng:zeroOrMore> + <rng:ref name="field"/> + </rng:zeroOrMore> + <rng:optional> + <rng:element name="template"> + <rng:oneOrMore> + <rng:ref name="any"/> + </rng:oneOrMore> + </rng:element> + </rng:optional> + </rng:element> + </rng:define> + <rng:start> + <rng:choice> + <rng:ref name="calendar" /> + </rng:choice> + </rng:start> +</rng:grammar> diff --git a/odoo/addons/base/rng/common.rng b/odoo/addons/base/rng/common.rng new file mode 100644 index 00000000000..f213ba9bf0d --- /dev/null +++ b/odoo/addons/base/rng/common.rng @@ -0,0 +1,381 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:a="http://relaxng.org/ns/annotation/1.0" + datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <!-- Handling of element overloading when inheriting from a base + template + --> + + <rng:define name="overload"> + <rng:optional> + <!-- + Alter matched element with content + --> + <rng:choice> + <rng:attribute name="position"> + <rng:choice> + <!-- Insert content before first child --> + <rng:value>before</rng:value> + <!-- Insert content after last child --> + <rng:value>after</rng:value> + <!-- Replace all children with content --> + <rng:value>inside</rng:value> + <!-- Replace matched element itself with content --> + <rng:value>replace</rng:value> + </rng:choice> + </rng:attribute> + <rng:group> + <rng:attribute name="position"> + <!-- Edit element attributes --> + <rng:value>attributes</rng:value> + </rng:attribute> + <rng:oneOrMore> + <rng:element name="attribute"> + <rng:attribute name="name"><rng:text/></rng:attribute> + <rng:text /> + </rng:element> + </rng:oneOrMore> + </rng:group> + </rng:choice> + </rng:optional> + </rng:define> + + <rng:define name="modifiable"> + <rng:optional> + <!-- @modifiers contains a JSON map unifying the various + modifier attributes: @readonly, @required, @invisible. + Each attribute is a key, mapped to a JSON list representing + a condition expressed as an OpenERP `domain` filter + Only some of the modifier keys make sense on some + elements, for example <filter> and <group> only support + `invisible`. --> + <rng:attribute name="modifiers"/> + </rng:optional> + </rng:define> + + <rng:define name="access_rights"> + <rng:optional> + <rng:attribute name="groups"/> + </rng:optional> + </rng:define> + + <rng:define name="container"> + <rng:optional><rng:attribute name="col"/></rng:optional> + <rng:zeroOrMore> + <rng:choice> + <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:define> + + <rng:define name="image"> + <rng:element name="image"> + <rng:attribute name="name"/> + </rng:element> + </rng:define> + + <rng:define name="html"> + <rng:element name="html"> + <rng:zeroOrMore> + <rng:text/> + <rng:ref name="any"/> + </rng:zeroOrMore> + </rng:element> + </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:element> + </rng:define> + + <rng:define name="any"> + <rng:element> + <rng:anyName/> + <rng:zeroOrMore> + <rng:choice> + <rng:attribute> + <rng:anyName/> + </rng:attribute> + <rng:text/> + <rng:ref name="any"/> + </rng:choice> + </rng:zeroOrMore> + </rng:element> + </rng:define> + + <rng:define name="separator"> + <rng:element name="separator"> + <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="name"/></rng:optional> + <rng:optional><rng:attribute name="colspan"/></rng:optional> + <rng:optional><rng:attribute name="rowspan"/></rng:optional> + <rng:optional><rng:attribute name="string"/></rng:optional> + <rng:optional><rng:attribute name="col"/></rng:optional> + <rng:optional><rng:attribute name="select"/></rng:optional> + <rng:optional><rng:attribute name="orientation"/></rng:optional> + <rng:zeroOrMore> + <rng:choice> + <rng:ref name="separator"/> + <rng:ref name="button"/> + <rng:ref name="field"/> + <rng:ref name="label" /> + <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:element> + </rng:define> + + <rng:define name="xpath"> + <rng:element name="xpath"> + <rng:optional><rng:attribute name="expr"/></rng:optional> + <rng:ref name="overload"/> + <rng:zeroOrMore> + <rng:choice> + <rng:ref name="any"/> + <rng:ref name="button"/> + <rng:ref name="html"/> + </rng:choice> + </rng:zeroOrMore> + </rng:element> + </rng:define> + + <rng:define name="data"> + <rng:element name="data"> + <rng:zeroOrMore> + <rng:choice> + <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:element> + </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:element> + </rng:define> + + <rng:define name="group"> + <rng:element name="group"> + <rng:ref name="overload"/> + <rng:ref name="access_rights"/> + <rng:ref name="modifiable"/> + <rng:optional><rng:attribute name="attrs"/></rng:optional> + <rng:optional><rng:attribute name="colspan"/></rng:optional> + <rng:optional><rng:attribute name="rowspan"/></rng:optional> + <rng:optional><rng:attribute name="expand"/></rng:optional> + <rng:optional><rng:attribute name="states"/></rng:optional> + <rng:optional><rng:attribute name="string"/></rng:optional> + <rng:optional><rng:attribute name="fill"/></rng:optional> + <rng:optional><rng:attribute name="height"/></rng:optional> + <rng:optional><rng:attribute name="width"/></rng:optional> + <rng:optional><rng:attribute name="name"/></rng:optional> + <rng:optional><rng:attribute name="color" /></rng:optional> + <rng:optional><rng:attribute name="invisible"/></rng:optional> + <rng:zeroOrMore> + <rng:ref name="field"/> + </rng:zeroOrMore> + <rng:ref name="container"/> + </rng:element> + </rng:define> + + <rng:define name="button"> + <rng:element name="button"> + <rng:ref name="overload"/> + <rng:ref name="access_rights"/> + <rng:ref name="modifiable"/> + <rng:optional><rng:attribute name="attrs"/></rng:optional> + <rng:optional><rng:attribute name="invisible"/></rng:optional> + <rng:optional><rng:attribute name="name" /></rng:optional> + <rng:optional><rng:attribute name="icon" /></rng:optional> + <rng:optional><rng:attribute name="string" /></rng:optional> + <rng:optional><rng:attribute name="states" /></rng:optional> + <rng:optional><rng:attribute name="type" /></rng:optional> + <rng:optional><rng:attribute name="special" /></rng:optional> + <rng:optional><rng:attribute name="align" /></rng:optional> + <rng:optional><rng:attribute name="colspan"/></rng:optional> + <rng:optional><rng:attribute name="target"/></rng:optional> + <rng:optional><rng:attribute name="readonly"/></rng:optional> + <rng:optional><rng:attribute name="context"/></rng:optional> + <rng:optional><rng:attribute name="confirm"/></rng:optional> + <rng:optional><rng:attribute name="help"/></rng:optional> + <rng:optional><rng:attribute name="class"/></rng:optional> + <rng:optional><rng:attribute name="default_focus"/></rng:optional> + <rng:zeroOrMore> + <rng:choice> + <rng:ref name="field" /> + <rng:ref name="xpath" /> + <rng:ref name="separator"/> + <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:element> + </rng:define> + + <rng:define name="filter"> + <rng:element name="filter"> + <rng:ref name="overload"/> + <rng:ref name="access_rights"/> + <rng:ref name="modifiable"/> + <rng:optional><rng:attribute name="attrs"/></rng:optional> + <rng:optional><rng:attribute name="icon"/></rng:optional> + <rng:optional><rng:attribute name="invisible"/></rng:optional> + <rng:optional><rng:attribute name="name" /></rng:optional> + <rng:optional><rng:attribute name="separator" /></rng:optional> + <rng:optional><rng:attribute name="string" /></rng:optional> + <rng:optional><rng:attribute name="type" /></rng:optional> + <rng:optional><rng:attribute name="align" /></rng:optional> + <rng:optional><rng:attribute name="colspan"/></rng:optional> + <rng:optional><rng:attribute name="readonly"/></rng:optional> + <rng:optional><rng:attribute name="context"/></rng:optional> + <rng:optional><rng:attribute name="help"/></rng:optional> + <rng:optional><rng:attribute name="domain"/></rng:optional> + <rng:zeroOrMore> + <rng:choice> + <rng:ref name="field" /> + <rng:ref name="xpath" /> + <rng:ref name="separator"/> + <rng:ref name="button"/> + <rng:ref name="filter"/> + <rng:ref name="html"/> + <rng:element name="newline"><rng:empty/></rng:element> + </rng:choice> + </rng:zeroOrMore> + + </rng:element> + </rng:define> + +</rng:grammar> diff --git a/odoo/addons/base/rng/diagram_view.rng b/odoo/addons/base/rng/diagram_view.rng new file mode 100644 index 00000000000..9a1b2898727 --- /dev/null +++ b/odoo/addons/base/rng/diagram_view.rng @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:a="http://relaxng.org/ns/annotation/1.0" + datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <!-- Handling of element overloading when inheriting from a base + template + --> + <rng:include href="common.rng"/> + <rng:define name="diagram"> + <rng:element name="diagram"> + <rng:optional><rng:attribute name="create" /></rng:optional> + <rng:optional><rng:attribute name="string"/></rng:optional> + <rng:ref name="node"/> + <rng:ref name="arrow"/> + <rng:zeroOrMore> + <rng:ref name="label"/> + </rng:zeroOrMore> + </rng:element> + </rng:define> + + <rng:define name="node"> + <rng:element name="node"> + <rng:attribute name="object"/> + <rng:optional><rng:attribute name="shape"/></rng:optional> + <rng:optional><rng:attribute name="bgcolor"/></rng:optional> + <rng:optional><rng:attribute name="form_view_ref"/></rng:optional> + <rng:zeroOrMore> + <rng:ref name="field"/> + </rng:zeroOrMore> + </rng:element> + </rng:define> + + <rng:define name="arrow"> + <rng:element name="arrow"> + <rng:attribute name="object" /> + <rng:attribute name="source" /> + <rng:attribute name="destination" /> + <rng:optional><rng:attribute name="form_view_ref"/></rng:optional> + <rng:optional><rng:attribute name="label"/></rng:optional> + <rng:zeroOrMore> + <rng:ref name="field"/> + </rng:zeroOrMore> + </rng:element> + </rng:define> + <rng:start> + <rng:choice> + <rng:ref name="diagram" /> + </rng:choice> + </rng:start> +</rng:grammar> diff --git a/odoo/addons/base/rng/gantt_view.rng b/odoo/addons/base/rng/gantt_view.rng new file mode 100644 index 00000000000..57eece69d8d --- /dev/null +++ b/odoo/addons/base/rng/gantt_view.rng @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:a="http://relaxng.org/ns/annotation/1.0" + datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <!-- Handling of element overloading when inheriting from a base + template + --> + <rng:include href="common.rng"/> + <rng:define name="gantt"> + <rng:element name="gantt"> + <rng:attribute name="date_start"/> + <rng:choice> + <rng:attribute name="date_stop"/> + <rng:attribute name="date_delay"/> + </rng:choice> + <rng:optional><rng:attribute name="progress"/></rng:optional> + <rng:optional><rng:attribute name="string"/></rng:optional> + <rng:optional><rng:attribute name="type"/></rng:optional> + <rng:optional><rng:attribute name="default_group_by"/></rng:optional> + <rng:optional><rng:attribute name="create"/></rng:optional> + <rng:optional><rng:attribute name="delete"/></rng:optional> + <rng:optional><rng:attribute name="edit"/></rng:optional> + <rng:optional><rng:attribute name="fold_last_level"/></rng:optional> + <rng:optional><rng:attribute name="round_dnd_dates"/></rng:optional> + <rng:optional><rng:attribute name="consolidation"/></rng:optional> + <rng:optional><rng:attribute name="consolidation_max"/></rng:optional> + <rng:optional><rng:attribute name="consolidation_exclude"/></rng:optional> + <rng:empty/> + </rng:element> + </rng:define> + <rng:start> + <rng:choice> + <rng:ref name="gantt" /> + </rng:choice> + </rng:start> +</rng:grammar> diff --git a/odoo/addons/base/rng/graph_view.rng b/odoo/addons/base/rng/graph_view.rng new file mode 100644 index 00000000000..577917e5da7 --- /dev/null +++ b/odoo/addons/base/rng/graph_view.rng @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:a="http://relaxng.org/ns/annotation/1.0" + datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <!-- Handling of element overloading when inheriting from a base + template + --> + <rng:include href="common.rng"/> + <rng:define name="graph"> + <rng:element name="graph"> + <rng:optional><rng:attribute name="string" /></rng:optional> + <rng:optional> + <rng:attribute name="type"> + <rng:choice> + <rng:value>bar</rng:value> + <rng:value>pie</rng:value> + <rng:value>line</rng:value> + <rng:value>pivot</rng:value> + </rng:choice> + </rng:attribute> + </rng:optional> + <rng:optional><rng:attribute name="stacked"/></rng:optional> + <rng:optional><rng:attribute name="orientation"/></rng:optional> + <rng:optional><rng:attribute name="interval"/></rng:optional> + <rng:zeroOrMore> + <rng:ref name="field"/> + </rng:zeroOrMore> + </rng:element> + </rng:define> + <rng:start> + <rng:choice> + <rng:ref name="graph" /> + </rng:choice> + </rng:start> +</rng:grammar> diff --git a/odoo/addons/base/rng/pivot_view.rng b/odoo/addons/base/rng/pivot_view.rng new file mode 100644 index 00000000000..98daf5d4b26 --- /dev/null +++ b/odoo/addons/base/rng/pivot_view.rng @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:a="http://relaxng.org/ns/annotation/1.0" + datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <!-- Handling of element overloading when inheriting from a base + template + --> + <rng:include href="common.rng"/> + <rng:define name="pivot"> + <rng:element name="pivot"> + <rng:optional><rng:attribute name="string" /></rng:optional> + <rng:optional><rng:attribute name="stacked"/></rng:optional> + <rng:optional><rng:attribute name="display_quantity"/></rng:optional> + <rng:optional><rng:attribute name="disable_linking"/></rng:optional> + <rng:zeroOrMore> + <rng:ref name="field"/> + </rng:zeroOrMore> + </rng:element> + </rng:define> + <rng:start> + <rng:choice> + <rng:ref name="pivot" /> + </rng:choice> + </rng:start> +</rng:grammar> diff --git a/odoo/addons/base/rng/search_view.rng b/odoo/addons/base/rng/search_view.rng new file mode 100644 index 00000000000..74dc4c89abd --- /dev/null +++ b/odoo/addons/base/rng/search_view.rng @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:a="http://relaxng.org/ns/annotation/1.0" + datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <!-- Handling of element overloading when inheriting from a base + template + --> + <rng:include href="common.rng"/> + <rng:define name="search"> + <rng:element name="search"> + <rng:ref name="overload"/> + <rng:optional><rng:attribute name="string"/></rng:optional> + <rng:zeroOrMore> + <rng:choice> + <rng:ref name="field"/> + <rng:ref name="group"/> + <rng:ref name="separator"/> + <rng:ref name="filter"/> + <rng:element name="newline"><rng:empty/></rng:element> + </rng:choice> + </rng:zeroOrMore> + </rng:element> + </rng:define> + <rng:start> + <rng:choice> + <rng:ref name="search" /> + </rng:choice> + </rng:start> +</rng:grammar> diff --git a/odoo/addons/base/rng/tree_view.rng b/odoo/addons/base/rng/tree_view.rng new file mode 100644 index 00000000000..1dec8e9ab11 --- /dev/null +++ b/odoo/addons/base/rng/tree_view.rng @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:a="http://relaxng.org/ns/annotation/1.0" + datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <!-- Handling of element overloading when inheriting from a base + template + --> + <rng:include href="common.rng"/> + <rng:define name="tree"> + <rng:element name="tree"> + <rng:ref name="overload"/> + <rng:optional><rng:attribute name="name" /></rng:optional> + <rng:optional><rng:attribute name="create" /></rng:optional> + <rng:optional><rng:attribute name="delete" /></rng:optional> + <rng:optional><rng:attribute name="edit" /></rng:optional> + <rng:optional><rng:attribute name="string"/></rng:optional> + <rng:optional><rng:attribute name="duplicate"/></rng:optional> + <rng:optional><rng:attribute name="import"/></rng:optional> + <rng:optional><rng:attribute name="class"/></rng:optional> + <rng:optional><rng:attribute name="colors"/></rng:optional> + <rng:optional><rng:attribute name="fonts"/></rng:optional> + <rng:optional><rng:attribute name="default_order"/></rng:optional> + <rng:optional><rng:attribute name="decoration-bf"/></rng:optional> + <rng:optional><rng:attribute name="decoration-it"/></rng:optional> + <rng:optional><rng:attribute name="decoration-danger"/></rng:optional> + <rng:optional><rng:attribute name="decoration-info"/></rng:optional> + <rng:optional><rng:attribute name="decoration-muted"/></rng:optional> + <rng:optional><rng:attribute name="decoration-primary"/></rng:optional> + <rng:optional><rng:attribute name="decoration-success"/></rng:optional> + <rng:optional><rng:attribute name="decoration-warning"/></rng:optional> + <rng:optional> + <rng:attribute name="limit"> + <rng:data type="int"/> + </rng:attribute> + </rng:optional> + <rng:optional> + <rng:attribute name="editable"> + <rng:choice> + <rng:value>top</rng:value> + <rng:value>bottom</rng:value> + </rng:choice> + </rng:attribute> + <rng:optional><rng:attribute name="on_write"/></rng:optional> + </rng:optional> + <rng:optional> + <rng:attribute name="toolbar"> + <rng:choice> + <rng:value>1</rng:value> + <rng:value>True</rng:value> + </rng:choice> + </rng:attribute> + </rng:optional> + <rng:zeroOrMore> + <rng:choice> + <rng:ref name="field"/> + <rng:ref name="separator"/> + <rng:ref name="tree"/> + <rng:ref name="group"/> + <rng:ref name="button"/> + <rng:ref name="filter"/> + <rng:ref name="html"/> + <rng:element name="newline"><rng:empty/></rng:element> + </rng:choice> + </rng:zeroOrMore> + </rng:element> + </rng:define> + <rng:start> + <rng:choice> + <rng:ref name="tree" /> + </rng:choice> + </rng:start> +</rng:grammar> diff --git a/odoo/addons/base/rng/view.rng b/odoo/addons/base/rng/view.rng deleted file mode 100644 index 3225735ffad..00000000000 --- a/odoo/addons/base/rng/view.rng +++ /dev/null @@ -1,818 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" - xmlns:a="http://relaxng.org/ns/annotation/1.0" - datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> - <!-- Handling of element overloading when inheriting from a base - template - --> - <rng:define name="overload"> - <rng:optional> - <!-- - Alter matched element with content - --> - <rng:choice> - <rng:attribute name="position"> - <rng:choice> - <!-- Insert content before first child --> - <rng:value>before</rng:value> - <!-- Insert content after last child --> - <rng:value>after</rng:value> - <!-- Replace all children with content --> - <rng:value>inside</rng:value> - <!-- Replace matched element itself with content --> - <rng:value>replace</rng:value> - </rng:choice> - </rng:attribute> - <rng:group> - <rng:attribute name="position"> - <!-- Edit element attributes --> - <rng:value>attributes</rng:value> - </rng:attribute> - <rng:oneOrMore> - <rng:element name="attribute"> - <rng:attribute name="name"><rng:text/></rng:attribute> - <rng:text /> - </rng:element> - </rng:oneOrMore> - </rng:group> - </rng:choice> - </rng:optional> - </rng:define> - - <rng:define name="modifiable"> - <rng:optional> - <!-- @modifiers contains a JSON map unifying the various - modifier attributes: @readonly, @required, @invisible. - Each attribute is a key, mapped to a JSON list representing - a condition expressed as an OpenERP `domain` filter - Only some of the modifier keys make sense on some - elements, for example <filter> and <group> only support - `invisible`. --> - <rng:attribute name="modifiers"/> - </rng:optional> - </rng:define> - - <rng:define name="access_rights"> - <rng:optional> - <rng:attribute name="groups"/> - </rng:optional> - </rng:define> - - <rng:define name="dashboard-column"> - <rng:element name="column"> - <rng:zeroOrMore> - <rng:element name="action"> - <!-- Action identifier, used by clients to get the - actual action from db --> - <rng:attribute name="name"/> - <!-- Displayed name of dashboard item (above idem) --> - <rng:optional><rng:attribute name="string"/></rng:optional> - <!-- Merged into the action descriptor's own - context before executing the action --> - <rng:optional><rng:attribute name="context"/></rng:optional> - <!-- Added to the action descriptor's own domain - before executing the action --> - <rng:optional><rng:attribute name="domain"/></rng:optional> - <!-- In case the action is an act_window, - overrides its own @views. --> - <rng:optional><rng:attribute name="view_mode"/></rng:optional> - <!-- Add a 'Create' button in order to create a new resource of the action's model - values : [true|false|<ID of specific action view>]. --> - <rng:optional><rng:attribute name="creatable"/></rng:optional> - </rng:element> - </rng:zeroOrMore> - </rng:element> - </rng:define> - <rng:define name="dashboard"> - <rng:choice> - <rng:element name="board"> - <a:documentation> - New-style (6.1) dashboard definition - </a:documentation> - <rng:choice> - <rng:group> - <a:documentation> - Single-column dashboard style - </a:documentation> - <rng:attribute name="style"> - <rng:value>1</rng:value> - </rng:attribute> - <rng:ref name="dashboard-column"/> - </rng:group> - <rng:group> - <a:documentation> - Three different 2-column dashboard styles: - 50|50, 33|66 and 66|33. - </a:documentation> - <rng:attribute name="style"> - <rng:choice> - <rng:value>1-1</rng:value> - <rng:value>1-2</rng:value> - <rng:value>2-1</rng:value> - </rng:choice> - </rng:attribute> - <rng:ref name="dashboard-column"/> - <rng:ref name="dashboard-column"/> - </rng:group> - <rng:group> - <a:documentation> - Three-column dashboard style: 33|33|33 - </a:documentation> - <rng:attribute name="style"> - <rng:value>1-1-1</rng:value> - </rng:attribute> - <rng:ref name="dashboard-column"/> - <rng:ref name="dashboard-column"/> - <rng:ref name="dashboard-column"/> - </rng:group> - </rng:choice> - </rng:element> - <!-- - DEPRECATED old-style dashboards - --> - <rng:element> - <rng:choice> - <rng:name>hpaned</rng:name> - <rng:name>vpaned</rng:name> - </rng:choice> - <rng:optional> - <rng:attribute name="position"> - <rng:data type="int"/> - </rng:attribute> - </rng:optional> - <rng:zeroOrMore> - <rng:optional><rng:ref name="any"/></rng:optional> - <rng:optional><rng:ref name="html"/></rng:optional> - </rng:zeroOrMore> - </rng:element> - </rng:choice> - </rng:define> - - <rng:define name="container"> - <rng:optional><rng:attribute name="col"/></rng:optional> - <rng:zeroOrMore> - <rng:choice> - <rng:ref name="notebook"/> - <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="form"/> - <rng:ref name="dashboard"/> - <rng:ref name="filter"/> - <rng:ref name="html"/> - <rng:element name="newline"><rng:empty/></rng:element> - <rng:element name="properties"><rng:empty/></rng:element> - </rng:choice> - </rng:zeroOrMore> - </rng:define> - - <rng:define name="form"> - <rng:element name="form"> - <rng:ref name="overload"/> - <rng:optional><rng:attribute name="create" /></rng:optional> - <rng:optional><rng:attribute name="delete" /></rng:optional> - <rng:optional><rng:attribute name="edit" /></rng:optional> - <rng:optional><rng:attribute name="string"/></rng:optional> - <rng:optional><rng:attribute name="type"/></rng:optional> - <rng:optional><rng:attribute name="link"/></rng:optional> - <rng:optional><rng:attribute name="version"/></rng:optional> - <rng:ref name="container"/> - </rng:element> - </rng:define> - - <rng:define name="diagram"> - <rng:element name="diagram"> - <rng:optional><rng:attribute name="create" /></rng:optional> - <rng:optional><rng:attribute name="string"/></rng:optional> - <rng:ref name="node"/> - <rng:ref name="arrow"/> - <rng:zeroOrMore> - <rng:ref name="label"/> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="node"> - <rng:element name="node"> - <rng:attribute name="object"/> - <rng:optional><rng:attribute name="shape"/></rng:optional> - <rng:optional><rng:attribute name="bgcolor"/></rng:optional> - <rng:optional><rng:attribute name="form_view_ref"/></rng:optional> - <rng:oneOrMore> - <rng:ref name="field"/> - </rng:oneOrMore> - </rng:element> - </rng:define> - - <rng:define name="arrow"> - <rng:element name="arrow"> - <rng:attribute name="object" /> - <rng:attribute name="source" /> - <rng:attribute name="destination" /> - <rng:optional><rng:attribute name="form_view_ref"/></rng:optional> - <rng:optional><rng:attribute name="label"/></rng:optional> - <rng:oneOrMore> - <rng:ref name="field"/> - </rng:oneOrMore> - </rng:element> - </rng:define> - - <rng:define name="kanban"> - <rng:element name="kanban"> - <rng:optional> - <!-- group-by field to apply in the kanban view when no other - grouping is selected in the search view --> - <rng:attribute name="default_group_by" /> - </rng:optional> - <rng:optional><rng:attribute name="create" /></rng:optional> - <rng:optional><rng:attribute name="delete" /></rng:optional> - <rng:optional><rng:attribute name="edit" /></rng:optional> - <rng:optional><rng:attribute name="quick_create" /></rng:optional> - <rng:zeroOrMore> - <rng:ref name="field"/> - </rng:zeroOrMore> - <rng:element name="templates"> - <rng:oneOrMore> - <rng:ref name="any"/> - </rng:oneOrMore> - </rng:element> - </rng:element> - </rng:define> - - <rng:define name="tree"> - <rng:element name="tree"> - <rng:ref name="overload"/> - <rng:optional><rng:attribute name="create" /></rng:optional> - <rng:optional><rng:attribute name="delete" /></rng:optional> - <rng:optional><rng:attribute name="edit" /></rng:optional> - <rng:optional><rng:attribute name="string"/></rng:optional> - <rng:optional><rng:attribute name="colors"/></rng:optional> - <rng:optional><rng:attribute name="fonts"/></rng:optional> - <rng:optional><rng:attribute name="decoration-bf"/></rng:optional> - <rng:optional><rng:attribute name="decoration-it"/></rng:optional> - <rng:optional><rng:attribute name="decoration-danger"/></rng:optional> - <rng:optional><rng:attribute name="decoration-info"/></rng:optional> - <rng:optional><rng:attribute name="decoration-muted"/></rng:optional> - <rng:optional><rng:attribute name="decoration-primary"/></rng:optional> - <rng:optional><rng:attribute name="decoration-success"/></rng:optional> - <rng:optional><rng:attribute name="decoration-warning"/></rng:optional> - <rng:optional> - <rng:attribute name="limit"> - <rng:data type="int"/> - </rng:attribute> - </rng:optional> - <rng:optional> - <rng:attribute name="editable"> - <rng:choice> - <rng:value>top</rng:value> - <rng:value>bottom</rng:value> - </rng:choice> - </rng:attribute> - <rng:optional><rng:attribute name="on_write"/></rng:optional> - </rng:optional> - <rng:optional> - <rng:attribute name="toolbar"> - <rng:choice> - <rng:value>1</rng:value> - <rng:value>True</rng:value> - </rng:choice> - </rng:attribute> - </rng:optional> - <rng:zeroOrMore> - <rng:choice> - <rng:ref name="field"/> - <rng:ref name="separator"/> - <rng:ref name="tree"/> - <rng:ref name="group"/> - <rng:ref name="button"/> - <rng:ref name="filter"/> - <rng:ref name="html"/> - <rng:element name="newline"><rng:empty/></rng:element> - </rng:choice> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="search"> - <rng:element name="search"> - <rng:ref name="overload"/> - <rng:optional><rng:attribute name="string"/></rng:optional> - <rng:zeroOrMore> - <rng:choice> - <rng:ref name="field"/> - <rng:ref name="group"/> - <rng:ref name="separator"/> - <rng:ref name="filter"/> - <rng:ref name="search"/> - <rng:element name="newline"><rng:empty/></rng:element> - <rng:element name="properties"><rng:empty/></rng:element> - </rng:choice> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="image"> - <rng:element name="image"> - <rng:attribute name="name"/> - </rng:element> - </rng:define> - - <rng:define name="html"> - <rng:element name="html"> - <rng:zeroOrMore> - <rng:text/> - <rng:ref name="any"/> - </rng:zeroOrMore> - </rng:element> - </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="notebook"/> - <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="form"/> - <rng:ref name="dashboard"/> - <rng:ref name="filter"/> - <rng:ref name="html"/> - <rng:element name="newline"><rng:empty/></rng:element> - <rng:element name="properties"><rng:empty/></rng:element> - </rng:choice> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="gantt"> - <rng:element name="gantt"> - <rng:attribute name="date_start"/> - <rng:choice> - <rng:attribute name="date_stop"/> - <rng:attribute name="date_delay"/> - </rng:choice> - <rng:optional> - <rng:attribute name="progress"> - <rng:data type="int"/> - </rng:attribute> - </rng:optional> - <rng:optional><rng:attribute name="default_group_by"/></rng:optional> - <rng:optional><rng:attribute name="create"/></rng:optional> - <rng:optional><rng:attribute name="delete"/></rng:optional> - <rng:optional><rng:attribute name="edit"/></rng:optional> - <rng:empty/> - </rng:element> - </rng:define> - - <rng:define name="any"> - <rng:element> - <rng:anyName/> - <rng:zeroOrMore> - <rng:choice> - <rng:attribute> - <rng:anyName/> - </rng:attribute> - <rng:text/> - <rng:ref name="any"/> - </rng:choice> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="page"> - <rng:element name="page"> - <rng:ref name="overload"/> - <rng:ref name="access_rights"/> - <rng:ref name="modifiable"/> - <rng:optional><rng:attribute name="string"/></rng:optional> - <rng:optional><rng:attribute name="name"/></rng:optional> - <rng:optional><rng:attribute name="attrs"/></rng:optional> - <rng:optional><rng:attribute name="invisible"/></rng:optional> - <rng:zeroOrMore> - <rng:choice> - <rng:element name="newline"><rng:empty/></rng:element> - <rng:element name="properties"><rng:empty/></rng:element> - <rng:ref name="label" /> - <rng:ref name="field"/> - <rng:ref name="group"/> - <rng:ref name="separator"/> - <rng:ref name="button"/> - <rng:ref name="form" /> - <rng:ref name="page" /> - <rng:ref name="notebook"/> - <rng:ref name="dashboard"/> - <rng:ref name="filter"/> - <rng:ref name="html"/> - </rng:choice> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="notebook"> - <rng:element name="notebook"> - <rng:ref name="overload"/> - <rng:optional><rng:attribute name="colspan"/></rng:optional> - <rng:optional> - <rng:attribute name="tabpos"> - <!-- position of the notebook's tabs bar, support is - optional and implementation-dependent --> - <rng:choice> - <rng:value>up</rng:value> - <rng:value>down</rng:value> - <rng:value>left</rng:value> - <rng:value>right</rng:value> - </rng:choice> - </rng:attribute> - </rng:optional> - <rng:oneOrMore> - <rng:ref name="page"/> - </rng:oneOrMore> - </rng:element> - </rng:define> - - <rng:define name="separator"> - <rng:element name="separator"> - <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="name"/></rng:optional> - <rng:optional><rng:attribute name="colspan"/></rng:optional> - <rng:optional><rng:attribute name="rowspan"/></rng:optional> - <rng:optional><rng:attribute name="string"/></rng:optional> - <rng:optional><rng:attribute name="col"/></rng:optional> - <rng:optional><rng:attribute name="select"/></rng:optional> - <rng:optional><rng:attribute name="orientation"/></rng:optional> - <rng:zeroOrMore> - <rng:choice> - <rng:ref name="separator"/> - <rng:ref name="button"/> - <rng:ref name="field"/> - <rng:ref name="label" /> - <rng:ref name="group" /> - <rng:ref name="filter"/> - <rng:ref name="html"/> - <rng:element name="properties"><rng:empty/></rng:element> - <rng:element name="newline"><rng:empty/></rng:element> - </rng:choice> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="xpath"> - <rng:element name="xpath"> - <rng:optional><rng:attribute name="expr"/></rng:optional> - <rng:ref name="overload"/> - <rng:zeroOrMore> - <rng:choice> - <rng:ref name="any"/> - <rng:ref name="button"/> - <rng:ref name="html"/> - </rng:choice> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="data"> - <rng:element name="data"> - <rng:zeroOrMore> - <rng:choice> - <rng:ref name="form"/> - <rng:ref name="tree"/> - <rng:ref name="field"/> - <rng:ref name="label"/> - <rng:ref name="separator"/> - <rng:ref name="notebook"/> - <rng:ref name="page"/> - <rng:ref name="xpath"/> - <rng:ref name="button"/> - <rng:ref name="group"/> - <rng:ref name="filter"/> - <rng:ref name="graph"/> - <rng:ref name="html"/> - <rng:element name="newline"><rng:empty/></rng:element> - </rng:choice> - </rng:zeroOrMore> - </rng:element> - </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="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="default_get"/></rng:optional> - <rng:optional><rng:attribute name="required"/></rng:optional> - <rng:optional><rng:attribute name="readonly"/></rng:optional> - <rng:optional><rng:attribute name="force_save"/></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> - <!-- 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="diagram"/> - <rng:ref name="kanban"/> - <rng:ref name="form"/> - <rng:ref name="data"/> - <rng:ref name="tree"/> - <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="graph"/> - <rng:ref name="filter"/> - <rng:ref name="notebook"/> - <rng:ref name="html"/> - <rng:element name="newline"><rng:empty/></rng:element> - </rng:choice> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="group"> - <rng:element name="group"> - <rng:ref name="overload"/> - <rng:ref name="access_rights"/> - <rng:ref name="modifiable"/> - <rng:optional><rng:attribute name="attrs"/></rng:optional> - <rng:optional><rng:attribute name="colspan"/></rng:optional> - <rng:optional><rng:attribute name="rowspan"/></rng:optional> - <rng:optional><rng:attribute name="expand"/></rng:optional> - <rng:optional><rng:attribute name="states"/></rng:optional> - <rng:optional><rng:attribute name="string"/></rng:optional> - <rng:optional><rng:attribute name="fill"/></rng:optional> - <rng:optional><rng:attribute name="height"/></rng:optional> - <rng:optional><rng:attribute name="width"/></rng:optional> - <rng:optional><rng:attribute name="name"/></rng:optional> - <rng:optional><rng:attribute name="color" /></rng:optional> - <rng:optional><rng:attribute name="invisible"/></rng:optional> - <rng:ref name="container"/> - </rng:element> - </rng:define> - - <rng:define name="calendar"> - <rng:element name="calendar"> - <rng:optional><rng:attribute name="string" /></rng:optional> - <rng:optional><rng:attribute name="date_start" /></rng:optional> - <rng:optional><rng:attribute name="date_stop" /></rng:optional> - <rng:optional><rng:attribute name="date_delay" /></rng:optional> - <rng:optional><rng:attribute name="all_day" /></rng:optional> - <rng:optional><rng:attribute name="readonly_form_view_id" /></rng:optional> - <rng:optional><rng:attribute name="form_view_id" /></rng:optional> - <rng:optional><rng:attribute name="event_limit" /></rng:optional> - <rng:optional><rng:attribute name="quick_add" /></rng:optional> - <rng:optional><rng:attribute name="color" /></rng:optional> - <rng:optional><rng:attribute name="event_open_popup" /></rng:optional> - <rng:optional> - <rng:attribute name="mode"> - <rng:choice> - <rng:value>month</rng:value> - <rng:value>week</rng:value> - <rng:value>day</rng:value> - </rng:choice> - </rng:attribute> - </rng:optional> - <rng:zeroOrMore> - <rng:element name="field"> - <rng:attribute name="name" /> - <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> - </rng:element> - </rng:zeroOrMore> - <rng:optional> - <rng:element name="template"> - <rng:oneOrMore> - <rng:ref name="any"/> - </rng:oneOrMore> - </rng:element> - </rng:optional> - </rng:element> - </rng:define> - - <rng:define name="graph"> - <rng:element name="graph"> - <rng:optional><rng:attribute name="string" /></rng:optional> - <rng:optional> - <rng:attribute name="type"> - <rng:choice> - <rng:value>bar</rng:value> - <rng:value>pie</rng:value> - <rng:value>line</rng:value> - <rng:value>pivot</rng:value> - </rng:choice> - </rng:attribute> - </rng:optional> - <rng:optional> - <rng:attribute name="stacked"><rng:value>True</rng:value></rng:attribute> - </rng:optional> - <rng:zeroOrMore> - <rng:ref name="field"/> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="pivot"> - <rng:element name="pivot"> - <rng:optional><rng:attribute name="string" /></rng:optional> - <rng:optional> - <rng:attribute name="display_quantity"><rng:value>False</rng:value></rng:attribute> - </rng:optional> - <rng:optional> - <rng:attribute name="disable_linking"><rng:value>False</rng:value></rng:attribute> - </rng:optional> - <rng:zeroOrMore> - <rng:ref name="field"/> - </rng:zeroOrMore> - </rng:element> - </rng:define> - - <rng:define name="button"> - <rng:element name="button"> - <rng:ref name="overload"/> - <rng:ref name="access_rights"/> - <rng:ref name="modifiable"/> - <rng:optional><rng:attribute name="attrs"/></rng:optional> - <rng:optional><rng:attribute name="invisible"/></rng:optional> - <rng:optional><rng:attribute name="name" /></rng:optional> - <rng:optional><rng:attribute name="icon" /></rng:optional> - <rng:optional><rng:attribute name="string" /></rng:optional> - <rng:optional><rng:attribute name="states" /></rng:optional> - <rng:optional><rng:attribute name="type" /></rng:optional> - <rng:optional><rng:attribute name="special" /></rng:optional> - <rng:optional><rng:attribute name="align" /></rng:optional> - <rng:optional><rng:attribute name="colspan"/></rng:optional> - <rng:optional><rng:attribute name="target"/></rng:optional> - <rng:optional><rng:attribute name="readonly"/></rng:optional> - <rng:optional><rng:attribute name="context"/></rng:optional> - <rng:optional><rng:attribute name="confirm"/></rng:optional> - <rng:optional><rng:attribute name="help"/></rng:optional> - <rng:optional><rng:attribute name="class"/></rng:optional> - <rng:optional><rng:attribute name="default_focus"/></rng:optional> - <rng:zeroOrMore> - <rng:choice> - <rng:ref name="form" /> - <rng:ref name="field" /> - <rng:ref name="tree" /> - <rng:ref name="notebook" /> - <rng:ref name="graph" /> - <rng:ref name="calendar" /> - <rng:ref name="gantt" /> - <rng:ref name="xpath" /> - <rng:ref name="page" /> - <rng:ref name="separator"/> - <rng:ref name="button"/> - <rng:ref name="group"/> - <rng:ref name="filter"/> - <rng:ref name="html"/> - <rng:element name="properties"><rng:empty/></rng:element> - <rng:element name="newline"><rng:empty/></rng:element> - </rng:choice> - </rng:zeroOrMore> - - </rng:element> - </rng:define> - - <rng:define name="filter"> - <rng:element name="filter"> - <rng:ref name="overload"/> - <rng:ref name="access_rights"/> - <rng:ref name="modifiable"/> - <rng:optional><rng:attribute name="attrs"/></rng:optional> - <rng:optional><rng:attribute name="invisible"/></rng:optional> - <rng:optional><rng:attribute name="name" /></rng:optional> - <rng:optional><rng:attribute name="separator" /></rng:optional> - <rng:optional><rng:attribute name="string" /></rng:optional> - <rng:optional><rng:attribute name="type" /></rng:optional> - <rng:optional><rng:attribute name="align" /></rng:optional> - <rng:optional><rng:attribute name="colspan"/></rng:optional> - <rng:optional><rng:attribute name="readonly"/></rng:optional> - <rng:optional><rng:attribute name="context"/></rng:optional> - <rng:optional><rng:attribute name="help"/></rng:optional> - <rng:optional><rng:attribute name="domain"/></rng:optional> - <rng:zeroOrMore> - <rng:choice> - <rng:ref name="form" /> - <rng:ref name="field" /> - <rng:ref name="tree" /> - <rng:ref name="notebook" /> - <rng:ref name="graph" /> - <rng:ref name="pivot" /> - <rng:ref name="calendar" /> - <rng:ref name="gantt" /> - <rng:ref name="xpath" /> - <rng:ref name="page" /> - <rng:ref name="separator"/> - <rng:ref name="button"/> - <rng:ref name="filter"/> - <rng:ref name="html"/> - <rng:element name="properties"><rng:empty/></rng:element> - <rng:element name="newline"><rng:empty/></rng:element> - </rng:choice> - </rng:zeroOrMore> - - </rng:element> - </rng:define> - - <rng:start> - <rng:choice> - <rng:ref name="diagram" /> - <rng:ref name="kanban" /> - <rng:ref name="form" /> - <rng:ref name="search" /> - <rng:ref name="group" /> - <rng:ref name="field" /> - <rng:ref name="tree" /> - <rng:ref name="notebook" /> - <rng:ref name="graph" /> - <rng:ref name="pivot" /> - <rng:ref name="calendar" /> - <rng:ref name="data" /> - <rng:ref name="gantt" /> - <rng:ref name="xpath" /> - <rng:ref name="page" /> - <rng:ref name="separator"/> - <rng:ref name="button"/> - <rng:ref name="filter"/> - <rng:ref name="label" /> - <rng:ref name="html"/> - </rng:choice> - </rng:start> -</rng:grammar> diff --git a/odoo/addons/base/tests/test_views.py b/odoo/addons/base/tests/test_views.py index aba01b0aa32..bac723c1773 100644 --- a/odoo/addons/base/tests/test_views.py +++ b/odoo/addons/base/tests/test_views.py @@ -681,7 +681,7 @@ class TestViews(ViewCase): 'name': "bob", 'model': 'ir.ui.view', 'arch': """ - <form string="Base title" version="7.0"> + <form string="Base title"> <separator name="separator" string="Separator" colspan="4"/> <footer> <button name="action_next" type="object" string="Next button" class="btn-primary"/> @@ -696,7 +696,7 @@ class TestViews(ViewCase): 'inherit_id': view1.id, 'arch': """ <data> - <form position="attributes" version="7.0"> + <form position="attributes"> <attribute name="string">Replacement title</attribute> </form> <footer position="replace"> @@ -739,7 +739,7 @@ class TestViews(ViewCase): E.button(name="action_next", type="object", string="New button"), thing="bob lolo bibi and co", otherthing="lolo" ), - string="Replacement title", version="7.0")) + string="Replacement title")) def test_view_inheritance_text_inside(self): """ Test view inheritance when adding elements and text. """ @@ -806,7 +806,7 @@ class TestViews(ViewCase): 'name': "bob", 'model': 'ir.ui.view.custom', 'arch': """ - <form string="Base title" version="7.0"> + <form string="Base title"> <separator name="separator" string="Separator" colspan="4"/> <footer> <button name="action_next" type="object" string="Next button" class="btn-primary"/> @@ -821,7 +821,7 @@ class TestViews(ViewCase): 'inherit_id': view1.id, 'arch': """ <data> - <form position="attributes" version="7.0"> + <form position="attributes"> <attribute name="string">Replacement title</attribute> </form> <footer position="replace"> @@ -859,7 +859,7 @@ class TestViews(ViewCase): E.p("Replacement data"), E.footer( E.button(name="action_next", type="object", string="New button")), - string="Replacement title", version="7.0" + string="Replacement title" )) def test_modifiers(self): diff --git a/odoo/addons/test_exceptions/view.xml b/odoo/addons/test_exceptions/view.xml index 70827656903..dd0aa97b7f1 100644 --- a/odoo/addons/test_exceptions/view.xml +++ b/odoo/addons/test_exceptions/view.xml @@ -6,102 +6,99 @@ <field name="name">Test exceptions</field> <field name="model">test.exceptions.model</field> <field name="arch" type="xml"> - <form string="Test exceptions" version="6.1"> + <form string="Test exceptions"> <label string="Each button generates a specific exception on the server. The text on the right is the expected representation of the exception when displayed on the client. Button marked with a '*' use safe_eval()."/> - <separator string="" colspan="8"/> - <group colspan="8" col="8"> - <group colspan="4" col="8"> - <group colspan="8" col="8"> - <button name="generate_except_osv" string="except_osv" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_except_orm" string="except_orm" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_warning" string="Warning" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_redirect_warning" string="RedirectWarning" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description-redirection button"/> - </group> - <group colspan="8" col="8"> - <button name="generate_access_denied" string="AccessDenied" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Access denied-traceback"/> - </group> - <group colspan="8" col="8"> - <button name="generate_access_error" string="AccessError" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Access rights error-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_exc_access_denied" string="Exc AccessDenied" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Access denied-traceback"/> - </group> - <group colspan="8" col="8"> - <button name="generate_undefined" string="Undefined" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Server error-traceback"/> - </group> - <group colspan="8" col="8"> - <button name="generate_user_error" string="UserError" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_missing_error" string="MissingError" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Missing Error-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_validation_error" string="ValidationError" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Validation Error-description"/> - </group> - </group> - <group colspan="4" col="8"> - <group colspan="8" col="8"> - <button name="generate_except_osv_safe_eval" string="except_osv*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_except_orm_safe_eval" string="except_orm*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_warning_safe_eval" string="Warning*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_redirect_warning_safe_eval" string="RedirectWarning*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description-redirection button"/> - </group> - <group colspan="8" col="8"> - <button name="generate_access_denied_safe_eval" string="AccessDenied*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Access denied-traceback"/> - </group> - <group colspan="8" col="8"> - <button name="generate_access_error_safe_eval" string="AccessError*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Access rights error-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_exc_access_denied_safe_eval" string="Exc AccessDenied*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Access denied-traceback"/> - </group> - <group colspan="8" col="8"> - <button name="generate_undefined_safe_eval" string="Undefined*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Server error-traceback"/> - </group> - <group colspan="8" col="8"> - <button name="generate_user_error_safe_eval" string="UserError*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Warning-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_missing_error_safe_eval" string="MissingError*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Missing Error-description"/> - </group> - <group colspan="8" col="8"> - <button name="generate_validation_error_safe_eval" string="ValidationError*" type="object" icon="fa-refresh text-primary" colspan="1"/> - <label string="Validation Error-description"/> - </group> - </group> + <separator/> + <group> + <div> + <button name="generate_except_osv" string="except_osv" type="object" icon="fa-refresh text-primary" /> + <label string="Warning-description"/> + </div> + <div> + <button name="generate_except_orm" string="except_orm" type="object" icon="fa-refresh text-primary"/> + <label string="Warning-description"/> + </div> + <div> + <button name="generate_warning" string="Warning" type="object" icon="fa-refresh text-primary"/> + <label string="Warning-description"/> + </div> + <div> + <button name="generate_redirect_warning" string="RedirectWarning" type="object" icon="fa-refresh text-primary"/> + <label string="Warning-description-redirection button"/> + </div> + <div> + <button name="generate_access_denied" string="AccessDenied" type="object" icon="fa-refresh text-primary"/> + <label string="Access denied-traceback"/> + </div> + <div> + <button name="generate_access_error" string="AccessError" type="object" icon="fa-refresh text-primary"/> + <label string="Access rights error-description" class="oe_inline"/> + </div> + <div> + <button name="generate_exc_access_denied" string="Exc AccessDenied" type="object" icon="fa-refresh text-primary"/> + <label string="Access denied-traceback"/> + </div> + <div> + <button name="generate_undefined" string="Undefined" type="object" icon="fa-refresh text-primary"/> + <label string="Server error-traceback"/> + </div> + <div> + <button name="generate_user_error" string="UserError" type="object" icon="fa-refresh text-primary"/> + <label string="Warning-description"/> + </div> + <div> + <button name="generate_missing_error" string="MissingError" type="object" icon="fa-refresh text-primary"/> + <label string="Missing Error-description"/> + </div> + <div> + <button name="generate_validation_error" string="ValidationError" type="object" icon="fa-refresh text-primary"/> + <label string="Validation Error-description"/> + </div> + + <div> + <button name="generate_except_osv_safe_eval" string="except_osv*" type="object" icon="fa-refresh text-primary"/> + <label string="Warning-description"/> + </div> + <div> + <button name="generate_except_orm_safe_eval" string="except_orm*" type="object" icon="fa-refresh text-primary"/> + <label string="Warning-description"/> + </div> + <div> + <button name="generate_warning_safe_eval" string="Warning*" type="object" icon="fa-refresh text-primary"/> + <label string="Warning-description"/> + </div> + <div> + <button name="generate_redirect_warning_safe_eval" string="RedirectWarning*" type="object" icon="fa-refresh text-primary"/> + <label string="Warning-description-redirection button" class="oe_inline"/> + </div> + <div> + <button name="generate_access_denied_safe_eval" string="AccessDenied*" type="object" icon="fa-refresh text-primary"/> + <label string="Access denied-traceback"/> + </div> + <div> + <button name="generate_access_error_safe_eval" string="AccessError*" type="object" icon="fa-refresh text-primary"/> + <label string="Access rights error-description"/> + </div> + <div> + <button name="generate_exc_access_denied_safe_eval" string="Exc AccessDenied*" type="object" icon="fa-refresh text-primary"/> + <label string="Access denied-traceback"/> + </div> + <div> + <button name="generate_undefined_safe_eval" string="Undefined*" type="object" icon="fa-refresh text-primary"/> + <label string="Server error-traceback"/> + </div> + <div> + <button name="generate_user_error_safe_eval" string="UserError*" type="object" icon="fa-refresh text-primary"/> + <label string="Warning-description"/> + </div> + <div> + <button name="generate_missing_error_safe_eval" string="MissingError*" type="object" icon="fa-refresh text-primary"/> + <label string="Missing Error-description"/> + </div> + <div> + <button name="generate_validation_error_safe_eval" string="ValidationError*" type="object" icon="fa-refresh text-primary"/> + <label string="Validation Error-description"/> + </div> </group> </form> </field> diff --git a/odoo/addons/test_new_api/views.xml b/odoo/addons/test_new_api/views.xml index 149212b9f97..c78be2e09e0 100644 --- a/odoo/addons/test_new_api/views.xml +++ b/odoo/addons/test_new_api/views.xml @@ -40,7 +40,7 @@ <field name="model">test_new_api.discussion</field> <field name="priority" eval="1"/> <field name="arch" type="xml"> - <form string="Discussion" version="7.0"> + <form string="Discussion"> <sheet> <group> <field name="name"/> @@ -59,7 +59,7 @@ <field name="body"/> <field name="important"/> </tree> - <form string="Message" version="7.0"> + <form string="Message"> <group> <field name="name"/> <field name="author"/> @@ -79,7 +79,7 @@ <field name="important"/> <field name="email_to"/> </tree> - <form string="Important Message" version="7.0"> + <form string="Important Message"> <group> <field name="name"/> <field name="author"/> @@ -114,7 +114,7 @@ <field name="model">test_new_api.discussion</field> <field name="priority" eval="10"/> <field name="arch" type="xml"> - <form string="Discussion" version="7.0"> + <form string="Discussion"> <sheet> <group> <field name="name"/> @@ -158,7 +158,7 @@ <field name="model">test_new_api.discussion</field> <field name="priority" eval="11"/> <field name="arch" type="xml"> - <form string="Discussion" version="7.0"> + <form string="Discussion"> <sheet> <group> <field name="name" context="{'generate_dummy_message': True}"/> @@ -207,7 +207,7 @@ <field name="name">message form view</field> <field name="model">test_new_api.message</field> <field name="arch" type="xml"> - <form string="Message" version="7.0"> + <form string="Message"> <sheet> <group> <field name="discussion"/> @@ -238,7 +238,7 @@ <field name="name">category form view</field> <field name="model">test_new_api.category</field> <field name="arch" type="xml"> - <form string="Category" version="7.0"> + <form string="Category"> <sheet> <group> <field name="name"/> @@ -267,7 +267,7 @@ <field name="name">multi form view</field> <field name="model">test_new_api.multi</field> <field name="arch" type="xml"> - <form string="Multi" version="7.0"> + <form string="Multi"> <sheet> <group> <field name="name"/> diff --git a/odoo/tools/view_validation.py b/odoo/tools/view_validation.py index 40a85f18ccd..1ffdd43e58b 100644 --- a/odoo/tools/view_validation.py +++ b/odoo/tools/view_validation.py @@ -2,11 +2,17 @@ import collections import logging +import os + +from lxml import etree +from odoo import tools _logger = logging.getLogger(__name__) _validators = collections.defaultdict(list) +_relaxng_cache = {} + def valid_view(arch): for pred in _validators[arch.tag]: if not pred(arch): @@ -25,6 +31,31 @@ def validate(*view_types): return decorator +def relaxng(view_type): + """ Return a validator for the given view type, or None. """ + if view_type not in _relaxng_cache: + with tools.file_open(os.path.join('base', 'rng', '%s_view.rng' % view_type)) as frng: + try: + relaxng_doc = etree.parse(frng) + _relaxng_cache[view_type] = etree.RelaxNG(relaxng_doc) + except Exception: + _logger.exception('Failed to load RelaxNG XML schema for views validation') + _relaxng_cache[view_type] = None + return _relaxng_cache[view_type] + + +@validate('calendar', 'diagram', 'gantt', 'graph', 'pivot', 'search', 'tree') +def schema_valid(arch): + """ Get RNG validator and validate RNG file.""" + validator = relaxng(arch.tag) + if validator and not validator.validate(arch): + result = True + for error in validator.error_log: + _logger.error(tools.ustr(error)) + result = False + return result + return True + @validate('form') def valid_page_in_book(arch): """A `page` node must be below a `notebook` node.""" |
