[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.
This commit is contained in:
committed by
Raphael Collet
parent
93d4da977a
commit
70942e4cfb
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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):
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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."""
|
||||
|
||||
Reference in New Issue
Block a user