9 As all data of the program is stored in objects, as explained in the Objects
10 section, how are these objects exposed to the user ? We will try to answer this
11 question in this section.
13 First of all, let's note that every resource type uses its own interface. For
14 example, the screen to modify a partner's data is not the same as the one to
17 Then, you have to know that the OpenERP user interface is dynamic, it means
18 that it is not described "statically" by some code, but dynamically built from
19 XML descriptions of the client screens.
21 From now on, we will call these screen descriptions views.
23 A notable characteristic of these views is that they can be edited at any
24 moment (even during the program execution). After a modification to a displayed
25 view has occurred, you simply need to close the tab corresponding to that
26 'view' and re-open it for the changes to appear.
31 Views describe how each object (type of resource) is displayed. More precisely, for each object, we can define one (or several) view(s) to describe which fields should be drawn and how.
33 There are two types of views:
38 .. note:: Since OpenERP 4.1, form views can also contain graphs.
44 The field disposition in a form view always follows the same principle. Fields are distributed on the screen following the rules below:
46 * By default, each field is preceded by a label, with its name.
47 * Fields are placed on the screen from left to right, and from top to bottom, according to the order in which they are declared in the view.
48 * Every screen is divided into 4 columns, each column being able to contain either a label, or an "edition" field. As every edition field is preceded (by default) by a label with its name, there will be two fields (and their respective labels) on each line of the screen. The green and red zones on the screen-shot below, illustrate those 4 columns. They designate respectively the labels and their corresponding fields.
50 .. .. figure:: images/sale_order.png
55 Views also support more advanced placement options:
57 * A view field can use several columns. For example, on the screen-shot below, the zone in the blue frame is, in fact, the only field of a "one to many". We will come back later on this note, but let's note that it uses the whole width of the screen and not only one column.
59 .. .. figure:: images/sale_order_sale_order_lines.png
63 * We can also make the opposite operation: take a columns group and divide it in as many columns as desired. The surrounded green zones of the screen above are good examples. Precisely, the green framework up and on the right side takes the place of two columns, but contains 4 columns.
65 As we can see below in the purple zone of the screen, there is also a way to distribute the fields of an object on different tabs.
67 .. .. figure:: images/sale_order_notebook.png
74 The on_change attribute defines a method that is called when the content of a view field has changed.
76 This method takes at least arguments: cr, uid, ids, which are the three classical arguments and also the context dictionary. You can add parameters to the method. They must correspond to other fields defined in the view, and must also be defined in the XML with fields defined this way::
78 <field name="name_of_field" on_change="name_of_method(other_field'_1_', ..., other_field'_n_')"/>
80 The example below is from the sale order view.
82 You can use the 'context' keyword to access data in the context that can be used as params of the function.::
84 <field name="shop_id" on_change="onchange_shop_id(shop_id)"/>
86 .. code-block:: python
88 def onchange_shop_id(self, cr, uid, ids, shop_id):
93 shop=self.pool.get('sale.shop').browse(cr,uid,shop_id)
94 v['project_id']=shop.project_id.id
95 if shop.pricelist_id.id:
97 v['pricelist_id']=shop.pricelist_id.id
99 v['payment_default_id']=shop.payment_default_id.id
104 When editing the shop_id form field, the onchange_shop_id method of the sale_order object is called and returns a dictionary where the 'value' key contains a dictionary of the new value to use in the 'project_id', 'pricelist_id' and 'payment_default_id' fields.
106 Note that it is possible to change more than just the values of
107 fields. For example, it is possible to change the value of some fields
108 and the domain of other fields by returning a value of the form:
109 return {'domain': d, 'value': value}
111 :returns: a dictionary with any mix of the following keys:
114 A mapping of ``{field: domain}``.
116 The returned domains should be set on the fields instead of the
120 A mapping of ``{field: value}}``, the values will be set on the
121 corresponding fields and may trigger new onchanges or attrs
124 ``warning`` A dict with the keys ``title`` and ``message``. Both
125 are mandatory. Indicate that an error message should be
126 displayed to the user.
132 These views are used when we work in list mode (in order to visualize several resources at once) and in the search screen. These views are simpler than the form views and thus have less options.
134 .. .. figure:: images/tree_view.png
141 Search views are a new feature of OpenERP supported as of version 6.0
142 It creates a customized search panel, and is declared quite similarly to a form view,
143 except that the view type and root element change to ``search`` instead of ``form``.
145 .. .. image:: images/search.png
149 Following is the list of new elements and features supported in search views.
154 Unlike form group elements, search view groups support unlimited number of widget(fields or filters)
155 in a row (no automatic line wrapping), and only use the following attributes:
157 + ``expand``: turns on the expander icon on the group (1 for expanded by default, 0 for collapsed)
158 + ``string``: label for the group
162 <group expand="1" string="Group By...">
163 <filter string="Users" icon="terp-project" domain="[]" context="{'group_by':'user_id'}"/>
164 <filter string="Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
165 <separator orientation="vertical"/>
166 <filter string="Deadline" icon="terp-project" domain="[]" context="{'group_by':'date_deadline'}"/>
169 In the screenshot above the green area is an expandable group.
173 Filters are displayed as a toggle button on search panel
174 Filter elements can add new values in the current domain or context of the search view.
175 Filters can be added as a child element of field too, to indicate that they apply specifically
176 to that field (in this case the button's icon will smaller)
178 In the picture above the red area contains filters at the top of the form while
179 the blue area highlights a field and it's child filter.
183 <filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Tasks" icon="terp-project"/>
184 <field name="project_id" select="1" widget="selection">
185 <filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-project"/>
193 <filter string="Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
195 Above filters groups records sharing the same ``project_id`` value. Groups are loaded
196 lazily, so the inner records are only loaded when the group is expanded.
197 The group header lines contain the common values for all records in that group, and all numeric
198 fields currently displayed in the view are replaced by the sum of the values in that group.
200 It is also possible to group on multiple values by specifying a list of fields instead of a single string.
201 In this case nested groups will be displayed::
203 <filter string="Project" icon="terp-project" domain="[]" context="{'group_by': ['project_id', 'user_id'] }"/>
208 Field elements in search views are used to get user-provided values
209 for searches. As a result, as for group elements, they are quite
210 different than form view's fields:
212 * a search field can contain filters, which generally indicate that
213 both field and filter manage the same field and are related.
215 Those inner filters are rendered as smaller buttons, right next to
216 the field, and *must not* have a ``string`` attribute.
218 * a search field really builds a domain composed of ``[(field_name,
219 operator, field_value)]``. This domain can be overridden in two
222 * ``@operator`` replaces the default operator for the field (which
225 * ``@filter_domain`` lets you provide a fully custom domain, which
226 will replace the default domain creation
228 * a search field does not create a context by default, but you can
229 provide an ``@context`` which will be evaluated and merged into the
230 wider context (as with a ``filter`` element).
232 To get the value of the field in your ``@context`` or
233 ``@filter_domain``, you can use the variable ``self``:
237 <field name="location_id" string="Location"
238 filter_domain="['|',('location_id','ilike',self),('location_dest_id','ilike',self)]"/>
244 <field name="journal_id" widget="selection"
245 context="{'journal_id':self, 'visible_id':self, 'normal_view':False}"/>
247 Range fields (date, datetime, time)
248 """""""""""""""""""""""""""""""""""
250 The range fields are composed of two input widgets (from and two)
253 This leads to peculiarities (compared to non-range search fields):
255 * It is not possible to override the operator of a range field via
256 ``@operator``, as the domain is built of two sections and each
257 section uses a different operator.
259 * Instead of being a simple value (integer, string, float) ``self``
260 for use in ``@filter_domain`` and ``@context`` is a ``dict``.
262 Because each input widget of a range field can be empty (and the
263 field itself will still be valid), care must be taken when using
264 ``self``: it has two string keys ``"from"`` and ``"to"``, but any of
265 these keys can be either missing entirely or set to the value
268 Actions for Search view
269 +++++++++++++++++++++++
271 After declaring a search view, it will be used automatically for all tree views on the same model.
272 If several search views exist for a single model, the one with the highest priority (lowest sequence) will
273 be used. Another option is to explicitly select the search view you want to use, by setting the
274 ``search_view_id`` field of the action.
276 In addition to being able to pass default form values in the context of the action, OpenERP 6.0 now
277 supports passing initial values for search views too, via the context. The context keys need to match the
278 ``search_default_XXX`` format. ``XXX`` may refer to the ``name`` of a ``<field>`` or ``<filter>``
279 in the search view (as the ``name`` attribute is not required on filters, this only works for filters that have
280 an explicit ``name`` set). The value should be either the initial value for search fields, or
281 simply a boolean value for filters, to toggle them
285 <record id="action_view_task" model="ir.actions.act_window">
286 <field name="name">Tasks</field>
287 <field name="res_model">project.task</field>
288 <field name="view_type">form</field>
289 <field name="view_mode">tree,form,calendar,gantt,graph</field>
290 <field eval="False" name="filter"/>
291 <field name="view_id" ref="view_task_tree2"/>
292 <field name="context">{"search_default_current":1,"search_default_user_id":uid}</field>
293 <field name="search_view_id" ref="view_task_search_form"/>
299 As of v6.0, all search views also features custom search filters, as show below.
300 Users can define their own custom filters using any of the fields available on the current model,
301 combining them with AND/OR operators. It is also possible to save any search context (the combination
302 of all currently applied domain and context values) as a personal filter, which can be recalled
303 at any time. Filters can also be turned into Shortcuts directly available in the User's homepage.
305 .. .. image:: images/filter.png
310 In above screenshot we filter Partner where Salesman = Demo user and Country = Belgium,
311 We can save this search criteria as a Shortcut or save as Filter.
313 Filters are user specific and can be modified via the Manage Filters option in the filters drop-down.
319 A graph is a new mode of view for all views of type form. If, for example, a sale order line must be visible as list or as graph, define it like this in the action that open this sale order line. Do not set the view mode as "tree,form,graph" or "form,graph" - it must be "graph,tree" to show the graph first or "tree,graph" to show the list first. (This view mode is extra to your "form,tree" view and should have a separate menu item):
323 <field name="view_type">form</field>
324 <field name="view_mode">tree,graph</field>
328 tree = (tree with shortcuts at the left), form = (switchable view form/list)
332 tree,graph : sequences of the views when switching
334 Then, the user will be able to switch from one view to the other. Unlike forms and trees, OpenERP is not able to automatically create a view on demand for the graph type. So, you must define a view for this graph:
339 <record model="ir.ui.view" id="view_order_line_graph">
340 <field name="name">sale.order.line.graph</field>
341 <field name="model">sale.order.line</field>
342 <field name="type">graph</field>
343 <field name="arch" type="xml">
344 <graph string="Sales Order Lines">
345 <field name="product_id" group="True"/>
346 <field name="price_unit" operator="*"/>
354 A view of type graph is just a list of fields for the graph.
359 The default type of the graph is a pie chart - to change it to a barchart change **<graph string="Sales Order Lines">** to **<graph string="Sales Order Lines" type="bar">** You also may change the orientation.
365 <graph string="Sales Order Lines" orientation="horizontal" type="bar">
370 The first field is the X axis. The second one is the Y axis and the optional third one is the Z axis for 3 dimensional graphs. You can apply a few attributes to each field/axis:
372 * **group**: if set to true, the client will group all item of the same value for this field. For each other field, it will apply an operator
373 * **operator**: the operator to apply is another field is grouped. By default it's '+'. Allowed values are:
378 + min: minimum of the list
379 + max: maximum of the list
381 :Defining real statistics on objects:
383 The easiest method to compute real statistics on objects is:
385 1. Define a statistic object which is a postgresql view
386 2. Create a tree view and a graph view on this object
388 You can get en example in all modules of the form: report\_.... Example: report_crm.
395 Calendar view provides timeline/schedule view for the data.
400 Here is an example view:
404 <calendar color="user_id" date_delay="planned_hours" date_start="date_start" string="Tasks">
406 <field name="project_id"/>
409 Here is the list of supported attributes for ``calendar`` tag:
412 The title string for the view.
415 A ``datetime`` field to specify the starting date for the calendar item. This
416 attribute is required.
419 A ``datetime`` field to specify the end date. Ignored if ``date_delay``
420 attribute is specified.
423 A ``numeric`` field to specify time in hours for a record. This attribute
424 will get preference over ``date_stop`` and ``date_stop`` will be ignored.
427 An ``integer`` value to specify working day length. Default is ``8`` hours.
430 A field, generally ``many2one``, to colorize calendar/gantt items.
433 A string value to set default view/zoom mode. For ``calendar`` view, this can be
434 one of following (default is ``month``):
445 .. .. figure:: images/calendar_month.png
451 .. .. figure:: images/calendar_week.png
459 Gantt view provides timeline view for the data. Generally, it can be used to display
460 project tasks and resource allocation.
462 A Gantt chart is a graphical display of all the tasks that a project is composed of.
463 Each bar on the chart is a graphical representation of the length of time the task is
466 A resource allocation summary bar is shown on top of all the grouped tasks,
467 representing how effectively the resources are allocated among the tasks.
469 Color coding of the summary bar is as follows:
471 * `Gray` shows that the resource is not allocated to any task at that time
472 * `Blue` shows that the resource is fully allocated at that time.
473 * `Red` shows that the resource is overallocated
478 Here is an example view:
482 <gantt color="user_id" date_delay="planned_hours" date_start="date_start" string="Tasks">
483 <level object="project.project" link="project_id" domain="[]">
488 The ``attributes`` accepted by the ``gantt`` tag are similar to ``calendar`` view tag. The
489 ``level`` tag is used to group the records by some ``many2one`` field. Currently, only
490 one level is supported.
492 Here is the list of supported attributes for ``gantt`` tag:
495 The title string for the view.
498 A ``datetime`` field to specify the starting date for the gantt item. This
499 attribute is required.
502 A ``datetime`` field to specify the end date. Ignored if ``date_delay``
503 attribute is specified.
506 A ``numeric`` field to specify time in hours for a record. This attribute
507 will get preference over ``date_stop`` and ``date_stop`` will be ignored.
510 An ``integer`` value to specify working day length. Default is ``8`` hours.
513 A field, generally ``many2one``, to colorize calendar/gantt items.
516 A string value to set default view/zoom mode. For ``gantt`` view, this can be
517 one of following (default is ``month``):
529 The ``level`` tag supports following attributes:
532 An openerp object having many2one relationship with view object.
535 The field name in current object that links to the given ``object``.
538 The domain to be used to filter the given ``object`` records.
543 The left side pane displays list of the tasks grouped by the given ``level`` field.
544 You can reorder or change the group of any records by dragging them.
546 The main content pane displays horizontal bars plotted on a timeline grid. A group
547 of bars are summarized with a top summary bar displaying resource allocation of all
548 the underlying tasks.
550 You can change the task start time by dragging the tasks horizontally. While
551 end time can be changed by dragging right end of a bar.
555 The time is calculated considering ``day_length`` so a bar will span more
556 then one day if total time for a task is greater then ``day_length`` value.
561 .. .. figure:: images/gantt.png
569 The files describing the views are of the form:
575 <?xml version="1.0"?>
582 The view definitions contain mainly three types of tags:
584 * **<record>** tags with the attribute model="ir.ui.view", which contain the view definitions themselves
585 * **<record>** tags with the attribute model="ir.actions.act_window", which link actions to these views
586 * **<menuitem>** tags, which create entries in the menu, and link them with actions
588 New : You can specify groups for whom the menu is accessible using the groups
589 attribute in the `menuitem` tag.
591 New : You can now add shortcut using the `shortcut` tag.
598 name="Draft Purchase Order (Proposals)"
599 model="purchase.order"
603 Note that you should add an id attribute on the `menuitem` which is referred by
608 <record model="ir.ui.view" id="v">
609 <field name="name">sale.order.form</field>
610 <field name="model">sale.order</field>
611 <field name="priority" eval="2"/>
612 <field name="arch" type="xml">
613 <form string="Sale Order">
619 Default value for the priority field : 16. When not specified the system will use the view with the lower priority.
626 You can specify the columns to include in the list, along with some details of
627 the list's appearance. The search fields aren't specified here, they're
628 specified by the `select` attribute in the form view fields.
632 <record id="view_location_tree2" model="ir.ui.view">
633 <field name="name">stock.location.tree</field>
634 <field name="model">stock.location</field>
635 <field name="type">tree</field>
636 <field name="priority" eval="2"/>
637 <field name="arch" type="xml">
639 colors="blue:usage=='view';darkred:usage=='internal'">
641 <field name="complete_name"/>
642 <field name="usage"/>
645 invisible="'product_id' not in context"/>
648 invisible="'product_id' not in context"/>
653 That example is just a flat list, but you can also display a real tree structure
654 by specifying a `field_parent`. The name is a bit misleading, though; the field
655 you specify must contain a list of all **child** entries.
659 <record id="view_location_tree" model="ir.ui.view">
660 <field name="name">stock.location.tree</field>
661 <field name="model">stock.location</field>
662 <field name="type">tree</field>
663 <field name="field_parent">child_ids</field>
664 <field name="arch" type="xml">
666 <field icon="icon" name="name"/>
672 On the `tree` element, the following attributes are supported:
675 Conditions for applying different colors to items in the list. The default
678 Set this to 1 if you want a tree structure to list the top level entries
679 in a separate toolbar area. When you click on an entry in the toolbar, all
680 its descendants will be displayed in the main tree. The value is ignored
689 Adds a separator line
695 <separator string="Links" colspan="4"/>
697 The string attribute defines its label and the colspan attribute defines his horizontal size (in number of columns).
702 <notebook>: With notebooks you can distribute the view fields on different tabs (each one defined by a page tag). You can use the tabpos properties to set tab at: up, down, left, right.
708 <notebook colspan="4">....</notebook>
713 <group>: groups several columns and split the group in as many columns as desired.
715 * **colspan**: the number of columns to use
716 * **rowspan**: the number of rows to use
717 * **expand**: if we should expand the group or not
718 * **col**: the number of columns to provide (to its children)
719 * **string**: (optional) If set, a frame will be drawn around the group of fields, with a label containing the string. Otherwise, the frame will be invisible.
725 <group col="3" colspan="2">
726 <field name="invoiced" select="2"/>
727 <button colspan="1" name="make_invoice" states="confirmed" string="Make Invoice"
734 Defines a new notebook page for the view.
740 <page string="Order Line"> ... </page>:
742 * **string**: defines the name of the page.
750 :guilabel:`attributes for the "field" tag`
752 * ``select="1"``: mark this field as being one of the search criteria for
753 this resource's search view. A value of 1 means that the field is
754 included in the basic search, and a value of 2 means that it is in
757 * ``colspan="4"``: the number of columns on which a field must extend.
759 * ``readonly="1"``: set the widget as read only
761 * ``required="1"``: the field is marked as required. If a field is marked as required, a user has to fill it the system won't save the resource if the field is not filled. This attribute supersede the required field value defined in the object.
763 * ``nolabel="1"``: hides the label of the field (but the field is not hidden in the search view).
765 * ``invisible="True"``: hides both the label and the field.
767 * ``password="True"``: replace field values by asterisks, "*".
769 * ``string=""``: change the field label. Note that this label is also used in the search view: see select attribute above).
771 * ``domain``: can restrict the domain.
772 + Example: domain="[('partner_id','=',partner_id)]"
774 * ``widget``: can change the widget.
775 + Example: widget="one2many_list"
786 * ``mode``: sequences of the views when switching.
787 + Example: mode="tree,graph"
789 * ``on_change``: define a function that is called when the content of the field changes.
790 + Example: on_change="onchange_partner(type,partner_id)"
791 + See ViewsSpecialProperties for details
793 * ``attrs``: Permits to define attributes of a field depends on other fields of the same window. (It can be use on page, group, button and notebook tag also)
794 + Format: "{'attribute':[('field_name','operator','value'),('field_name','operator','value')],'attribute2':[('field_name','operator','value'),]}"
795 + where attribute will be readonly, invisible, required
797 + Example: (in product.product)
801 <field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
803 * ``eval``: evaluate the attribute content as if it was Python code (see :ref:`below <eval-attribute-link>` for example)
805 * ``default_focus``: set to ``1`` to put the focus (cursor position) on this field when the form is first opened.
806 There can only be one field within a view having this attribute set to ``1`` **(new as of 5.2)**
810 <field name="name" default_focus=”1”/>
815 Here's the source code of the view of a sale order object. This is the same object as the object shown on the screen shots of the presentation.
821 <?xml version="1.0"?>
824 <record id="view_partner_form" model="ir.ui.view">
825 <field name="name">res.partner.form</field>
826 <field name="model">res.partner</field>
827 <field name="type">form</field>
828 <field name="arch" type="xml">
829 <form string="Partners">
830 <group colspan="4" col="6">
831 <field name="name" select="1"/>
832 <field name="ref" select="1"/>
833 <field name="customer" select="1"/>
834 <field domain="[('domain', '=', 'partner')]" name="title"/>
835 <field name="lang" select="2"/>
836 <field name="supplier" select="2"/>
838 <notebook colspan="4">
839 <page string="General">
840 <field colspan="4" mode="form,tree" name="address"
841 nolabel="1" select="1">
842 <form string="Partner Contacts">
843 <field name="name" select="2"/>
844 <field domain="[('domain', '=', 'contact')]" name="title"/>
845 <field name="function"/>
846 <field name="type" select="2"/>
847 <field name="street" select="2"/>
848 <field name="street2"/>
850 <field name="zip" select="2"/>
851 <field name="city" select="2"/>
853 <field completion="1" name="country_id" select="2"/>
854 <field name="state_id" select="2"/>
856 <field name="phone"/>
859 <field name="mobile"/>
860 <field name="email" select="2" widget="email"/>
862 <tree string="Partner Contacts">
866 <field name="country_id"/>
867 <field name="phone"/>
868 <field name="email"/>
871 <separator colspan="4" string="Categories"/>
872 <field colspan="4" name="category_id" nolabel="1" select="2"/>
874 <page string="Sales & Purchases">
875 <separator string="General Information" colspan="4"/>
876 <field name="user_id" select="2"/>
877 <field name="active" select="2"/>
878 <field name="website" widget="url"/>
879 <field name="date" select="2"/>
880 <field name="parent_id"/>
883 <page string="History">
884 <field colspan="4" name="events" nolabel="1" widget="one2many_list"/>
886 <page string="Notes">
887 <field colspan="4" name="comment" nolabel="1"/>
894 action="action_partner_form"
895 id="menu_partner_form"
896 parent="base.menu_base_partner"
901 .. _eval-attribute-link:
906 The **eval** attribute evaluate its content as if it was Python code. This
907 allows you to define values that are not strings.
909 Normally, content inside *<field>* tags are always evaluated as strings.
911 .. describe:: Example 1:
915 <field name="value">2.3</field>
917 This will evaluate to the string ``'2.3'`` and not the float ``2.3``
919 .. describe:: Example 2:
923 <field name="value">False</field>
925 This will evaluate to the string ``'False'`` and not the boolean
926 ``False``. This is especially tricky because Python's conversion rules
927 consider any non-empty string to be ``True``, so the above code will
928 end up storing the opposite of what is desired.
930 If you want to evaluate the value to a float, a boolean or another
931 type, except string, you need to use the **eval** attribute:
935 <field name="value" eval="2.3" />
936 <field name="value" eval="False" />
941 Adds a button to the current view. Allows the user to perform various
942 actions on the current record.
944 After a button has been clicked, the record should always be reloaded.
946 Buttons have the following attributes:
949 Defines the type of action performed when the button is activated:
951 ``workflow`` (default)
952 The button will send a workflow signal [#]_ on the current model
953 using the ``@name`` of the button as workflow signal name and
954 providing the record id as parameter (in a list).
956 The workflow signal may return an action descriptor, which should
957 be executed. Otherwise it will return ``False``.
960 The button will execute the method of name ``@name`` on the
961 current model, providing the record id as parameter (in a
962 list). This call may return an action descriptor to execute.
965 The button will trigger the execution of an action
966 (``ir.actions.actions``). The ``id`` of this action is the
967 ``@name`` of the button.
969 From there, follows the normal action-execution workflow.
972 Only has one possible value currently: ``cancel``, which indicates
973 that the popup should be closed without performing any RPC call or
977 Only meaningful within a popup-type window (e.g. a
978 wizard). Otherwise, is a noop.
982 ``@special`` and ``@type`` are incompatible.
985 The button's identifier, used to indicate which method should be
986 called, which signal sent or which action executed.
989 A confirmation popup to display before executing the button's
990 task. If the confirmation is dismissed the button's task *must not*
994 The label which should be displayed on the button [#]_.
997 Display an icon on the button, if absent the button is text-only
1000 ``@states``, ``@attrs``, ``@invisible``
1001 Standard OpenERP meaning for those view attributes
1004 If set to a truthy value (``1``), automatically selects that button
1005 so it is used if ``RETURN`` is pressed while on the form.
1007 May be ignored by the client.
1009 .. versionadded:: 6.0
1015 <button name="order_confirm" states="draft" string="Confirm Order" icon="gtk-execute"/>
1016 <button name="_action_open_window" string="Open Margins" type="object" default_focus=”1”/>
1021 Adds a simple label using the string attribute as caption.
1027 <label string="Test"/>
1032 Force a return to the line even if all the columns of the view are not filled in.
1040 .. [#] via ``exec_workflow`` on the ``object`` rpc endpoint
1042 .. [#] in form view, in list view buttons have no label
1044 .. [#] behavior in list view is undefined, as list view buttons don't
1048 Inheritance in Views
1049 --------------------
1051 When you create and inherit objects in some custom or specific modules, it is better to inherit (than to replace) from an existing view to add/modify/delete some fields and preserve the others.
1057 <record model="ir.ui.view" id="view_partner_form">
1058 <field name="name">res.partner.form.inherit</field>
1059 <field name="model">res.partner</field>
1060 <field name="inherit_id" ref="base.view_partner_form"/>
1061 <field name="arch" type="xml">
1062 <notebook position="inside">
1063 <page string="Relations">
1064 <field name="relation_ids" colspan="4" nolabel="1"/>
1070 This will add a page to the notebook of the ``res.partner.form`` view in the
1073 The inheritance engine will parse the existing view and search for the root nodes of
1077 <field name="arch" type="xml">
1079 It will append or edit the content of this tag. If this tag has some attributes,
1080 it will look in the parent view for a node with matching attributes (except
1083 You can use these values in the position attribute:
1085 * inside (default): your values will be appended inside the tag
1086 * after: add the content after the tag
1087 * before: add the content before the tag
1088 * replace: replace the content of the tag.
1095 <record model="ir.ui.view" id="view_partner_form1">
1096 <field name="name">res.partner.form.inherit1</field>
1097 <field name="model">res.partner</field>
1098 <field name="inherit_id" ref="base.view_partner_form"/>
1099 <field name="arch" type="xml">
1100 <page string="Extra Info" position="replace">
1101 <field name="relation_ids" colspan="4" nolabel="1"/>
1106 Will replace the content of the Extra Info tab of the notebook with the ``relation_ids`` field.
1108 The parent and the inherited views are correctly updated with ``--update=all`` argument like any other views.
1113 To delete a field from a form, an empty element with ``position="replace"`` attribute is used. Example:
1117 <record model="ir.ui.view" id="view_partner_form2">
1118 <field name="name">res.partner.form.inherit2</field>
1119 <field name="model">res.partner</field>
1120 <field name="inherit_id" ref="base.view_partner_form"/>
1121 <field name="arch" type="xml">
1122 <field name="lang" position="replace"/>
1129 To add a field into a form before the specified tag use ``position="before"`` attribute.
1133 <record model="ir.ui.view" id="view_partner_form3">
1134 <field name="name">res.partner.form.inherit3</field>
1135 <field name="model">res.partner</field>
1136 <field name="inherit_id" ref="base.view_partner_form"/>
1137 <field name="arch" type="xml">
1138 <field name="lang" position="before">
1139 <field name="relation_ids"/>
1144 Will add ``relation_ids`` field before the ``lang`` field.
1146 To add a field into a form after the specified tag use ``position="after"`` attribute.
1150 <record model="ir.ui.view" id="view_partner_form4">
1151 <field name="name">res.partner.form.inherit4</field>
1152 <field name="model">res.partner</field>
1153 <field name="inherit_id" ref="base.view_partner_form"/>
1154 <field name="arch" type="xml">
1155 <field name="lang" position="after">
1156 <field name="relation_ids"/>
1161 Will add ``relation_ids`` field after the ``lang`` field.
1167 To make changes in more than one location, wrap the fields in a data element.
1171 <record model="ir.ui.view" id="view_partner_form5">
1172 <field name="name">res.partner.form.inherit5</field>
1173 <field name="model">res.partner</field>
1174 <field name="inherit_id" ref="base.view_partner_form"/>
1175 <field name="arch" type="xml">
1177 <field name="lang" position="replace"/>
1178 <field name="website" position="after">
1179 <field name="lang"/>
1185 Will delete the ``lang`` field from its usual location, and display it after
1186 the ``website`` field.
1188 .. _xpath-element-inheritance:
1193 Sometimes a view is too complicated to let you simply identify a target field
1194 by name. For example, the field might appear in two places. When that happens,
1195 you can use an ``xpath`` element to describe where your changes should be
1200 <record model="ir.ui.view" id="view_partner_form6">
1201 <field name="name">res.partner.form.inherit6</field>
1202 <field name="model">res.partner</field>
1203 <field name="inherit_id" ref="base.view_partner_form"/>
1204 <field name="arch" type="xml">
1207 expr="//field[@name='address']/form/field[@name='email']"
1212 expr="//field[@name='address']/tree/field[@name='email']"
1220 Will add the ``age`` field after the ``email`` field in both the form and tree
1221 view of the address list.
1224 Specify the views you want to use
1225 ---------------------------------
1227 There are some cases where you would like to specify a view other than the default:
1229 - If there are several form or tree views for an object.
1230 - If you want to change the form or tree view used by a relational field
1231 (one2many for example).
1233 Using the priority field
1234 ++++++++++++++++++++++++
1236 This field is available in the view definition, and is 16 by default. By
1237 default, OpenERP will display a model using the view with the highest priority
1238 (the smallest number). For example, imagine we have two views for a simple model.
1239 The model *client* with two fields : **firstname** and **lastname**. We will define
1240 two views, one which shows the firstname first, and the other one which shows
1247 Here is the first view for the model 'client'.
1248 We don't specify a priority field, which means
1251 <record model="ir.ui.view" id="client_form_view_1">
1252 <field name="name">client.form.view1</field>
1253 <field name="model">client</field>
1254 <field name="type">form</fiel>
1255 <field name="arch" type="xml">
1256 <field name="firstname"/>
1257 <field name="lastname"/>
1262 A second view, which show fields in an other order.
1263 We specify a priority of 15.
1265 <record model="ir.ui.view" id="client_form_view_2">
1266 <field name="name">client.form.view2</field>
1267 <field name="model">client</field>
1268 <field name="priority" eval="15"/>
1269 <field name="type">form</fiel>
1270 <field name="arch" type="xml">
1271 <field name="lastname"/>
1272 <field name="firstname"/>
1276 Now, each time OpenERP will have to show a form view for our object *client*, it will have the choice between two views.
1277 **It will always use the second one, because it has a higher priority !** Unless you tell it to use the first one !
1279 Specify per-action view
1280 +++++++++++++++++++++++
1282 To illustrate this point, we will create 2 menus which show a form view for this *client* object :
1288 This action open the default view (in our case,
1289 the view with the highest priority, the second one)
1292 model="ir.actions.act_window"
1293 id="client_form_action">
1294 <field name="name">client.form.action</field>
1295 <field name="res_model">client</field>
1296 <field name="view_type">form</field>
1297 <field name="view_mode">form</field>
1301 This action open the view we specify.
1304 model="ir.actions.act_window"
1305 id="client_form_action1">
1306 <field name="name">client.form.action1</field>
1307 <field name="res_model">client</field>
1308 <field name="view_type">form</field>
1309 <field name="view_mode">form</field>
1310 <field name="view_id" ref="client_form_view_1"/>
1313 <menuitem id="menu_id" name="Client main menu"/>
1316 name="Here we don't specify the view"
1317 action="client_form_action" parent="menu_id"/>
1320 name="Here we specify the view"
1321 action="client_form_action1" parent="menu_id"/>
1323 As you can see on line *19*, we can specify a view. That means that when we open
1324 the second menu, OpenERP will use the form view *client_form_view_1*, regardless
1329 Remember to use the module name (*module.view_id*) in the *ref* attribute if
1330 you are referring to a view defined in another module.
1332 Specify views for related fields
1333 ++++++++++++++++++++++++++++++++
1338 The *view_id* method works very well for menus/actions, but how can you specify the view to use for a one2many
1339 field, for example? When you have a one2many field, two views are used, a tree view (**in blue**), and a form view when
1340 you click on the add button (**in red**).
1342 .. .. figure:: images/one2many_views.png
1346 When you add a one2many field in a form view, you do something like this :
1350 <field name="order_line" colspan="4" nolabel="1"/>
1352 If you want to specify the views to use, you can add a *context* attribute, and
1353 specify a view id for each type of view supported, exactly like the action's
1354 *view_id* attribute:
1358 <field name="order_line" colspan="4" nolabel="1"
1359 context="{'form_view_ref' : 'module.view_id', 'tree_view_ref' : 'model.view_id'}"/>
1361 If you don't specify the views, OpenERP will choose one in this order :
1363 1. It will use the <form> or <tree> view defined **inside** the field (see below)
1364 2. Else, it will use the views with the highest priority for this object.
1365 3. Finally, it will generate default empty views, with all fields.
1369 The context keys are named <view_type>_view_ref.
1373 By default, OpenERP will never use a view that is not defined for your object. If you have two models, with the
1374 same fields, but a different model name, OpenERP will never use the view of one for the other,
1375 even if one model inherit an other.
1377 You can force this by manually specifying the view, either in the action or in the context.
1382 In the case of relational fields, you can create a view directly inside a field :
1386 <record model="ir.ui.view" id="some_view">
1387 <field name="name">some.view</field>
1388 <field name="type">form</field>
1389 <field name="model">some.model.with.one2many</field>
1390 <field name="arch" type="xml">
1393 <!-- <=== order_line is a one2many field -->
1394 <field name="order_line" colspan="4" nolabel="1">
1406 If you or another developer want to inherit from this view in another module,
1407 you need to inherit from the parent view and then modify the child fields.
1408 With child views, you'll often need to use an :ref:`xpath-element-inheritance`
1409 to describe exactly where to place your new fields.
1413 <record model="ir.ui.view" id="some_inherited_view">
1414 <field name="name">some.inherited.view</field>
1415 <field name="type">form</field>
1416 <field name="model">some.model.with.one2many</field>
1417 <field name="inherit_id" ref="core_module.some_view"/>
1418 <field name="arch" type="xml">
1421 expr="//field[@name='order_line']/form/field[@name='qty']"
1423 <field name="size"/>
1426 expr="//field[@name='order_line']/tree/field[@name='qty']"
1428 <field name="size"/>
1433 One down side of defining a subview like this is that it can't be inherited on
1434 its own, it can only be inherited with the parent view. Your views will be more
1435 flexible if you define the child views separately and then specify which child
1436 view to use as part of the one2many field.