[FIX] viin_ai_chat: tour menu xmlid typo (legacy cleanup)
Tour tour_c2_ux_newbie_onboarding searched for an Apps tile with
data-menu-xmlid='viin_ai_base.menu_root_viin_ai', but the actual
xmlid declared in viin_ai_base/views/menus.xml is 'menu_root_ai'.
Mismatch surfaced as a tour failure on every install — pre-existing
legacy typo (not caused by this campaign).
Plan §"Quy tắc fix legacy errors/warnings" allows root-cause fixes
in cluster viin_ai_*; this is a 1-character correction with zero
behavioural change beyond letting the tour find its target.
Odoo 17 Test Suite Using Docker
Check the quality with Pylint: from test_lint to test_pylint
- install_module test_lint,test_pylint
- exec_odoo --db_port 5432 --log-level=test --max-cron-threads=0 --load=base,web,to_base --stop-after-init --test-enable --test-tags=/test_lint,/test_pylint,/test_lint,/test_pylint,-:.test_pofiles_string_formatting
| Create Date | Level | Message |
|---|---|---|
| 05/02/2026 01:05:44 | INFO |
Using Docker Image Odoo 17 Ubuntu 22.04 Python 3.10:
FROM ubuntu:jammy ENV LANG C.UTF-8 USER root SHELL ["/bin/bash", "-c"] # Install debian packages RUN set -x ; \ apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends apt-transport-https build-essential ca-certificates curl ffmpeg file fonts-freefont-ttf fonts-noto-cjk gawk gnupg gsfonts libldap2-dev libjpeg9-dev libsasl2-dev libxslt1-dev lsb-release node-less ocrmypdf sed sudo unzip xfonts-75dpi zip zlib1g-dev git build-essential cython3 libffi-dev libev-dev \ && rm -rf /var/lib/apt/lists/* # Install Python3 packages RUN set -x ; \ apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends python3 python3-dbfread python3-dev python3-pip python3-setuptools python3-wheel python3-markdown python3-mock python3-phonenumbers python3-websocket python3-cffi libpq-dev \ && rm -rf /var/lib/apt/lists/* # Install wkhtml RUN curl -sSL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb -o /tmp/wkhtmltox_0.12.6-1.focal_amd64.deb \ && curl -sSL http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb -o /tmp/libssl1.1_1.1.0g-2ubuntu4_amd64.deb \ && apt-get update \ && dpkg -i /tmp/libssl1.1_1.1.0g-2ubuntu4_amd64.deb \ && apt install -y -f --no-install-recommends /tmp/wkhtmltox_0.12.6-1.focal_amd64.deb \ && rm /tmp/libssl1.1_1.1.0g-2ubuntu4_amd64.deb /tmp/wkhtmltox_0.12.6-1.focal_amd64.deb # Install Odoo:Depends ADD https://raw.githubusercontent.com/brendangregg/FlameGraph/master/flamegraph.pl /usr/local/bin/flamegraph.pl RUN chmod +rx /usr/local/bin/flamegraph.pl ADD https://raw.githubusercontent.com/Viindoo/odoo/17.0/debian/control /tmp/control.txt RUN apt-get update \ && sed -n '/^Depends:/,/^[A-Z]/p' /tmp/control.txt \ | awk '/^ [a-z]/ { gsub(/,/,"") ; print $1 }' | sort -u \ | egrep -v 'postgresql-client' \ | sed 's/python-imaging/python-pil/'| sed 's/python-pypdf/python-pypdf2/' | sed 's/python3-lxml-html-clean/python3-lxml/' \ | DEBIAN_FRONTEND=noninteractive xargs apt-get install -y -qq \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* RUN python3 -m pip install --no-cache-dir setuptools wheel && \ python3 -m pip install coverage==7.4.4 flamegraph RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y postgresql-client-14 \ && rm -rf /var/lib/apt/lists/* # Install Google Chrome #RUN curl -sSL https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -o /tmp/chrome.deb \ # && apt-get update \ # && apt-get -y install --no-install-recommends /tmp/chrome.deb \ # && rm /tmp/chrome.deb # Install phantomjs RUN curl -sSL https://nightly.odoo.com/resources/phantomjs.tar.bz2 -o /tmp/phantomjs.tar.bz2 \ && tar xvfO /tmp/phantomjs.tar.bz2 phantomjs-2.1.1-linux-x86_64/bin/phantomjs > /usr/local/bin/phantomjs \ && chmod +x /usr/local/bin/phantomjs \ && rm -f /tmp/phantomjs.tar.bz2 ADD https://raw.githubusercontent.com/Viindoo/odoo/17.0/requirements.txt /root/requirements.txt RUN python3 -m pip install --no-cache-dir wheel setuptools && \ python3 -m pip install --upgrade --no-cache-dir -r /root/requirements.txt && \ python3 -m pip install --no-cache-dir ebaysdk==2.1.5 pdf417gen==0.7.1 RUN python3 -m pip install --no-cache-dir requests pyOpenSSL # Install debian packages RUN set -x ; \ apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends openssl iputils-ping openssh-client chromium-browser \ && rm -rf /var/lib/apt/lists/* RUN python3 -m pip install --no-cache-dir --upgrade websocket-client==1.2.3 flake8==4.0.1 RUN python3 -m pip uninstall pylint pylint-odoo isort Pygments -y RUN python3 -m pip install --no-cache-dir --upgrade pylint-odoo==9.0.5 RUN python3 -m pip install --no-cache-dir --upgrade Pygments==2.14.0 --no-deps RUN python3 -m pip install --no-cache-dir --upgrade odoo_test_helper # Install nodejs RUN curl -fsSLO --compressed "https://nodejs.org/dist/v18.20.0/node-v18.20.0-linux-x64.tar.xz" \ && tar -xJf "node-v18.20.0-linux-x64.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ && rm "node-v18.20.0-linux-x64.tar.xz" \ && ln -s /usr/local/bin/node /usr/local/bin/nodejs #RUN npm install -g rtlcss es-check eslint@8 RUN python3 -m pip install --no-cache-dir --upgrade setuptools==61 # để tương thích với python-pkcs11-0.7.0 # Install cloc package RUN set -x ; \ apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends cloc \ && rm -rf /var/lib/apt/lists/* RUN npm install -g rtlcss@3.4.0 es-check@6.0.0 eslint@8.57.1 prettier@2.7.1 eslint-config-prettier@8.5.0 eslint-plugin-prettier@4.2.1 --save-dev |
| 05/02/2026 01:05:44 | INFO |
Docker command:
cd /data/build; python3 -m pip install --user --progress-bar off -r Viindoo-tvtmaaddons-17.0/requirements.txt && python3 -m pip install --user --progress-bar off -r Viindoo-erponline-enterprise-17.0/requirements.txt && python3 Viindoo-odoo-17.0/odoo-bin --addons-path Viindoo-odoo-17.0/odoo/addons,Viindoo-odoo-17.0/addons,Viindoo-tvtmaaddons-17.0,Viindoo-erponline-enterprise-17.0,Viindoo-branding-17.0,rb-7c32844-221676 -d rb-7c32844-221676-381254 --data-dir /data/build/datadir -i test_lint,test_pylint --db_port 5432 --log-level=test --max-cron-threads=0 --load=base,web,to_base --stop-after-init --test-enable --test-tags=/test_lint,/test_pylint,/test_lint,/test_pylint,-:.test_pofiles_string_formatting ; |
| 05/02/2026 01:05:44 | INFO |
Container rb-7c32844-221676-381254 started !
|
| 05/02/2026 01:20:07 | INFO |
Container rb-7c32844-221676-381254 stopped !
|
| 05/02/2026 01:20:07 | ERROR |
odoo.addons.test_pylint.tests.test_eslint: FAIL: TestESLint.test_eslint
Traceback (most recent call last):
File "/data/build/Viindoo-tvtmaaddons-17.0/test_pylint/tests/test_eslint.py", line 67, in test_eslint
self.assertEqual(process.returncode, 0, msg=f"""
AssertionError: 1 != 0 :
stdout:
/data/build/rb-7c32844-221676/viin_brain/static/tests/components/floating_toolbar_focus_tests.js
47:19 error Replace `⏎············buttons.length·>=·10,⏎············`expected·≥·10·toolbar·buttons,·got·${buttons.length}`⏎········` with `buttons.length·>=·10,·`expected·≥·10·toolbar·buttons,·got·${buttons.length}`` prettier/prettier
96:46 error Replace `⏎················`.o_brain_floating_toolbar·button[title="${title}"]`⏎············` with ``.o_brain_floating_toolbar·button[title="${title}"]`` prettier/prettier
/data/build/rb-7c32844-221676/viin_brain_account_reports/static/src/embed_report_lazy_loader.js
40:3 error Insert `··` prettier/prettier
41:1 error Replace `····` with `········` prettier/prettier
42:1 error Insert `····` prettier/prettier
43:1 error Replace `······` with `············` prettier/prettier
44:1 error Replace `········` with `················` prettier/prettier
45:9 error Insert `········` prettier/prettier
46:1 error Insert `··········` prettier/prettier
47:1 error Replace `············` with `························` prettier/prettier
48:1 error Replace `··········}ms`,` with `····················}ms`` prettier/prettier
49:1 error Replace `········` with `················` prettier/prettier
50:1 error Insert `········` prettier/prettier
51:7 error Insert `······` prettier/prettier
52:1 error Replace `······` with `············` prettier/prettier
53:1 error Insert `········` prettier/prettier
54:1 error Replace `········` with `················` prettier/prettier
55:1 error Replace `········` with `················` prettier/prettier
56:9 error Insert `········` prettier/prettier
57:1 error Replace `······},` with `············}` prettier/prettier
58:1 error Replace `····` with `········` prettier/prettier
59:1 error Insert `··` prettier/prettier
60:3 error Insert `··` prettier/prettier
68:3 error Insert `··` prettier/prettier
69:3 error Insert `··` prettier/prettier
70:1 error Replace `····` with `········` prettier/prettier
71:1 error Replace `····` with `········` prettier/prettier
72:1 error Insert `····` prettier/prettier
73:5 error Insert `····` prettier/prettier
74:1 error Replace `··` with `····` prettier/prettier
75:1 error Insert `··` prettier/prettier
79:3 error Insert `··` prettier/prettier
80:1 error Insert `····` prettier/prettier
81:1 error Insert `··` prettier/prettier
82:5 error Insert `····` prettier/prettier
83:1 error Insert `····` prettier/prettier
84:1 error Replace `····console.error(⏎······"[viin_brain_account_reports]·lazy·bundle·load·failed·(block)",⏎······err,` with `········console.error("[viin_brain_account_reports]·lazy·bundle·load·failed·(block)",·err);` prettier/prettier
87:5 error Replace `);` with `}` prettier/prettier
88:3 error Delete `}⏎` prettier/prettier
90:1 error Replace `··` with `····` prettier/prettier
91:1 error Insert `··` prettier/prettier
92:1 error Replace `··` with `····` prettier/prettier
93:1 error Insert `··` prettier/prettier
106:3 error Insert `··` prettier/prettier
107:1 error Insert `··` prettier/prettier
108:1 error Replace `····(el)·=>·el.dataset.staticMount·!==·"editor",` with `········(el)·=>·el.dataset.staticMount·!==·"editor"` prettier/prettier
109:1 error Insert `··` prettier/prettier
110:1 error Insert `··` prettier/prettier
111:1 error Replace `····` with `········` prettier/prettier
112:3 error Insert `··` prettier/prettier
113:1 error Insert `··` prettier/prettier
114:1 error Replace `····` with `········` prettier/prettier
115:1 error Replace `····` with `········` prettier/prettier
116:5 error Insert `····` prettier/prettier
117:1 error Replace `····` with `········` prettier/prettier
118:1 error Replace `······` with `············` prettier/prettier
119:5 error Insert `····` prettier/prettier
120:1 error Replace `····` with `········` prettier/prettier
121:3 error Insert `··` prettier/prettier
122:1 error Insert `··` prettier/prettier
123:5 error Insert `····` prettier/prettier
124:1 error Replace `······` with `············` prettier/prettier
125:1 error Insert `········` prettier/prettier
126:11 error Insert `··········` prettier/prettier
127:1 error Replace `··········` with `····················` prettier/prettier
128:9 error Insert `········` prettier/prettier
129:1 error Insert `······` prettier/prettier
130:5 error Insert `····` prettier/prettier
131:1 error Replace `····{·rootMargin:·ROOT_MARGIN·},` with `········{·rootMargin:·ROOT_MARGIN·}` prettier/prettier
132:1 error Insert `··` prettier/prettier
133:1 error Replace `··` with `····` prettier/prettier
134:5 error Insert `····` prettier/prettier
135:1 error Insert `··` prettier/prettier
143:3 error Insert `··` prettier/prettier
149:1 error Insert `··` prettier/prettier
151:3 error Replace `document.addEventListener(⏎····"DOMContentLoaded",⏎····()·=>·observeReportBlocks(document),` with `··document.addEventListener("DOMContentLoaded",·()·=>·observeReportBlocks(document),·{` prettier/prettier
154:5 error Replace `{·once:·true·}` with `····once:·true` prettier/prettier
155:3 error Insert `··}` prettier/prettier
/data/build/rb-7c32844-221676/viin_brain_account_reports/static/src/slash_commands.js
32:3 error Insert `··` prettier/prettier
33:5 error Insert `····` prettier/prettier
34:1 error Insert `····` prettier/prettier
35:1 error Replace `······` with `············` prettier/prettier
36:1 error Insert `········` prettier/prettier
37:1 error Replace `········` with `················` prettier/prettier
38:1 error Insert `········` prettier/prettier
39:9 error Insert `········` prettier/prettier
40:1 error Replace `········` with `················` prettier/prettier
41:1 error Insert `··········` prettier/prettier
42:13 error Insert `············` prettier/prettier
43:1 error Replace `··········}ms`,` with `····················}ms`` prettier/prettier
44:1 error Replace `········` with `················` prettier/prettier
45:1 error Insert `········` prettier/prettier
46:7 error Insert `······` prettier/prettier
47:1 error Insert `······` prettier/prettier
48:1 error Replace `········` with `················` prettier/prettier
49:1 error Replace `········` with `················` prettier/prettier
50:7 error Replace `},` with `······}` prettier/prettier
51:5 error Insert `····` prettier/prettier
52:3 error Insert `··` prettier/prettier
53:1 error Insert `··` prettier/prettier
59:3 error Insert `··` prettier/prettier
60:5 error Insert `····` prettier/prettier
61:1 error Replace `····(c)·=>·({·"<":·"<",·">":·">",·"&":·"&",·'"':·"""·})[c],` with `········(c)·=>·({·"<":·"<",·">":·">",·"&":·"&",·'"':·"""·}[c])` prettier/prettier
62:1 error Insert `··` prettier/prettier
66:1 error Insert `··` prettier/prettier
67:5 error Insert `····` prettier/prettier
68:1 error Insert `··` prettier/prettier
69:3 error Replace `return·(⏎····"brain-report-"·+⏎····Date.now().toString(36)·+⏎····Math.random().toString(36).slice(2,·6)⏎··` with `··return·"brain-report-"·+·Date.now().toString(36)·+·Math.random().toString(36).slice(2,·6` prettier/prettier
77:3 error Insert `··` prettier/prettier
78:1 error Insert `····` prettier/prettier
79:3 error Insert `··` prettier/prettier
80:1 error Insert `··` prettier/prettier
81:3 error Insert `··` prettier/prettier
82:1 error Replace `····` with `········` prettier/prettier
83:3 error Insert `··` prettier/prettier
84:1 error Replace `··` with `····` prettier/prettier
85:1 error Insert `··` prettier/prettier
86:1 error Replace `··` with `····` prettier/prettier
87:1 error Insert `··` prettier/prettier
88:3 error Insert `··` prettier/prettier
91:34 error Replace `⏎··snapshotId,⏎··capturedByName,⏎··capturedAt,⏎··reportId,⏎` with `·snapshotId,·capturedByName,·capturedAt,·reportId·` prettier/prettier
97:3 error Replace `const·reportUrl·=⏎···` with `··const·reportUrl·=` prettier/prettier
99:1 error Replace `··` with `····` prettier/prettier
100:1 error Insert `····` prettier/prettier
101:7 error Replace `"Viewers·see·the·same·data·regardless·of·their·own·ACL.",` with `······"Viewers·see·the·same·data·regardless·of·their·own·ACL."` prettier/prettier
102:1 error Replace `··` with `····` prettier/prettier
103:1 error Insert `··` prettier/prettier
104:3 error Insert `··` prettier/prettier
105:1 error Replace `····` with `········` prettier/prettier
106:1 error Insert `····` prettier/prettier
107:3 error Insert `··` prettier/prettier
108:1 error Insert `····` prettier/prettier
109:1 error Insert `····` prettier/prettier
110:1 error Replace `····` with `········` prettier/prettier
111:1 error Replace `····` with `········` prettier/prettier
112:1 error Replace `····` with `········` prettier/prettier
113:1 error Insert `····` prettier/prettier
114:5 error Insert `····` prettier/prettier
115:1 error Insert `····` prettier/prettier
116:5 error Insert `····` prettier/prettier
117:1 error Replace `··` with `····` prettier/prettier
121:3 error Insert `··` prettier/prettier
122:1 error Replace `··` with `····` prettier/prettier
123:1 error Insert `··` prettier/prettier
124:3 error Insert `··` prettier/prettier
125:1 error Replace `··` with `····` prettier/prettier
126:1 error Insert `··` prettier/prettier
127:3 error Insert `··` prettier/prettier
129:1 error Insert `··` prettier/prettier
130:1 error Replace `····` with `········` prettier/prettier
131:1 error Insert `····` prettier/prettier
132:1 error Replace `····` with `········` prettier/prettier
133:1 error Replace `····` with `········` prettier/prettier
134:1 error Replace `··` with `····` prettier/prettier
135:1 error Insert `··` prettier/prettier
136:3 error Insert `··` prettier/prettier
137:1 error Replace `··` with `····` prettier/prettier
138:1 error Insert `··` prettier/prettier
139:1 error Replace `··` with `····` prettier/prettier
140:1 error Insert `··` prettier/prettier
141:3 error Insert `··` prettier/prettier
142:1 error Insert `····` prettier/prettier
143:5 error Insert `····` prettier/prettier
144:1 error Replace `····` with `········` prettier/prettier
145:1 error Insert `····` prettier/prettier
146:1 error Replace `····` with `········` prettier/prettier
147:1 error Insert `····` prettier/prettier
148:5 error Insert `····` prettier/prettier
149:1 error Replace `····` with `········` prettier/prettier
150:5 error Insert `····` prettier/prettier
151:1 error Replace `····` with `········` prettier/prettier
152:1 error Replace `····` with `········` prettier/prettier
153:5 error Insert `····` prettier/prettier
154:1 error Insert `····` prettier/prettier
155:1 error Insert `····` prettier/prettier
156:3 error Insert `··` prettier/prettier
162:3 error Insert `··` prettier/prettier
163:1 error Insert `····` prettier/prettier
164:1 error Replace `······` with `············` prettier/prettier
165:1 error Replace `······:·wysiwyg.odooEditor·&&⏎········wysiwyg.odooEditor.options·&&⏎·······` with `············:·wysiwyg.odooEditor·&&·wysiwyg.odooEditor.options·&&` prettier/prettier
168:1 error Insert `··` prettier/prettier
169:1 error Replace `····` with `········` prettier/prettier
170:3 error Insert `··` prettier/prettier
172:1 error Replace `··const·bodyEl·=·document.querySelector(⏎····".o_brain_editor_body_edit[data-page-id]",⏎··` with `····const·bodyEl·=·document.querySelector(".o_brain_editor_body_edit[data-page-id]"` prettier/prettier
175:1 error Insert `··` prettier/prettier
176:3 error Insert `··` prettier/prettier
177:1 error Replace `····` with `········` prettier/prettier
178:3 error Insert `··` prettier/prettier
180:1 error Replace `··` with `····` prettier/prettier
181:3 error Insert `··` prettier/prettier
182:1 error Replace `··` with `····` prettier/prettier
183:1 error Insert `··` prettier/prettier
184:3 error Insert `··` prettier/prettier
185:1 error Insert `····` prettier/prettier
186:3 error Insert `··` prettier/prettier
187:1 error Replace `····env.services.notification.add(⏎······_t("Failed·to·load·report·editor·—·please·refresh."),` with `········env.services.notification.add(_t("Failed·to·load·report·editor·—·please·refresh."),·{` prettier/prettier
189:1 error Replace `······{·type:·"danger"·}` with `············type:·"danger"` prettier/prettier
190:1 error Replace `····` with `········}` prettier/prettier
191:1 error Insert `····` prettier/prettier
192:5 error Replace `console.error(⏎······"[viin_brain_account_reports]·lazy·bundle·failed·(slash·command)",⏎······err,` with `····console.error("[viin_brain_account_reports]·lazy·bundle·failed·(slash·command)",·err);` prettier/prettier
195:5 error Delete `);⏎` prettier/prettier
197:3 error Insert `··` prettier/prettier
199:1 error Replace `··const·{·EmbedReportPicker·}·=⏎···` with `····const·{·EmbedReportPicker·}·=` prettier/prettier
202:3 error Insert `··` prettier/prettier
203:1 error Replace `····` with `········` prettier/prettier
204:1 error Insert `······` prettier/prettier
205:1 error Replace `······` with `············` prettier/prettier
206:1 error Replace `······` with `············` prettier/prettier
207:1 error Replace `········result·=·await·env.services.rpc(⏎··········"/viin_brain_account_reports/embed/capture",` with `················result·=·await·env.services.rpc("/viin_brain_account_reports/embed/capture",·{` prettier/prettier
209:9 error Delete `··{⏎` prettier/prettier
211:1 error Replace `············` with `····················` prettier/prettier
212:1 error Insert `········` prettier/prettier
213:1 error Replace `············` with `····················` prettier/prettier
214:1 error Insert `········` prettier/prettier
215:11 error Replace `},⏎········` with `······}` prettier/prettier
217:1 error Insert `······` prettier/prettier
218:1 error Replace `········env.services.notification.add(⏎··········(err·&&·err.message)·||·_t("Capture·failed"),` with `················env.services.notification.add((err·&&·err.message)·||·_t("Capture·failed"),·{` prettier/prettier
220:9 error Delete `··{⏎` prettier/prettier
222:1 error Replace `··········},` with `················});` prettier/prettier
223:9 error Delete `);⏎` prettier/prettier
225:1 error Replace `······` with `············` prettier/prettier
226:1 error Insert `······` prettier/prettier
227:1 error Replace `········` with `················` prettier/prettier
228:9 error Insert `········` prettier/prettier
229:1 error Replace `········` with `················` prettier/prettier
230:7 error Insert `······` prettier/prettier
231:1 error Replace `······const·capturedByName·=⏎·······` with `············const·capturedByName·=` prettier/prettier
233:7 error Insert `······` prettier/prettier
234:1 error Replace `········` with `················` prettier/prettier
235:9 error Insert `········` prettier/prettier
236:1 error Replace `········` with `················` prettier/prettier
237:1 error Insert `········` prettier/prettier
238:1 error Replace `········` with `················` prettier/prettier
239:1 error Replace `········` with `················` prettier/prettier
240:1 error Insert `········` prettier/prettier
241:1 error Replace `······` with `············` prettier/prettier
242:1 error Insert `······` prettier/prettier
243:1 error Insert `····` prettier/prettier
244:5 error Insert `····` prettier/prettier
245:1 error Insert `··` prettier/prettier
250:3 error Insert `··` prettier/prettier
251:1 error Insert `··` prettier/prettier
252:3 error Replace `description:⏎···` with `··description:` prettier/prettier
254:3 error Insert `··` prettier/prettier
255:1 error Insert `··` prettier/prettier
256:3 error Insert `··` prettier/prettier
261:3 error Insert `··` prettier/prettier
262:1 error Insert `··` prettier/prettier
✖ 248 problems (248 errors, 0 warnings)
248 errors and 0 warnings potentially fixable with the `--fix` option.
Perhaps you might benefit from installing the tooling found at:
https://github.com/odoo/odoo/wiki/Javascript-coding-guidelines#use-a-linter
stderr:
|
| 05/02/2026 01:20:07 | ERROR |
odoo.addons.test_pylint.tests.test_flake8: FAIL: TestFlake8.test_flake8
Traceback (most recent call last):
File "/data/build/Viindoo-tvtmaaddons-17.0/test_pylint/tests/test_flake8.py", line 91, in test_flake8
self.fail("flake8 test failed:\n" + (b"\n" + out + b"\n" + err).decode('utf-8').strip())
AssertionError: flake8 test failed:
/data/build/rb-7c32844-221676/viin_brain/tests/test_perf_large_vault.py:34:1: E402 module level import not at top of file
/data/build/rb-7c32844-221676/viin_ai_agent/tests/test_sql_template.py:156:9: F841 local variable 'p_visible' is assigned to but never used
/data/build/rb-7c32844-221676/viin_ai_chat/models/mail_compose_message.py:17:1: F401 'odoo.api' imported but unused
|
| 05/02/2026 01:20:07 | ERROR |
odoo.modules.loading: Module test_pylint: 2 failures, 0 errors of 7 tests
|
| 05/02/2026 01:20:07 | ERROR |
odoo.modules.loading: At least one test failed when loading the modules.
|
| 05/02/2026 01:20:07 | ERROR |
odoo.tests.result: 2 failed, 0 error(s) of 24 tests when loading database 'rb-7c32844-221676-381254'
|
| 05/02/2026 01:20:07 | INFO |
Cleaning all resource
|
| 05/02/2026 01:20:07 | INFO |
Cleanup finished
|