-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathview.xml
640 lines (595 loc) · 36.4 KB
/
view.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Akretion France (https://www.akretion.com/)
@author: Alexis de Lattre <[email protected]>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<!-- oca-hooks:disable=xml-duplicate-record-id -->
<!-- List of rules in README of https://github.com/OCA/odoo-pre-commit-hooks -->
<odoo>
<data>
<!-- WARNING v16 : attrs="{'readonly': 1}" causes an OWL crash -->
<!-- HERITAGE d'une vue FORM -->
<record id="view_asterisk_server_company_form" model="ir.ui.view">
<field name="name">asterisk.server.company</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form" />
<field name="groups_id" eval="[(4, ref('account.group_account_user'))]"/> <!-- vu en v8 seulement
OU -->
<field name="groups_id" eval="[(6, 0, [ref('account.group_account_user')])]"/>
<!-- => pratique pour avoir un champ en readonly=1 pour tout le monde et en readonly=0 pour account.group_account_user par exemple -> dans cet héritage avec groups_id, on hérite le champ concerné avec position="attributes" et <attribute name="readonly">0</attribute> -->
<field name="priority">100</field> <!-- Only when necessary -->
<field name="arch" type="xml">
<notebook>
<!-- Ajout d'un nouvel onglet -->
<page position="inside" string="IPBX">
<field nolabel="1" name="asterisk_server_ids" />
<!-- affiche la string du champ, sans afficher la valeur -->
<label for="amount_total" />
</page>
</notebook>
<xpath expr="//field[@name='product_id']" position="attributes">
<!-- expr : expr="//header//a[hasclass('navbar-brand')]" -->
<!-- expr="//button[@name='action_invoice_sent' and not(hasclass('oe_highlight'))] -->
<!-- expr="//header/button[last()]" -->
<attribute name="editable">bottom</attribute>
<attribute name="on_change">onchange_product_id(product_id, location_id, location_dest_id, False)</attribute>
<attribute name="readonly">1</attribute>
<attribute name="groups" add="stock.group_stock_user" separator=","/> <!-- v16+ -->
</xpath>
<!-- MOVE a field to a new position (ne marche pas en v10... à partir de quelle version ça marche ??
if using xpath for position="after", must use also xpath for position="move"
In the example below:
initial order : partner_id | ref
new order : ref | partner_id
in v14, if you use position="move" on a field, position="move" will be
ignored if there are other fields without position="move" in the same block
-->
<field name="ref" position="after">
<field name="partner_id" position="move"/>
</field>
</field>
</record>
<!-- SEARCH VIEW -->
<record id="view_asterisk_server_search" model="ir.ui.view">
<field name="name">asterisk.server.search</field>
<field name="model">asterisk.server</field>
<field name="arch" type="xml">
<search string="Asterisk Server Search">
<!-- Permet une recherche "directe" -->
<field name="name" />
<field name="partner_id" operator="child_of"/>
<!-- Pour une recherche sur plusieurs champs -->
<field name="reference" filter_domain="['|', ('name', 'ilike', self), ('client_order_ref', 'ilike', self)]" string="Tutu"/>
<!-- Pour un champ M2O, on a le droit de chercher sur une propriété de l'object désigné par le M2O. Exemple:
filter_domain="[('product_id.default_code', '=ilike', self + '%')]" -->
<!-- permet un filtrage -->
<filter name="import" string="Import" domain="[('type', '=', 'import')]" />
<filter string="My Sales Order Lines" domain="[('salesman_id', '=', uid)]"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
<separator/>
<filter string="Arrival Date" name="arrival_date" date="arrival_date"/> <!-- Permet d'avoir les filtres avancés de date avec mois/semestre/année -->
<!-- on peut filtrer sur un champ M2M, par exemple :
domain="[('default_user_ids', '=', uid)]"
Pour comprendre ce filtre, il faut le lire : uid in 'default_user_ids' -->
<!-- TODO exemple de multi-filtrage -->
<!-- permet le regroupement -->
<group name="groupby">
<filter name="partner_groupby" string="Partner" context="{'group_by': 'partner_id'}"/>
<filter name="date_groupby" string="Date" context="{'group_by': 'date:week'}"/> <!-- Dans la BI, on aura un regroupement en semaine par défaut -->
</group>
<!-- Pour faire de l'affichage dynamique de la vue tree : -->
<group string="Display">
<filter string="Show Context" name="context_show" context="{'context_show': True}"/> <!-- et sur le champ Context de la vue tree, il suffit de mettre invisible="not context.get('context_show')" -->
</group>
</search>
</field>
</record>
<!-- FORM VIEW -->
<record id="view_asterisk_server_form" model="ir.ui.view">
<field name="name">asterisk.server.form</field>
<field name="model">asterisk.server</field>
<field name="arch" type="xml">
<form string="Asterisk Servers">
<header>
<!-- si on a un bouton à l'intérieur de la vue, on peut par exemple utiliser : class="oe_link oe_edit_only" (cas du bouton (update) des taxes) -->
<button name="done" string="Done" type="object" class="btn-primary" states="draft" /> <!-- before btn-primary : oe_highlight" -->
<button name="back2draft" string="Back to draft" type="object" states="done" />
<button name="%(olive_oil_production_report)d" string="Print" type="action"/> <!-- Direct link to the report XMLID ir.actions.report -->
<field name="state" widget="statusbar" clickable="True" statusbar_colors="{'pending': 'blue'}" statusbar_visible="draft,sent,purchase"/> <!-- si on utilise clickable="True" and statusbar_colors=, il ne faut évidemment pas que le champ "state" soit readonly=True, sinon on a une erreur JS -->
<!-- v14+: print report using xmlid -->
<button name="%(stock.action_report_delivery)d" string="Print" type="action"/>
</header>
<div class="alert alert-warning oe_edit_only" role="alert" attrs="{'invisible': [('same_vat_partner_id', '=', False)]}">
A partner with the same <span><span class="o_vat_label">Tax ID</span></span> already exists (<field name="same_vat_partner_id"/>), are you sure to create a new one?
</div>
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" invisible="active"/>
<!--
New for v13+.
Possible values for bg_color: same as decoration: danger, info, success, warning -->
<div class="oe_button_box" name="button_box">
<!-- replaces the active field starting from v9
No code to write -->
<button name="toggle_active" type="object"
class="oe_stat_button" icon="fa-archive">
<field name="active" widget="boolean_button"
options='{"terminology": "archive"}'/>
</button>
<button class="oe_stat_button" type="action"
name="%(donation.donation_action)d"
attrs="{'invisible': [('customer', '=', False)]}"
context="{'search_default_partner_id': active_id}"
icon="fa-heart-o">
<field string="Donations" name="donation_count" widget="statinfo"/>
</button>
</div>
<div class="oe_title">
<label for="name" string="Server Name" class="oe_edit_only"/>
<!-- il y a aussi class="oe_read_only" dispo en v8+ -->
<h1>
<field name="name" placeholder="Write the name of the server here..."/>
</h1>
</div>
<group colspan="" col="">
<!-- When you have a wizard that sets a default value for a readonly field, it is not saved... unless you set force_save="1" -->
<field name="field_readonly_default_value" force_save="1" readonly="1"/>
<field name="company_id" invisible="not context.get('asterisk_server_main_view')" groups="base.group_multi_company"/>
<!-- pour groups=, il faut toujours mettre "nom du module.XMLID du groupe", même si le groupe est défini dans le même module. -->
<field name="ip_address" />
<field name="date" options="{'datepicker': {'warn_future': true}}" />
<field name="partner_id" context="{'show_address': 1}" options="{'always_reload': 1}"/> <!-- Pour montrer l'adresse, il faut les clés spéciales dans context ET dans options -->
<field name="account_id" context="{'default_reconcile': True}"/> <!-- TODO can we set an XML in context on a field in form view ? -->
<field name="email" widget="email"/>
<field name="date" options="{'datepicker': {'warn_future': true}}"/> <!-- datepicker à partir de v13 -->
<field name="port" />
<field name="boolean_field" widget="boolean_toggle"/>
<field name="password" password="True" />
<separator string="New section" colspan="2"/>
<field name="tutu_id" widget="selection" />
<field name="tutu_id" options="{'no_open': True, 'no_create': True, 'no_create_edit': True}" /> <!-- no_open vire the lien HTML sur un champ M2O ; no_create: vire l'option de création dans la liste déroulante ; idem pour Create and Edit -->
<field name="estimated_hours" widget="float_time"/>
<field name="image_binary" widget="image"/>
<!-- For a file-binary field: -->
<field name="file" filename="filename" /> <!-- Binary field -->
<field name="filename" invisible="1"/> <!-- char field -->
<field name="url" widget="url" text="Lien Google Drive"/> <!-- text est le texte du lien, ce qui est particulièrement nécessaire quand on a des URLs à rallonge, qui posent un pb dans la vue -->
<!-- estimated_hours est un fields.float -->
<field name="total_amount" widget="monetary" options="{'currency_field': 'currency_id'}"/> <!-- PLUS NECESSAIRE en v9+ pour les fields.Monetary. Important: il faut que le champ 'currency_id' soit dans la vue -->
<field name="currency_id" invisible="1"/> <!-- groups="base.group_multi_currency" -->
<field name="field_many2one" domain="[('tit', '=', 'tutu')]"/>
<!-- domaine dans une vue form : ce qu'on peut mettre à droite dans le tuple :
- une valeur fixe
- un XMLID : [('parent_id', 'child_of', %(l10n_eu_nace.nace_root)d)]
- si on veut un truc dynamique, on fait un on_change sur un autre champ qui retourne un domaine
ou sinon :
domain="[('partner_id','=',partner_id)]"
pour filtrer sur l'ID courant, utiliser "active_id" au lieu de "id"
domain="[('partner_id', '=', active_id)]
Pour filtrer un M2O sur le contenu d'un M2M en v13-:
domain="[('id', 'in', opportunity_ids and opportunity_ids[0] and opportunity_ids[0][2] or False)]"
cf addons/crm/base_partner_merge_view.xml champ dst_partner_id
Pour filtrer un M2O sur le contenu d'un M2M en v14+:
domain="[('id', 'in', partner_ids or False)]"
cf odoo/odoo/addons/base/wizard/base_partner_merge.py
-->
<field name="invoice_id" context="{'form_view_ref': 'account.invoice_form', 'tree_view_ref': 'account.invoice_tree'}"/>
<!-- v18+ : tree_view_ref -> list_view_ref -->
<!-- clés form_view_ref et tree_view_ref pour forcer une certaine vue ... mais ça n'a l'air de marcher uniquement sur O2M -->
<field name="test_field_many2one" context="{'search_default_partner_id': [partner_id]}"/>
<!-- search_default_xxxx : xxxx est le 'name' du filtre dans la vue search
sur une vue form, on peut faire un search_default conditionnel:
'search_default_service': type == 'service' -->
<field name="intrastat_uom_id" attrs="{'invisible': [('is_fiscal_only', '=', True)], 'required': [('is_fiscal_only', '=', False)]}" groups="l10n_fr_intrastat_product.group_detailed_intrastat_product" />
<!-- attrs sur un champ one2many sans valeur :
v8 : ('quant_package_ids', '=', [(6, False, [])])
v10 : ('quant_package_ids', '=', [])
pour match avec XMLID :
attrs="{'readonly': [('country_id', '=', %(base.fr)d)]}"
<!-- Exemple de champ "intégrés" avec commentaires après -->
<label string="Impregnation Report Beads / Fragrance" for="testing_impregnation_beads_percentage"/> <!-- sur un label, quand on a for="champ", le string sera en gras. Si on n'a pas mis de string, la string du champ sera utilisée -->
<div>
<field name="testing_impregnation_beads_percentage" class="oe_inline"/> <!-- pas besoin de nolabel="1" quand on a class="oe_inline" -->
<label string=" %% / " class="oe_inline"/> <!-- pas en gras car pas de for="" --> <!-- May be usefull to use unbreakable space | | -->
<field name="testing_impregnation_fragrance_percentage" class="oe_inline"/>
<label string=" %%" class="oe_inline"/>
</div>
<!-- à partir de la v10 -->
<label for="hunt_commission_rate"/>
<div>
<field name="hunt_commission_rate" class="oe_inline"/> %%
</div>
<!-- à partir de la v16 -->
<label for="product_uom_qty"/>
<div class="o_row">
<field name="product_uom_qty"/>
<field name="product_uom" options="{'no_open': True, 'no_create': True}" groups="uom.group_uom"/>
</div>
<!-- button to start a wizard : -->
<button type="action" name="%(action_xmlid)d" string="Start wizard" />
<!-- button with confirm pop-up -->
<button type="type" name="do_this" string="Do this" confirm="Are you really sure ?" />
<field name="machin_m2m_ids" widget="many2many_tags">
<field name="description_text" widget="html">
<field name="machine_ids" widget="x2many_counter" string="things" views="[['account.view_machin_tree', 'tree'], ['account.view_machin_form', 'form']]"/> <!-- utilisable sur M2M et O2M ; affichera 'nn things' où nn est le nombre de records-->
<field name="my_prop_ids" widget="many2many_checkboxes"/>
<div class="oe_right oe_button_box" name="buttons"
attrs="{'invisible': [('total', '=', 0)]}">
<button name="%(action_view_mass_mailing_contacts)d"
type="action" class="oe_stat_button oe_inline">
<field name="received_ratio" widget="percentpie" string="Received"/> <!-- extrait du module mass_mailing : le widget percentpie affiche un jolie cercle en couleur avec le chiffre en pourcent au milieu. Le type du champ est un integer. Ce widget ne marche qu'en lecture seule. -->
</button>
<field name="company_type" options="{'horizontal': true}" widget="radio"/>
<field name="analytic_distribution" widget="analytic_distribution"
groups="analytic.group_analytic_accounting"
options="{'product_field': 'product_id', 'account_field': 'account_id'}" />
</div>
</group>
</sheet>
<!-- Note: pas besoin qu'il y ait un sheet pour mettre le chatter - on peut le faire si la form contient un simple group -->
<!-- v17- -->
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/> <!-- v11+ -->
<field name="message_ids" widget="mail_thread"/>
</div>
<!-- v18+ -->
<chatter reload_on_post="True" reload_on_attachment="True" open_attachments="True" reload_on_follower="True"/>
</form>
</field>
</record>
<!-- TREE VIEW -->
<record id="fr_intrastat_product_tree" model="ir.ui.view">
<field name="name">fr.intrastat.product.tree</field>
<field name="model">report.intrastat.product</field>
<field name="arch" type="xml">
<list > <!-- v18+ -->
<tree string="Intrastat Product" colors="blue:state=='draft';blue:state in ('waiting_date','manual')" default_order="sequence,name desc"> <!-- syntaxe color v8 -->
<tree decoration-info="state == 'draft' and 'code', '=', 'toto'" decoration-muted="state == 'cancel'" string="Invoice">
<tree string="Responsabilités" decoration-success="risk_level_current >= risk_level_target" decoration-danger="risk_level_current < risk_level_target"> <!-- syntaxe color v10 : couleurs possibles :
decoration-danger (red)
decoration-info (bleu)
decoration-muted (gris très clair => cancel)
decoration-bf (bold font)
decoration-success (green)
decoration-warning (orange pâle)
-->
<!-- ajout possible : edit="0" create="0" delete="0" multi_edit="1" import="0"
editable="top/bottom" : rend la vue liste éditable, avec création de nouveaux records en haut ou en bas de la liste
On peut avoir multi_edit="1" sans avoir editable="bottom" : la vue liste ne sera éditable que quand on a sélectionné plusieurs lignes
limit="100" : nombre de lignes affichées par défaut sur une "page"
-->
<!-- COLORS :
- on peut utiliser current_date : red:date < current_date
- il faut que le champ soit présent dans la vue tree (même invisible)
- exemple double condition: colors="red:date < current_date and state=='draft'"
couleurs possibles : red, green, blue, grey, black
Pour hériter la couleur d'une vue tree :
<tree position="attributes">
<attribute name="colors">blue:state=='draft';black:state=='confirm'</attribute>
</tree>
-->
<header> <!-- v14+ Use same action as in the Action menu -->
<button
name="%(mass.swap_celebrant_action)d"
type="action"
string="Swap Celebrants"
groups="mass.group_mass_user"
/>
</header>
<field name="start_date" optional="hide"> <!-- hide or show -->
<field name="end_date" decoration-bf="1"/> <!-- champ en gras -->
<field name="sequence" widget="handle"/> <!-- v10+ -->
<field name="user_id" widget="many2one_avatar_user"/> <!-- v14+ -->
<field name="product_uom_qty" string="Demand" attrs="{'column_invisible': [('parent.immediate_transfer', '=', True)], 'readonly': ['|', ('is_initial_demand_editable', '=', False), '&', '&', ('show_operations', '=', True), ('is_locked', '=', True), ('is_initial_demand_editable', '=', False)]}"/> <!-- column_invisible en v11+ / On peut faire column_invisible : parent.xxx même si la vue tree n'est pas définie à l'intérieur d'un champ d'une vue forme -->
<field name="on_order" attrs="{'invisible':[('on_order','=', True)]}"/>
<!-- quand on met un attrs / invisible sur une vue Tree, ça ne masque
pas la colonne mais ça rend invisible la valeur
Pour masquer la colonne, il faut faire : invisible="context.get('tutu')" -->
<field name="total_fiscal_amount" sum="Total fiscal amount" />
<field name="picking_status" decoration-success="picking_status == 'delivered'" decoration-info="picking_status == 'to_deliver'" decoration-warning="picking_status == 'partially_delivered'" decoration-danger="picking_status == 'cancel'" widget="badge" optional="show"/>
<field name="state" widget="badge" decoration-info="state == 'draft'" decoration-success="state == 'posted'"/>
<button name="%(project_action_item_timesheet_action)d"
type="action" string="Progress" states="todo,progress"
icon="terp-accessories-archiver"/>
<!-- en v7.0, ça a encore un intérêt de mettre des icones dans les buttons des vues tree
Pour avoir la liste, il faut regarder dans
openerp/tools/misc.py
Pour visualiser les icones STOCK_xxx, regarder sur
http://www.pygtk.org/pygtk2reference/gtk-stock-items.html
en v8.0, on peut utiliser les boutons depuis
icon="fa-heart-o"
A partir de la v10, on peut mettre un icon font awsome en vue tree:
icon="fa fa-undo text-warning" et on ne peut plus mettre les terp-* ni STOCK_*
VERSION de fontawesome:
v8: 4.2.0
v10: 4.5.0
v11 à v15: 4.7.0
cf addons/web/static/lib/fontawesome/css/font-awesome.css
Pour choisir les icones en v4.7 : https://fontawesome.com/v4/icons/
-->
<groupby name="product_id"> <!-- to get a button on a groupby section, cf stock.valuation.layer -->
<field name="cost_method" invisible="1"/>
<field name="quantity_svl" invisible="1"/>
<button name="action_revaluation" icon="fa-plus" title="Add Manual Valuation" type="object" attrs="{'invisible':['|', ('cost_method', '=', 'standard'), ('quantity_svl', '<=', 0)]}" />
</groupby>
</tree>
</field>
</record>
<!--
Dans une vue Tree, si on veut rendre un champ invisible de façon conditionnelle, on ne peut pas utiliser le classique attrs="{'invisible': [('', '=', '')]}" ; il faut utiliser invisible="context.get('hide_tracking',False)" (cf stock/stock_partial_picking_view.xml). Mais si on fait ça sur la vue tree d'un champ d'une vue form (genre les lignes de facture), quand on va passer à la facture suivante, la présentation des champs ne changera pas même si la clé du context qu'on utilise est censée avoir changé.
Par contre, on peut utiliser attrs="{'invisible': [('', '=', '')]}" sur un bouton (il y a plusieurs exemples dans les addons)
Ce champ fonction peut être utile pr débugger :
def _compute_context(self, cr, uid, ids, name, arg, context=None):
result = {}
for id in ids:
result[id] = unicode(context)
return result
'context_str': fields.function(_compute_context,
type='char', string="Context", readonly=True),
-->
<!-- KANBAN -->
<record id="view_project_kanban" model="ir.ui.view">
<field name="name">project.project.kanban</field>
<field name="model">project.project</field>
<field name="arch" type="xml">
<!-- FIRST PART, we declare the fields we use -->
<kanban class="oe_background_grey">
<field name="effective_hours"/>
<field name="planned_hours"/>
<field name="name"/>
<field name="members"/>
<field name="use_tasks"/>
<field name="user_id"/>
<field name="date"/>
<field name="color"/>
<field name="task_count"/>
<field name="alias_id"/>
<field name="alias_domain"/>
<field name="doc_count"/>
<!-- Second part, we have the Qweb code -->
<templates>
<!-- You can put t-if="" on fields to have a conditional display
REMEMBER : t-if have JAVASCRIPT syntax, not python syntax
and, to access a value, you must use record.field_name.raw_value
-->
</templates>
</field>
</record>
<!-- widget="many2many_kanban" -->
<!-- CALENDAR -->
<record id="sale_order_calendar" model="ir.ui.view">
<field name="name">sale.order.calendar</field>
<field name="model">sale.order</field>
<field name="arch" type="xml">
<!-- date_start => field must be a datetime ? -->
<calendar string="Sales Orders" color="state" date_start="date_order" date_stop="date_end" mode="month" quick_add="false">
<!-- list fields displayed on the calendar sticker -->
<field name="partner_id"/>
<field name="amount_total" filters="1"/>
</calendar>
</field>
</record>
<!-- GRAPH -->
<!-- http://fr.slideshare.net/openobject/business-intelligence-35790564 -->
<!-- POUR V8 : en v9/10, on a une vue dédié pour pivot -->
<record id="stay_graph" model="ir.ui.view">
<field name="name">stay.line.graph</field>
<field name="model">stay.line</field>
<field name="arch" type="xml">
<graph string="Stay Lines">
<!-- type= correspond au type par défaut du graph
Autres possibilités : type="bar" (default), type="pie", type="line"
pour "bar" : orientation="vertical" stacked="True"
-->
<field name="date" interval="month"/>
<field name="lunch_qty" type="measure"/>
</graph>
</field>
</record>
<!-- PIVOT v9+ -->
<record id="donation_pivot" model="ir.ui.view">
<field name="name">donation.pivot</field>
<field name="model">donation.donation</field>
<field name="arch" type="xml">
<pivot string="Donations" heatmap_mode="row"> <!-- attribut disable_linking="True" pour supprimer le drill-through
heatmap_mode=row/col/both -->
<!-- Ne pas oublier string='' sinon l'export Excel plante ! -->
<field name="donation_date" interval="month" type="col"/>
<field name="country_id" type="row"/>
<field name="amount_total_company_currency" type="measure"/>
</pivot>
</field>
</record>
<!--
To have count by default in v12 : add in context the 'measures' key
<field name="context">{'pivot_measures': ['__count']}</field>
Same in v10 : <pivot display_quantity="True">
-->
<!-- ACTION -->
<record id="fr_intrastat_product_action" model="ir.actions.act_window">
<field name="name">Intrastat Product</field>
<field name="res_model">report.intrastat.product</field>
<field name="view_mode">list,form</field> <!-- v18+ -->
<field name="view_mode">tree,form</field>
<field name="domain">[('is_customer', '=', True)]</field>
<!-- Here is what is possible to do to handle dates in a domain in XML :
on v8: we have access to datetime.timedelta and to relativedelta (great !)
get last 365 days (datetime.timedelta doesn't accept years/months)
('date', '=', context_today().strftime('%Y-%m-%d'))
('date', '>=', (context_today() - datetime.timedelta(days=365)).strftime('%Y-%m-%d'))
Mois en cours :
('date_order', '>=', (context_today().strftime('%Y-%m-01')))
Mois précédent :
[('date_order', '>=', (context_today() + relativedelta(day=1, months=-1)).strftime('%Y-%m-%d')), ('date_order', '<', context_today().strftime('%Y-%m-01'))]
Comparaison avec un champ DATETIME:
[('in_date', '<=', datetime.datetime.combine(context_today() + relativedelta(years=-1), datetime.time(0, 0, 0))), ('in_date', '>', datetime.datetime.combine(context_today() + relativedelta(years=-2), datetime.time(0, 0, 0)))]"/>
More info @odony in https://github.com/odoo/odoo/issues/6469
-->
<field name="context">{'tutu': True, 'default_is_loan': True, 'search_default_is_loan': True, 'active_test': False, 'search_default_category_id': ref('base.module_category_accounting_localizations_account_charts')}</field> <!-- ce contexte sera valable pour l'objet de l'action, mais pas pour les one2many de cet objet
Le default_xxx permet de mettre une valeur par defaut lors de la création d'un record depuis cette entrée de menu
search_default_xxx : active le filtre de recherche dont le name est xxx
Pour un group_by, il faut mettre directement la bonne instruction dans le context:
'group_by': 'employee_id'
si on veut avoir 2 niveaux de group_by :
'group_by': ['employee_id', 'holiday_status_id']
'active_test': False permet d'afficher les records ac active=True ET active=False par défaut -->
<field name="target">new</field> <!-- seulement pour un wizard -->
<field name="view_id" ref="stock.view_move_tree"/> <!-- permet de force l'utilisation d'une certaine view tree ; marche aussi pour les vues form ?? ATTENTION, ça sera la vue affichée en premier, même si ce n'est pas le premier type de vue dans "view_mode" -->
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to start a new xxx.
</p><p>
Et ici le text normal de l'aide.
</p>
</field>
<field name="limit">500</field>
<field name="groups_id" eval="[(4, ref('account.group_account_invoice'))]"/> <!-- groups_id : M2M -->
</record>
<record id="partner_form_act_window_view" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="view_mode">form</field>
<field name="view_id" ref="partner_form"/>
<field name="act_window_id" ref="partner_action"/>
</record>
<!-- MENU -->
<!-- déclenche une action -->
<menuitem id="fr_intrastat_product_menu"
parent="intrastat_base.menu_intrastat_base_root"
action="fr_intrastat_product_tree_action"
sequence="50"
groups="group_stock_manager" />
<!-- For top-level menu entries : add web_icon="module_name,static/description/icon.png"
The top-level icons can be generated with the script oca-gen-addon-icon
from https://github.com/OCA/maintainer-tools/pull/491
A exécuter depuis le répertoire racine du module, et il va écrire
sur static/description/icon.png
oca-gen-addon-icon --addon-dir=. --format png --icon-extra='{"fa fa-church": {"position": "absolute", "top": "30px", "left": "20px", "font-size": "70px"}}' --icon-color pink
cf https://github.com/OCA/maintainer-tools/pull/491
-->
<!-- menu parent -->
<menuitem id="" name="" parent="" sequence="" />
<!--
Menu racines :
Sale : base.menu_base_partner
Purchase: base.menu_purchase_root
Stock : stock.menu_stock_root
Account : account.menu_finance
MRP : base.menu_mrp_root
-->
<!-- HERITAGE d'une entrée de menu existante -->
<!-- Add stock location menu entry to warehouse-user group -->
<record id="stock.menu_stock_configuration" model="ir.ui.menu">
<!-- add group -->
<field name="groups_id" eval="[(4, ref('stock.group_stock_user'))]"/>
<!-- replace groups -->
<field name="groups_id" eval="[(6, 0, [ref('base.group_hr_manager')])]"/>
<!-- remove all groups (can't be done via [(5)] on v10) -->
<field name="groups_id" eval="[(6, 0, [])]"/>
<!-- change parent -->
<field name="parent_id" ref="account.menu_finance"/> <!-- TRAP: syntax is parent in <menuitem> and parent_id here -->
</record>
<!-- Replace original group by another one -->
<record id="mail.mail_feeds_main" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('base.group_system')])]"/>
</record>
<!-- Notification in the chatter -->
<record id="declaration_done" model="mail.message.subtype">
<field name="name">Intrastat Product Validated</field>
<field name="res_model">report.intrastat.product</field>
<field name="default" eval="False"/>
<field name="description">Intrastat Product Validated</field>
</record>
<!-- dans la vue form d'un wizard :
<button special="cancel" string="Cancel" class="btn-default"/>
-->
<!-- Bouton de lien, comme par exemple le lien "Rendez-vous" sur la vue form des partenaires
<button type="action"
string="Meetings"
name="%(base_calendar.action_crm_meeting)d"
context="{'search_default_partner_ids': active_id, 'default_partner_ids' : [active_id]}"/>
-->
<!-- Ajouter une entrée de lien dans le menu déroulant "More" de la vue tree/form -->
<!-- Sur la vue tree/form des account.account, j'ajoute un lien vers la vue liste des account.move.line filtrées sur le compte comptable sélectionné -->
<!-- A PARTIR de la v10 -->
<act_window
id="action_move_line_select"
name="Journal Items"
context="{'search_default_account_id': [active_id]}"
res_model="account.move.line"
src_model="account.account"/>
<!-- AVANT v10 -->
<act_window
id="action_account_items"
name="Journal Items"
context="{'search_default_account_id': [active_id]}"
res_model="account.move.line"
src_model="account.account"
key2="tree_but_open"/>
<record id="ir_move_traceability_upstream" model="ir.values">
<field name="key2">tree_but_action</field>
<field name="model">stock.move</field>
<field name="name">Downstream traceability</field>
<field name="value" eval="'ir.actions.act_window,%d'%action3"/>
</record>
<!-- Lien vers la vue form d'un autre objet en target = new -->
<act_window
id="action_view_purchase_order_group"
name="Merge Purchase orders"
context="{'search_default_draft': 1, 'search_default_approved': False}"
res_model="purchase.order.group"
src_model="purchase.order"
view_mode="form"
target="new"
multi="True"
key2="client_action_multi"
groups="base.group_survey_user"/>
<!-- Avec multi=True, l'entrée n'est présente que ds l'option "More" de la vue tree, pas dans la vue form -->
<!-- Pour lancer le wizard donation.validate depuis la vue tree des donation.donation -->
<act_window id="donation_validate_action"
multi="True"
key2="client_action_multi"
name="Validate Draft Donations"
res_model="donation.validate"
src_model="donation.donation"
view_mode="form"
target="new" />
<!-- v14+ -->
<!-- Start a wizard from list view -->
<record id="action_validate_account_move" model="ir.actions.act_window">
<field name="name">Post entries</field>
<field name="res_model">validate.account.move</field>
<field name="view_mode">form</field>
<field name="view_id" ref="validate_account_move_view"/>
<field name="context">{}</field>
<field name="target">new</field>
<field name="help">This wizard will validate all journal entries selected. Once journal entries are validated, you can not update them anymore.</field>
<field name="groups_id" eval="[(4, ref('account.group_account_invoice'))]"/>
<field name="binding_model_id" ref="account.model_account_move" />
<field name="binding_view_types">list</field>
</record>
<!-- After installation of the module, open a specific menu -->
<!-- This requires ir.actions.client + ir.actions.todo with id="base.open_menu" -->
<record id="reformat_phonenumbers_module_install" model="ir.actions.client">
<field name="name">Open Reformat Phone Numbers Menu</field>
<field name="params" eval="{'menu_id': ref('reformat_all_phonenumbers_menu')}"/> <!-- points to a menuitem ; if this menu item is linked to an action, it will start start this action-->
<field name="tag">reload</field>
</record>
<record id="base.open_menu" model="ir.actions.todo">
<field name="action_id" ref="reformat_phonenumbers_module_install"/>
<field name="state">open</field>
</record>
<!-- Start a wizard after the installation of a module -->
<record id="account_configuration_installer_todo" model="ir.actions.todo">
<field name="action_id" ref="action_account_configuration_installer"/> <!-- points to an ir.actions.act_window -->
<field name="sequence">3</field>
<field name="type">automatic</field>
</record>
</data>
</odoo>
<!--
parent.partner_id => utilisable dans les on_change et les contexte
mais a priori pas dans les attrs
-->