odoo-addon-base-write-diff 17.0.1.0.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,524 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
6
+ <title>README.rst</title>
7
+ <style type="text/css">
8
+
9
+ /*
10
+ :Author: David Goodger (goodger@python.org)
11
+ :Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
12
+ :Copyright: This stylesheet has been placed in the public domain.
13
+
14
+ Default cascading style sheet for the HTML output of Docutils.
15
+ Despite the name, some widely supported CSS2 features are used.
16
+
17
+ See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
18
+ customize this style sheet.
19
+ */
20
+
21
+ /* used to remove borders from tables and images */
22
+ .borderless, table.borderless td, table.borderless th {
23
+ border: 0 }
24
+
25
+ table.borderless td, table.borderless th {
26
+ /* Override padding for "table.docutils td" with "! important".
27
+ The right padding separates the table cells. */
28
+ padding: 0 0.5em 0 0 ! important }
29
+
30
+ .first {
31
+ /* Override more specific margin styles with "! important". */
32
+ margin-top: 0 ! important }
33
+
34
+ .last, .with-subtitle {
35
+ margin-bottom: 0 ! important }
36
+
37
+ .hidden {
38
+ display: none }
39
+
40
+ .subscript {
41
+ vertical-align: sub;
42
+ font-size: smaller }
43
+
44
+ .superscript {
45
+ vertical-align: super;
46
+ font-size: smaller }
47
+
48
+ a.toc-backref {
49
+ text-decoration: none ;
50
+ color: black }
51
+
52
+ blockquote.epigraph {
53
+ margin: 2em 5em ; }
54
+
55
+ dl.docutils dd {
56
+ margin-bottom: 0.5em }
57
+
58
+ object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
59
+ overflow: hidden;
60
+ }
61
+
62
+ /* Uncomment (and remove this text!) to get bold-faced definition list terms
63
+ dl.docutils dt {
64
+ font-weight: bold }
65
+ */
66
+
67
+ div.abstract {
68
+ margin: 2em 5em }
69
+
70
+ div.abstract p.topic-title {
71
+ font-weight: bold ;
72
+ text-align: center }
73
+
74
+ div.admonition, div.attention, div.caution, div.danger, div.error,
75
+ div.hint, div.important, div.note, div.tip, div.warning {
76
+ margin: 2em ;
77
+ border: medium outset ;
78
+ padding: 1em }
79
+
80
+ div.admonition p.admonition-title, div.hint p.admonition-title,
81
+ div.important p.admonition-title, div.note p.admonition-title,
82
+ div.tip p.admonition-title {
83
+ font-weight: bold ;
84
+ font-family: sans-serif }
85
+
86
+ div.attention p.admonition-title, div.caution p.admonition-title,
87
+ div.danger p.admonition-title, div.error p.admonition-title,
88
+ div.warning p.admonition-title, .code .error {
89
+ color: red ;
90
+ font-weight: bold ;
91
+ font-family: sans-serif }
92
+
93
+ /* Uncomment (and remove this text!) to get reduced vertical space in
94
+ compound paragraphs.
95
+ div.compound .compound-first, div.compound .compound-middle {
96
+ margin-bottom: 0.5em }
97
+
98
+ div.compound .compound-last, div.compound .compound-middle {
99
+ margin-top: 0.5em }
100
+ */
101
+
102
+ div.dedication {
103
+ margin: 2em 5em ;
104
+ text-align: center ;
105
+ font-style: italic }
106
+
107
+ div.dedication p.topic-title {
108
+ font-weight: bold ;
109
+ font-style: normal }
110
+
111
+ div.figure {
112
+ margin-left: 2em ;
113
+ margin-right: 2em }
114
+
115
+ div.footer, div.header {
116
+ clear: both;
117
+ font-size: smaller }
118
+
119
+ div.line-block {
120
+ display: block ;
121
+ margin-top: 1em ;
122
+ margin-bottom: 1em }
123
+
124
+ div.line-block div.line-block {
125
+ margin-top: 0 ;
126
+ margin-bottom: 0 ;
127
+ margin-left: 1.5em }
128
+
129
+ div.sidebar {
130
+ margin: 0 0 0.5em 1em ;
131
+ border: medium outset ;
132
+ padding: 1em ;
133
+ background-color: #ffffee ;
134
+ width: 40% ;
135
+ float: right ;
136
+ clear: right }
137
+
138
+ div.sidebar p.rubric {
139
+ font-family: sans-serif ;
140
+ font-size: medium }
141
+
142
+ div.system-messages {
143
+ margin: 5em }
144
+
145
+ div.system-messages h1 {
146
+ color: red }
147
+
148
+ div.system-message {
149
+ border: medium outset ;
150
+ padding: 1em }
151
+
152
+ div.system-message p.system-message-title {
153
+ color: red ;
154
+ font-weight: bold }
155
+
156
+ div.topic {
157
+ margin: 2em }
158
+
159
+ h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
160
+ h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
161
+ margin-top: 0.4em }
162
+
163
+ h1.title {
164
+ text-align: center }
165
+
166
+ h2.subtitle {
167
+ text-align: center }
168
+
169
+ hr.docutils {
170
+ width: 75% }
171
+
172
+ img.align-left, .figure.align-left, object.align-left, table.align-left {
173
+ clear: left ;
174
+ float: left ;
175
+ margin-right: 1em }
176
+
177
+ img.align-right, .figure.align-right, object.align-right, table.align-right {
178
+ clear: right ;
179
+ float: right ;
180
+ margin-left: 1em }
181
+
182
+ img.align-center, .figure.align-center, object.align-center {
183
+ display: block;
184
+ margin-left: auto;
185
+ margin-right: auto;
186
+ }
187
+
188
+ table.align-center {
189
+ margin-left: auto;
190
+ margin-right: auto;
191
+ }
192
+
193
+ .align-left {
194
+ text-align: left }
195
+
196
+ .align-center {
197
+ clear: both ;
198
+ text-align: center }
199
+
200
+ .align-right {
201
+ text-align: right }
202
+
203
+ /* reset inner alignment in figures */
204
+ div.align-right {
205
+ text-align: inherit }
206
+
207
+ /* div.align-center * { */
208
+ /* text-align: left } */
209
+
210
+ .align-top {
211
+ vertical-align: top }
212
+
213
+ .align-middle {
214
+ vertical-align: middle }
215
+
216
+ .align-bottom {
217
+ vertical-align: bottom }
218
+
219
+ ol.simple, ul.simple {
220
+ margin-bottom: 1em }
221
+
222
+ ol.arabic {
223
+ list-style: decimal }
224
+
225
+ ol.loweralpha {
226
+ list-style: lower-alpha }
227
+
228
+ ol.upperalpha {
229
+ list-style: upper-alpha }
230
+
231
+ ol.lowerroman {
232
+ list-style: lower-roman }
233
+
234
+ ol.upperroman {
235
+ list-style: upper-roman }
236
+
237
+ p.attribution {
238
+ text-align: right ;
239
+ margin-left: 50% }
240
+
241
+ p.caption {
242
+ font-style: italic }
243
+
244
+ p.credits {
245
+ font-style: italic ;
246
+ font-size: smaller }
247
+
248
+ p.label {
249
+ white-space: nowrap }
250
+
251
+ p.rubric {
252
+ font-weight: bold ;
253
+ font-size: larger ;
254
+ color: maroon ;
255
+ text-align: center }
256
+
257
+ p.sidebar-title {
258
+ font-family: sans-serif ;
259
+ font-weight: bold ;
260
+ font-size: larger }
261
+
262
+ p.sidebar-subtitle {
263
+ font-family: sans-serif ;
264
+ font-weight: bold }
265
+
266
+ p.topic-title {
267
+ font-weight: bold }
268
+
269
+ pre.address {
270
+ margin-bottom: 0 ;
271
+ margin-top: 0 ;
272
+ font: inherit }
273
+
274
+ pre.literal-block, pre.doctest-block, pre.math, pre.code {
275
+ margin-left: 2em ;
276
+ margin-right: 2em }
277
+
278
+ pre.code .ln { color: gray; } /* line numbers */
279
+ pre.code, code { background-color: #eeeeee }
280
+ pre.code .comment, code .comment { color: #5C6576 }
281
+ pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
282
+ pre.code .literal.string, code .literal.string { color: #0C5404 }
283
+ pre.code .name.builtin, code .name.builtin { color: #352B84 }
284
+ pre.code .deleted, code .deleted { background-color: #DEB0A1}
285
+ pre.code .inserted, code .inserted { background-color: #A3D289}
286
+
287
+ span.classifier {
288
+ font-family: sans-serif ;
289
+ font-style: oblique }
290
+
291
+ span.classifier-delimiter {
292
+ font-family: sans-serif ;
293
+ font-weight: bold }
294
+
295
+ span.interpreted {
296
+ font-family: sans-serif }
297
+
298
+ span.option {
299
+ white-space: nowrap }
300
+
301
+ span.pre {
302
+ white-space: pre }
303
+
304
+ span.problematic, pre.problematic {
305
+ color: red }
306
+
307
+ span.section-subtitle {
308
+ /* font-size relative to parent (h1..h6 element) */
309
+ font-size: 80% }
310
+
311
+ table.citation {
312
+ border-left: solid 1px gray;
313
+ margin-left: 1px }
314
+
315
+ table.docinfo {
316
+ margin: 2em 4em }
317
+
318
+ table.docutils {
319
+ margin-top: 0.5em ;
320
+ margin-bottom: 0.5em }
321
+
322
+ table.footnote {
323
+ border-left: solid 1px black;
324
+ margin-left: 1px }
325
+
326
+ table.docutils td, table.docutils th,
327
+ table.docinfo td, table.docinfo th {
328
+ padding-left: 0.5em ;
329
+ padding-right: 0.5em ;
330
+ vertical-align: top }
331
+
332
+ table.docutils th.field-name, table.docinfo th.docinfo-name {
333
+ font-weight: bold ;
334
+ text-align: left ;
335
+ white-space: nowrap ;
336
+ padding-left: 0 }
337
+
338
+ /* "booktabs" style (no vertical lines) */
339
+ table.docutils.booktabs {
340
+ border: 0px;
341
+ border-top: 2px solid;
342
+ border-bottom: 2px solid;
343
+ border-collapse: collapse;
344
+ }
345
+ table.docutils.booktabs * {
346
+ border: 0px;
347
+ }
348
+ table.docutils.booktabs th {
349
+ border-bottom: thin solid;
350
+ text-align: left;
351
+ }
352
+
353
+ h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
354
+ h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
355
+ font-size: 100% }
356
+
357
+ ul.auto-toc {
358
+ list-style-type: none }
359
+
360
+ </style>
361
+ </head>
362
+ <body>
363
+ <div class="document">
364
+
365
+
366
+ <a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
367
+ <img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
368
+ </a>
369
+ <div class="section" id="base-write-diff">
370
+ <h1>Base - Write Diff</h1>
371
+ <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
372
+ !! This file is generated by oca-gen-addon-readme !!
373
+ !! changes will be overwritten. !!
374
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
375
+ !! source digest: sha256:71745a37619c24019b67f8558eb6c7be1b974ad0031b6ce40892e7eec305bcb3
376
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
377
+ <p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/server-tools/tree/17.0/base_write_diff"><img alt="OCA/server-tools" src="https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/server-tools-17-0/server-tools-17-0-base_write_diff"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/server-tools&amp;target_branch=17.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
378
+ <p>This module allows filtering values to update on records according to
379
+ whether they are actually different from the records’ current values.</p>
380
+ <p><strong>Table of contents</strong></p>
381
+ <div class="contents local topic" id="contents">
382
+ <ul class="simple">
383
+ <li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
384
+ <li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
385
+ <li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
386
+ <li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
387
+ <li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
388
+ <li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
389
+ </ul>
390
+ </li>
391
+ </ul>
392
+ </div>
393
+ <div class="section" id="usage">
394
+ <h2><a class="toc-backref" href="#toc-entry-1">Usage</a></h2>
395
+ <p><strong>Summary</strong></p>
396
+ <p>This module allows you to update records by filtering out fields whose
397
+ values are going to be left unchanged by <tt class="docutils literal">BaseModel.write()</tt>; for
398
+ example, let’s assume you have:</p>
399
+ <pre class="code python literal-block">
400
+ <span class="o">&gt;&gt;&gt;</span> <span class="bp">self</span><span class="w">
401
+ </span><span class="n">sale</span><span class="o">.</span><span class="n">order</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="mi">1</span><span class="p">,)</span><span class="w">
402
+ </span><span class="o">&gt;&gt;&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">price_unit</span><span class="w">
403
+ </span><span class="mf">10.00</span>
404
+ </pre>
405
+ <p>If you use <tt class="docutils literal"><span class="pre">self.write({&quot;price_unit&quot;:</span> 10.00})</tt> or
406
+ <tt class="docutils literal">self.price_unit = 10.00</tt>, Odoo may end up executing unnecessary
407
+ operations, like triggering the update on the field, recompute computed
408
+ fields that depend on <tt class="docutils literal">price_unit</tt>, and so on, even if the value is
409
+ actually unchanged.</p>
410
+ <p>By using this module, you can prevent all of that.</p>
411
+ <p>You can use this module in 3 different ways. All of them require you to
412
+ add this module as a dependency of your module.</p>
413
+ <p><strong>1 - Context key ``”write_use_diff_values”``</strong></p>
414
+ <p>By adding <tt class="docutils literal">write_use_diff_values=True</tt> to the context when updating a
415
+ field value, the <tt class="docutils literal">BaseModel.write()</tt> patch will take care of filtering
416
+ out the fields’ values that are the same as the record’s current ones.</p>
417
+ <p>⚠️ Beware: the context key is propagated down to other <tt class="docutils literal">write()</tt> calls</p>
418
+ <p>Example:</p>
419
+ <pre class="code python literal-block">
420
+ <span class="kn">from</span><span class="w"> </span><span class="nn">odoo</span><span class="w"> </span><span class="kn">import</span> <span class="n">models</span><span class="w">
421
+
422
+
423
+ </span><span class="k">class</span><span class="w"> </span><span class="nc">ProductTemplate</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span><span class="w">
424
+ </span> <span class="n">_inherit</span> <span class="o">=</span> <span class="s2">&quot;product.template&quot;</span><span class="w">
425
+
426
+ </span> <span class="k">def</span><span class="w"> </span><span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">vals</span><span class="p">):</span><span class="w">
427
+ </span> <span class="c1"># Update only fields that are actually different</span><span class="w">
428
+ </span> <span class="bp">self</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">with_context</span><span class="p">(</span><span class="n">write_use_diff_values</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="w">
429
+ </span> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">vals</span><span class="p">)</span><span class="w">
430
+
431
+
432
+ </span><span class="k">class</span><span class="w"> </span><span class="nc">ProductProduct</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span><span class="w">
433
+ </span> <span class="n">_inherit</span> <span class="o">=</span> <span class="s2">&quot;product.product&quot;</span><span class="w">
434
+
435
+ </span> <span class="k">def</span><span class="w"> </span><span class="nf">update_code_if_necessary</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">code</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span><span class="w">
436
+ </span> <span class="c1"># Update ``default_code`` only if different from the current value</span><span class="w">
437
+ </span> <span class="bp">self</span><span class="o">.</span><span class="n">with_context</span><span class="p">(</span><span class="n">write_use_diff_values</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="o">.</span><span class="n">default_code</span> <span class="o">=</span> <span class="n">code</span>
438
+ </pre>
439
+ <p><strong>2 - Method ``BaseModel.write_diff()``</strong></p>
440
+ <p>It is the same as calling <tt class="docutils literal">write()</tt>, but it automatically enables the
441
+ <tt class="docutils literal">&quot;write_use_diff_values&quot;</tt> context flag: <tt class="docutils literal">self.write_diff(vals)</tt> is a
442
+ shortcut for
443
+ <tt class="docutils literal"><span class="pre">self.with_context(write_use_diff_values=True).write(vals)</span></tt></p>
444
+ <p>⚠️ Beware: the context key is propagated down to other <tt class="docutils literal">write()</tt> calls</p>
445
+ <p><strong>3 - Method ``BaseModel._get_write_diff_values(vals)``</strong></p>
446
+ <p>This method accepts a write-like <tt class="docutils literal">dict</tt> as param, and returns a new
447
+ <tt class="docutils literal">dict</tt> made of the fields who will actually update the record’s
448
+ values. This allows for a more flexible and customizable behavior than
449
+ the context key usage, because:</p>
450
+ <ul class="simple">
451
+ <li>you’ll be able to filter out specific fields, instead of filtering out
452
+ all the fields whose values won’t be changed after the update;</li>
453
+ <li>you’ll be able to execute the filtering on specific models, instead of
454
+ executing it on all the models involved in the stack of <tt class="docutils literal">write()</tt>
455
+ calls from the first usage of the context key down to the base method
456
+ <tt class="docutils literal">BaseModel.write()</tt>.</li>
457
+ </ul>
458
+ <p>Example:</p>
459
+ <pre class="code python literal-block">
460
+ <span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">defaultdict</span><span class="w">
461
+
462
+ </span><span class="kn">from</span><span class="w"> </span><span class="nn">odoo</span><span class="w"> </span><span class="kn">import</span> <span class="n">api</span><span class="p">,</span> <span class="n">models</span><span class="w">
463
+ </span><span class="kn">from</span><span class="w"> </span><span class="nn">odoo.tools.misc</span><span class="w"> </span><span class="kn">import</span> <span class="n">frozendict</span><span class="w">
464
+
465
+
466
+ </span><span class="k">class</span><span class="w"> </span><span class="nc">ProductProduct</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span><span class="w">
467
+ </span> <span class="n">_inherit</span> <span class="o">=</span> <span class="s2">&quot;product.product&quot;</span><span class="w">
468
+
469
+ </span> <span class="k">def</span><span class="w"> </span><span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">vals</span><span class="p">):</span><span class="w">
470
+ </span> <span class="c1"># OVERRIDE: ``odoo.addons.product.models.product_product.Product.write()``</span><span class="w">
471
+ </span> <span class="c1"># override will clear the whole registry cache if either 'active' or</span><span class="w">
472
+ </span> <span class="c1"># 'product_template_attribute_value_ids' are found in the ``vals`` dictionary:</span><span class="w">
473
+ </span> <span class="c1"># remove them unless it's necessary to update them</span><span class="w">
474
+ </span> <span class="n">fnames</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;active&quot;</span><span class="p">,</span> <span class="s2">&quot;product_template_attribute_value_ids&quot;</span><span class="p">}</span><span class="w">
475
+ </span> <span class="k">if</span> <span class="n">vals_to_check</span> <span class="o">:=</span> <span class="p">{</span><span class="n">f</span><span class="p">:</span> <span class="n">vals</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fnames</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">vals</span><span class="p">)}:</span><span class="w">
476
+ </span> <span class="n">groups</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">browse</span><span class="p">())</span><span class="w">
477
+ </span> <span class="k">for</span> <span class="n">prod</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span><span class="w">
478
+ </span> <span class="n">groups</span><span class="p">[</span><span class="n">frozendict</span><span class="p">(</span><span class="n">prod</span><span class="o">.</span><span class="n">_get_write_diff_values</span><span class="p">(</span><span class="n">vals_to_check</span><span class="p">))]</span> <span class="o">+=</span> <span class="n">prod</span><span class="w">
479
+ </span> <span class="k">for</span> <span class="n">diff_vals</span><span class="p">,</span> <span class="n">prods</span> <span class="ow">in</span> <span class="n">groups</span><span class="o">.</span><span class="n">items</span><span class="p">():</span><span class="w">
480
+ </span> <span class="k">if</span> <span class="n">res_vals</span> <span class="o">:=</span> <span class="p">(</span><span class="n">vals</span> <span class="o">|</span> <span class="nb">dict</span><span class="p">(</span><span class="n">diff_vals</span><span class="p">)):</span><span class="w">
481
+ </span> <span class="nb">super</span><span class="p">(</span><span class="n">ProductProduct</span><span class="p">,</span> <span class="n">prods</span><span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">res_vals</span><span class="p">)</span><span class="w">
482
+ </span> <span class="k">return</span> <span class="kc">True</span><span class="w">
483
+ </span> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">vals</span><span class="p">)</span>
484
+ </pre>
485
+ </div>
486
+ <div class="section" id="bug-tracker">
487
+ <h2><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h2>
488
+ <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-tools/issues">GitHub Issues</a>.
489
+ In case of trouble, please check there if your issue has already been reported.
490
+ If you spotted it first, help us to smash it by providing a detailed and welcomed
491
+ <a class="reference external" href="https://github.com/OCA/server-tools/issues/new?body=module:%20base_write_diff%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
492
+ <p>Do not contact contributors directly about support or help with technical issues.</p>
493
+ </div>
494
+ <div class="section" id="credits">
495
+ <h2><a class="toc-backref" href="#toc-entry-3">Credits</a></h2>
496
+ <div class="section" id="authors">
497
+ <h3><a class="toc-backref" href="#toc-entry-4">Authors</a></h3>
498
+ <ul class="simple">
499
+ <li>Camptocamp</li>
500
+ </ul>
501
+ </div>
502
+ <div class="section" id="contributors">
503
+ <h3><a class="toc-backref" href="#toc-entry-5">Contributors</a></h3>
504
+ <ul class="simple">
505
+ <li>Silvio Gregorini &lt;<a class="reference external" href="mailto:silvio.gregorini&#64;camptocamp.com">silvio.gregorini&#64;camptocamp.com</a>&gt;</li>
506
+ </ul>
507
+ </div>
508
+ <div class="section" id="maintainers">
509
+ <h3><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h3>
510
+ <p>This module is maintained by the OCA.</p>
511
+ <a class="reference external image-reference" href="https://odoo-community.org">
512
+ <img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
513
+ </a>
514
+ <p>OCA, or the Odoo Community Association, is a nonprofit organization whose
515
+ mission is to support the collaborative development of Odoo features and
516
+ promote its widespread use.</p>
517
+ <p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-tools/tree/17.0/base_write_diff">OCA/server-tools</a> project on GitHub.</p>
518
+ <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
519
+ </div>
520
+ </div>
521
+ </div>
522
+ </div>
523
+ </body>
524
+ </html>
@@ -0,0 +1 @@
1
+ from . import test_base_write_diff