-
Notifications
You must be signed in to change notification settings - Fork 25
/
py3o.txt
238 lines (197 loc) · 8.63 KB
/
py3o.txt
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
Deprecated method IrActionsReportXml._lookup_report in module odoo.addons.report_py3o.models.ir_actions_report_xml
Si ERREUR :
File "/home/odoo/erp14/o14/lib/python3.10/site-packages/py3o/template/helpers.py", line 74, in __call__
self._ast = ast.parse(dedented_source)
File "/usr/lib/python3.10/ast.py", line 50, in parse
return compile(source, filename, mode, flags,
File "<unknown>", line 2
with="lang=obj.partner_id.lang or 'en_US'"
^
SyntaxError: invalid syntax
C'est que py3o_is_local_fusion = false sur ir.actions.report => le passer à True. Requête SQL:
UPDATE ir_act_report_xml SET py3o_is_local_fusion=true WHERE report_type='py3o' and py3o_is_local_fusion is not true;
Définition du rapport sortie ODT
================================
<record id="account.account_invoices" model="ir.actions.report.xml">
<field name="name">Invoice</field>
<field name="model">account.invoice</field>
<field name="report_name">account.report_invoice</field>
<field name="report_type">py3o</field>
<field name="py3o_filetype">odt</field> <!-- format de sortie -->
<field name="module">my_custom_module_base</field>
<field name="py3o_template_fallback">report/account_invoice.odt</field>
</record>
Définition du rapport sortie PDF
================================
<record id="local_py3o_server" model="py3o.server">
<field name="url">http://localhost:8765/form</field>
</record>
<record id="account.account_invoices" model="ir.actions.report.xml">
<field name="name">Invoice</field>
<field name="model">account.invoice</field>
<field name="report_name">account.report_invoice</field>
<field name="report_type">py3o</field>
<field name="py3o_filetype">pdf</field> <!-- format de sortie -->
<field name="py3o_server_id" ref="local_py3o_server"/>
<field name="module">3sortho_base</field>
<field name="py3o_template_fallback">report/account_invoice.odt</field>
</record>
Rapport ODS
===========
<record id="partner_advanced_export" model="ir.actions.report.xml">
<field name="name">Export détaillé ODS</field>
<field name="model">res.partner</field>
<field name="report_name">cimade.partner_advanced_export</field>
<field name="report_type">py3o</field>
<field name="py3o_filetype">ods</field>
<field name="py3o_multi_in_one" eval="True"/>
<field name="module">cimade_profile</field>
<field name="py3o_template_fallback">report/partner_advanced_export.ods</field>
</record>
Pour insérer un champ
=====================
Insertion > Champ > Autre Champ (Ctrl + F2)
Onglet "Variables"
Type = Champ d'utilisateur
Nom : py3o.o.company_id.name
Valeur : < Tél siège Cimade >
Format : Texte
Boucle en début de doc :
py3o://for="o in objects"
py3o://function="setLang('fr_FR')"
Pour insérer une fonction
=========================
2 solutions :
1) hyperlien :
. Cible : py3o://for="(tax_label, tax_amount) in o._get_tax_amount_by_group()"
. Texte : for="(tax_label, tax_amount) in o._get_tax_amount_by_group()"
2) champ fonction
Ctrl + F2
Onglet "Fonctions"
Type = Champ de saisie
Annotation = py3o://for="(tax_label, tax_amount) in o._get_tax_amount_by_group()"
Cliquer sur "Insérer"
Il ouvre un pop-up :
. champ du haut : py3o://for="(tax_label, tax_amount) in o._get_tax_amount_by_group()"
. champ du bas : libellé qui apparaitre dans le document (convention dans py3o-sample-report : nom entre crochets)
Pour insérer une image
======================
Insérer un cadre :
Onglet "Options", mettre dans le champ "Nom":
py3o.image(o.image, 'png', width='2cm', height='2cm', isb64=True)
OU
py3o.image(b64decode(o.image), 'png', width='2cm', height='2cm')
Il ne garde pas l'aspect ratio ; il suffit de ne mettre qu'un seul des 2 arg width / height
IF
==
py3o://if="o.company_id.phone"
afficher py3o.o.company_id.phone
py3o:///if
FOR
===
py3o://for="l in o.invoice_line_ids"
py3o:///for
ATTENTION : quand on met des FOR ou IF dans un tableau, s'assurer que l'option "Autoriser le fractionnement des lignes sur plusieurs pages et colonnes est DECOCHE
Sinon ça fait des erreurs disant que l'instruction py3o if ou for est en double... ce qui est en fait pas le cas.
FormatLang :
============
py3o://function="formatLang(o.amount_total, monetary=True, currency_obj=o.currency_id)"
py3o://function="formatLang(o.date, date=True)"
py3o://function="formatLang(o.quantity, dp='Product Unit of Measure')"
Rappel proto formatLang v10:
formatLang(self, value, digits=None, date=False, date_time=False, grouping=True, monetary=False, dp=False, currency_obj=False)
Rappel précisions décimales v10:
Product Price
Discount
Stock Weight
Product Unit of Measure
Afficher date (et heure) du jour:
py3o://function="formatLang(time.strftime('%Y-%m-%d'), date=True)"
py3o://function="formatLang(time.strftime('%Y-%m-%d %H:%M:%S'), date_time=True)"
v12
py3o://function="o_format_date(o.date_order, lang_code=lang)"
proto de o_format_date : _format_date(self, value, lang_code=False, date_format=False)
proto de o_format_datetime : _format_date(self, value, tz=False, dt_format="medium", lang_code=False) # v14+
proto de o_format_lang: _format_lang(self, value, lang_code=False, digits=None, grouping=True,
monetary=False, dp=False, currency_obj=False,
no_break_space=True)
Pour un montant : o_format_lang(amount, currency_obj=xx, lang_code=lang)
Pour afficher l'heure, il faut date_format='%d/%m/%Y %H:%M'
Afficher la date du jour :
py3o://function="o_format_date(time.strftime('%Y-%m-%d'), lang_code=lang)"
Afficher la date et l'heure du jour : A TESTER
py3o://function="o_format_datetime(time.gmtime(), lang_code=lang)"
Afficher la date + l'heure du moment dans la timezone de l'utilisateur
base_usability: py3o://function="user._report_print_datetime(lang_code=lang)"
Adresse :
=========
py3o://function="format_multiline_value(o.partner_id._display_full_address())"
py3o://function="format_multiline_value(o.partner_id._display_full_address(details=['name', 'address']))"
Champ Selection
===============
Pour afficher le label d'un champ selection QUI A UNE VALEUR:
py3o://function="o.type and dict(o.fields_get('type', 'selection')['type']['selection'])[o.type] or 'False'"
A essayer (vu en v12) :
rental._fields['state'].convert_to_export(rental.state, rental)
Pour rappel :
self.env['account.banking.mandate'].fields_get('type')
=> retourne :
{'type': {'selection': [('recurrent', u'R\xe9current'), ('oneoff', u'One-Off')]}}
La traduction a été faite
Variables/functions utilisables
===============================
- b64decode
- report_xml (donne l'object ir.actions.report.xml ; utiliser report_xml.report_name pour avoir le nom technique du rapport)
- format_multiline_value
- html_sanitize
Styles
======
Il faut bien utiliser des styles dans le document. Voilà les styles que j'utilise:
(*) = styles natifs
En-tête : En-tête (*)
Titre du document : titre 1 (*)
Adresse envoi: Address
Blocs d'adresse et d'infos diverses en haut :
- Contenu de tableau (*)
- Titre de tableau (*)
- Table header center
Tableau principal:
- Table main content left
- Table main content right
- Table main header
Tableau des totaux:
- Table totals header
- Table totals content
- Table totals content highlight
Tableau des taxes/paiements :
- Table bottom small header
- Table bottom small content right
- Table bottom small content left
- Table bottom small content center
Texte normal: Corps de texte (*)
Notes légale en bas de document: Note de fin (* ?)
Petite ligne de séparation: Small new line
Pied de page: Pied de page (*)
Barcode
=======
Barcode simple avec police de caractères :
Mettre les fichiers .ttf dans /usr/local/share/fonts/
On peut les récupérer dans mon home ~/.fonts
Utilisation de Librebarcode : https://github.com/graphicore/librebarcode
Exemple d'utilisation de la font Librefont EAN13 : maylis (purchase.order spécial)
Attention, chaque police de code barre à ses spécificités ; il faut lire la doc pour savoir quoi mettre comme texte pour que la police donne le résultat attendu !
Redémarrer LO
LO hints
========
Pour supprimer un retour à la ligne après un tableau : se mettre dans la dernière cellule du tableau et faire : Ctrl + shift + del
py3o_is_local_fusion DOIT ETRE A TRUE (true n'est que la valeur par défaut)
UPDATE ir_act_report_xml SET py3o_is_local_fusion=true;
Sinon, ça plante avec une erreur de type:
File "/home/odoo/erp/o14/lib/python3.10/site-packages/py3o/template/helpers.py", line 74, in __call__
self._ast = ast.parse(dedented_source)
File "/usr/lib/python3.10/ast.py", line 50, in parse
return compile(source, filename, mode, flags,
File "<unknown>", line 2
with="lang=obj.partner_id.lang or 'en_US'"
^
SyntaxError: invalid syntax