Name: [Campaign] Brain v17 Complete: v1.4 + v2.0 Foundation — WI-1..WI-11 - Check the quality with Pylint: from test_lint to test_pylint

State: Failed finished in 13m

PR State: merged

PR Author: David Tran

PR Author Email:

PR: #22

Committer: David Tran

Committer Email: davidtran.hp@gmail.com

Commit: 6542611ea4b86fba596321d944795a99e829cbe4

Description:

                                [FIX] viin_brain,viin_web_editor: move ir.http override + fix JSON-RPC test format

- Move session_info editor_backend injection from viin_web_editor to viin_brain
  to satisfy viin_web_editor spike/pure-asset contract (test_rollback.py AC-5)
- Fix TestCollabStepController: wrap POST calls in JSON-RPC 2.0 envelope
  so Odoo's JsonRpcDispatcher passes params correctly to relay_step()
                                

Branch: 17.0

Instance ID: 0

Age:

Up-time:

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
04/30/2026 16:35:53 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
04/30/2026 16:35:53 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-6542611-221669 -d rb-6542611-221669-381167 --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 ;
04/30/2026 16:35:53 INFO
Container rb-6542611-221669-381167 started !
04/30/2026 16:50:04 INFO
Container rb-6542611-221669-381167 stopped !
04/30/2026 16:50:04 ERROR
odoo.addons.test_lint.tests.test_eslint: FAIL: TestESLint.test_eslint Traceback (most recent call last): File "/data/build/Viindoo-odoo-17.0/odoo/addons/test_lint/tests/test_eslint.py", line 41, in test_eslint self.assertEqual(process.returncode, 0, msg=process.stdout.decode()) AssertionError: 1 != 0 : /data/build/rb-6542611-221669/viin_web_editor/static/src/adapters/tiptap_adapter.js 169:81 error Parsing error: Unexpected token ) ✖ 1 problem (1 error, 0 warnings)
04/30/2026 16:50:04 ERROR
odoo.modules.loading: Module test_lint: 1 failures, 0 errors of 15 tests
04/30/2026 16:50:04 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-6542611-221669/viin_brain/static/src/components/database_view/database_board_view.js 32:17 error Insert `⏎············(` prettier/prettier 33:1 error Replace `············(p)·=>·p.property_type·===·'select'·||·p.property_type·===·'multi_select'` with `················(p)·=>·p.property_type·===·"select"·||·p.property_type·===·"multi_select"` prettier/prettier 34:1 error Replace `········)·||·null` with `············)·||·null⏎········)` prettier/prettier 41:21 error Replace `{·key:·'__all__',·label:·_t('All·items'),·color:·null,·rows:·[...this.props.rows]·}` with `⏎················{·key:·"__all__",·label:·_t("All·items"),·color:·null,·rows:·[...this.props.rows]·},⏎············` prettier/prettier 56:16 error Replace `'__none__']·=·{·key:·'__none__',·label:·_t('None'` with `"__none__"]·=·{·key:·"__none__",·label:·_t("None"` prettier/prettier 62:24 error Replace `'__none__'` with `"__none__"` prettier/prettier 76:29 error Replace `'__none__'` with `"__none__"` prettier/prettier 94:68 error Replace `''` with `""` prettier/prettier 104:41 error Replace `'move'` with `"move"` prettier/prettier 105:33 error Replace `'text/plain'` with `"text/plain"` prettier/prettier 116:38 error Replace `'move'` with `"move"` prettier/prettier 140:38 error Replace `'__all__'` with `"__all__"` prettier/prettier 147:44 error Replace `'__none__'` with `"__none__"` prettier/prettier 151:42 error Replace `'Could·not·move·record'),·{·type:·'danger'` with `"Could·not·move·record"),·{·type:·"danger"` prettier/prettier /data/build/rb-6542611-221669/viin_brain/static/src/components/database_view/database_calendar_view.js 12:23 error Replace `'viin_brain.DatabaseCalendarView'` with `"viin_brain.DatabaseCalendarView"` prettier/prettier 28:78 error Replace `'date'` with `"date"` prettier/prettier 46:19 error Replace `'numeric'` with `"numeric"` prettier/prettier 47:20 error Replace `'long'` with `"long"` prettier/prettier 53:17 error Replace `'Sun',·'Mon',·'Tue',·'Wed',·'Thu',·'Fri',·'Sat'` with `"Sun",·"Mon",·"Tue",·"Wed",·"Thu",·"Fri",·"Sat"` prettier/prettier 85:47 error Replace `'0'` with `"0"` prettier/prettier 86:39 error Replace `'0'` with `"0"` prettier/prettier 87:20 error Replace `'-'` with `"-"` prettier/prettier 110:52 error Replace `'0'` with `"0"` prettier/prettier 111:47 error Replace `'0'` with `"0"` prettier/prettier 112:16 error Replace `'-'` with `"-"` prettier/prettier 154:41 error Replace `'move'` with `"move"` prettier/prettier 155:33 error Replace `'text/plain'` with `"text/plain"` prettier/prettier 160:38 error Replace `'move'` with `"move"` prettier/prettier /data/build/rb-6542611-221669/viin_brain/static/src/components/database_view/database_gallery_view.js 7:5 error Replace `'#4f6ef7',·'#22c55e',·'#f59e0b',·'#ef4444'` with `"#4f6ef7",⏎····"#22c55e",⏎····"#f59e0b",⏎····"#ef4444"` prettier/prettier 8:5 error Replace `'#8b5cf6',·'#06b6d4',·'#ec4899',·'#14b8a6'` with `"#8b5cf6",⏎····"#06b6d4",⏎····"#ec4899",⏎····"#14b8a6"` prettier/prettier 23:22 error Replace `'?'` with `"?"` prettier/prettier 32:23 error Replace `'viin_brain.DatabaseGalleryView'` with `"viin_brain.DatabaseGalleryView"` prettier/prettier 48:40 error Replace `'url'·||·p.property_type·===·'image'` with `"url"·||·p.property_type·===·"image"` prettier/prettier 53:32 error Replace `'image'` with `"image"` prettier/prettier 57:19 error Replace `'color'` with `"color"` prettier/prettier 64:68 error Replace `''` with `""` prettier/prettier /data/build/rb-6542611-221669/viin_brain/static/src/components/database_view/database_view.js 133:88 error Replace `'date'` with `"date"` prettier/prettier 138:33 error Replace `⏎················'viin.brain.database.view',⏎················'brain_update_row_date',` with `"viin.brain.database.view",·"brain_update_row_date",·[` prettier/prettier 141:17 error Replace `[pageId,·dateProp.technical_name,·newDateStr]` with `pageId,⏎················dateProp.technical_name,⏎················newDateStr,` prettier/prettier 142:13 error Insert `]` prettier/prettier 145:38 error Replace `'Could·not·update·date'),·{·type:·'danger'` with `"Could·not·update·date"),·{·type:·"danger"` prettier/prettier 153:33 error Replace `⏎················'viin.brain.database.view',⏎················'brain_update_property_value',` with `"viin.brain.database.view",·"brain_update_property_value",·[` prettier/prettier 156:17 error Replace `[pageId,·technicalName,·newOptionId]` with `pageId,⏎················technicalName,⏎················newOptionId,` prettier/prettier 157:13 error Insert `]` prettier/prettier /data/build/rb-6542611-221669/viin_brain/static/src/components/page_editor/page_editor.js 72:46 error Replace `'viin_brain.collab_step'` with `"viin_brain.collab_step"` prettier/prettier 75:25 error Replace `·(typeof·crypto·!==·'undefined'·&&·crypto.randomUUID)` with `⏎············typeof·crypto·!==·"undefined"·&&·crypto.randomUUID` prettier/prettier 76:1 error Replace `············` with `················` prettier/prettier 77:1 error Insert `····` prettier/prettier 385:44 error Replace `⏎················pageId,⏎················{·html_snapshot:·html·},⏎················this._clientId,⏎············` with `pageId,·{·html_snapshot:·html·},·this._clientId` prettier/prettier 437:68 error Replace `⏎············pageId,⏎···········` with `pageId,` prettier/prettier 440:1 error Delete `····` prettier/prettier 441:1 error Replace `················` with `············` prettier/prettier 442:17 error Delete `····` prettier/prettier 443:13 error Delete `····` prettier/prettier 444:1 error Delete `····` prettier/prettier 445:9 error Replace `····},⏎········` with `}` prettier/prettier 458:48 error Replace `'function'` with `"function"` prettier/prettier /data/build/rb-6542611-221669/viin_brain/static/src/services/collab_presence_service.js 33:26 error Replace `'@web/core/registry'` with `"@web/core/registry"` prettier/prettier 92:27 error Replace `'join'·||·msg.event·===·'heartbeat'` with `"join"·||·msg.event·===·"heartbeat"` prettier/prettier 99:34 error Replace `'leave'` with `"leave"` prettier/prettier 147:30 error Replace `'viin_brain.presence'` with `"viin_brain.presence"` prettier/prettier 151:28 error Replace `'viin.brain.page',·'action_presence_open'` with `"viin.brain.page",·"action_presence_open"` prettier/prettier 159:32 error Replace `'viin.brain.page',·'action_presence_heartbeat'` with `"viin.brain.page",·"action_presence_heartbeat"` prettier/prettier 186:28 error Replace `'viin.brain.page',·'action_presence_close'` with `"viin.brain.page",·"action_presence_close"` prettier/prettier 192:51 error Replace `'function'` with `"function"` prettier/prettier 193:40 error Replace `'viin_brain.presence'` with `"viin_brain.presence"` prettier/prettier 194:66 error Replace `'function'` with `"function"` prettier/prettier 195:48 error Replace `'viin_brain.presence'` with `"viin_brain.presence"` prettier/prettier 201:53 error Replace `'function'` with `"function"` prettier/prettier 235:20 error Replace `'orm',·'bus_service',·'user'` with `"orm",·"bus_service",·"user"` prettier/prettier 241:19 error Replace `'services').add('viin_brain.collab_presence'` with `"services").add("viin_brain.collab_presence"` prettier/prettier /data/build/rb-6542611-221669/viin_brain/static/src/services/collab_step_service.js 30:26 error Replace `'@web/core/registry'` with `"@web/core/registry"` prettier/prettier 97:34 error Replace `'editor_collaboration'` with `"editor_collaboration"` prettier/prettier 119:51 error Replace `'function'` with `"function"` prettier/prettier 120:40 error Replace `'editor_collaboration'` with `"editor_collaboration"` prettier/prettier 121:66 error Replace `'function'` with `"function"` prettier/prettier 122:48 error Replace `'editor_collaboration'` with `"editor_collaboration"` prettier/prettier 126:53 error Replace `'function'` with `"function"` prettier/prettier 160:23 error Replace `'/viin_brain/collab/step'` with `"/viin_brain/collab/step"` prettier/prettier 185:30 error Replace `'same-origin'` with `"same-origin"` prettier/prettier 200:20 error Replace `'rpc',·'bus_service'` with `"rpc",·"bus_service"` prettier/prettier 206:19 error Replace `'services').add('viin_brain.collab_step'` with `"services").add("viin_brain.collab_step"` prettier/prettier /data/build/rb-6542611-221669/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-6542611-221669/viin_brain/static/tests/tours/brain_collab_activation_tour.js 44:26 error Replace `'@web/core/registry'` with `"@web/core/registry"` prettier/prettier 45:34 error Replace `'./helpers'` with `"./helpers"` prettier/prettier 47:19 error Replace `'web_tour.tours').add('brain_collab_activation'` with `"web_tour.tours").add("brain_collab_activation"` prettier/prettier 49:10 error Replace `'/web#action=viin_brain.action_viin_brain_app'` with `"/web#action=viin_brain.action_viin_brain_app"` prettier/prettier 52:22 error Replace `'Brain·app·mounted'` with `"Brain·app·mounted"` prettier/prettier 53:22 error Replace `'.o_brain_app'` with `".o_brain_app"` prettier/prettier 58:22 error Replace `'Open·a·page·in·the·editor'` with `"Open·a·page·in·the·editor"` prettier/prettier 59:22 error Replace `'.o_brain_page_row:has(.o_brain_page_name)'` with `".o_brain_page_row:has(.o_brain_page_name)"` prettier/prettier 62:22 error Replace `'Editor·header·is·visible'` with `"Editor·header·is·visible"` prettier/prettier 63:22 error Replace `'.o_brain_editor_header'` with `".o_brain_editor_header"` prettier/prettier 67:22 error Replace `'Verify·collab·step·service·is·registered·in·the·service·registry'` with `"Verify·collab·step·service·is·registered·in·the·service·registry"` prettier/prettier 68:22 error Replace `'.o_brain_editor_header'` with `".o_brain_editor_header"` prettier/prettier 72:59 error Replace `'services'` with `"services"` prettier/prettier 73:47 error Replace `'viin_brain.collab_step'` with `"viin_brain.collab_step"` prettier/prettier 75:25 error Replace `'WI-9:·viin_brain.collab_step·service·is·not·registered.·'` with `"WI-9:·viin_brain.collab_step·service·is·not·registered.·"` prettier/prettier 76:1 error Replace `························'Check·that·collab_step_service.js·is·loaded·in·web.assets_backend.',` with `····························"Check·that·collab_step_service.js·is·loaded·in·web.assets_backend."` prettier/prettier 82:22 error Replace `'Verify·collab·presence·service·is·registered·(WI-3·prerequisite)'` with `"Verify·collab·presence·service·is·registered·(WI-3·prerequisite)"` prettier/prettier 83:22 error Replace `'.o_brain_editor_header'` with `".o_brain_editor_header"` prettier/prettier 85:59 error Replace `'services'` with `"services"` prettier/prettier 86:47 error Replace `'viin_brain.collab_presence'` with `"viin_brain.collab_presence"` prettier/prettier 88:25 error Replace `'WI-9:·viin_brain.collab_presence·service·is·not·registered.·'` with `"WI-9:·viin_brain.collab_presence·service·is·not·registered.·"` prettier/prettier 89:25 error Replace `'WI-3·collab_presence_service.js·dependency·missing.',` with `····"WI-3·collab_presence_service.js·dependency·missing."` prettier/prettier 95:22 error Replace `'Body·editor·is·visible·and·editable·(collab·wiring·does·not·break·editing)'` with `"Body·editor·is·visible·and·editable·(collab·wiring·does·not·break·editing)"` prettier/prettier /data/build/rb-6542611-221669/viin_brain/static/tests/tours/brain_database_calendar_tour.js 3:26 error Replace `'@web/core/registry'` with `"@web/core/registry"` prettier/prettier 4:34 error Replace `'./helpers'` with `"./helpers"` prettier/prettier 18:19 error Replace `'web_tour.tours').add('brain_database_calendar_tour'` with `"web_tour.tours").add("brain_database_calendar_tour"` prettier/prettier 19:10 error Replace `'/odoo/brain'` with `"/odoo/brain"` prettier/prettier 25:22 error Replace `'Open·the·Contracts·Database·page'` with `"Open·the·Contracts·Database·page"` prettier/prettier 26:18 error Replace `'click'` with `"click"` prettier/prettier 30:22 error Replace `'.o_brain_database_view·.o_brain_db_toolbar'` with `".o_brain_database_view·.o_brain_db_toolbar"` prettier/prettier 31:22 error Replace `'Verify·database·toolbar·is·rendered'` with `"Verify·database·toolbar·is·rendered"` prettier/prettier 36:22 error Replace `'Click·the·Calendar·tab'` with `"Click·the·Calendar·tab"` prettier/prettier 37:18 error Replace `'click'` with `"click"` prettier/prettier 41:22 error Replace `'.o_brain_db_calendar'` with `".o_brain_db_calendar"` prettier/prettier 42:22 error Replace `'Verify·Calendar·view·container·is·rendered'` with `"Verify·Calendar·view·container·is·rendered"` prettier/prettier 46:22 error Replace `'.o_brain_calendar_weekdays'` with `".o_brain_calendar_weekdays"` prettier/prettier 47:22 error Replace `'Verify·weekday·header·row·is·rendered'` with `"Verify·weekday·header·row·is·rendered"` prettier/prettier 51:22 error Replace `'.o_brain_calendar_week'` with `".o_brain_calendar_week"` prettier/prettier 52:22 error Replace `'Verify·at·least·one·calendar·week·row·is·rendered'` with `"Verify·at·least·one·calendar·week·row·is·rendered"` prettier/prettier 57:22 error Replace `'.o_brain_calendar_nav·.fa-chevron-right'` with `".o_brain_calendar_nav·.fa-chevron-right"` prettier/prettier 58:22 error Replace `'Click·next·month·button'` with `"Click·next·month·button"` prettier/prettier 59:18 error Replace `'click'` with `"click"` prettier/prettier 62:22 error Replace `'.o_brain_calendar_nav·.fw-semibold'` with `".o_brain_calendar_nav·.fw-semibold"` prettier/prettier 63:22 error Replace `'Verify·month·label·updated·after·navigating·to·next·month'` with `"Verify·month·label·updated·after·navigating·to·next·month"` prettier/prettier 69:22 error Replace `'Click·Today·button·to·return·to·current·month'` with `"Click·Today·button·to·return·to·current·month"` prettier/prettier 70:18 error Replace `'click'` with `"click"` prettier/prettier 73:22 error Replace `'.o_brain_calendar_cell--today'` with `".o_brain_calendar_cell--today"` prettier/prettier 74:22 error Replace `'Verify·today·cell·is·highlighted·after·returning·to·current·month'` with `"Verify·today·cell·is·highlighted·after·returning·to·current·month"` prettier/prettier /data/build/rb-6542611-221669/viin_brain/static/tests/tours/brain_presence_pill.js 24:26 error Replace `'@web/core/registry'` with `"@web/core/registry"` prettier/prettier 25:34 error Replace `'./helpers'` with `"./helpers"` prettier/prettier 27:19 error Replace `'web_tour.tours').add('brain_presence_pill'` with `"web_tour.tours").add("brain_presence_pill"` prettier/prettier 29:10 error Replace `'/web#action=viin_brain.action_viin_brain_app'` with `"/web#action=viin_brain.action_viin_brain_app"` prettier/prettier 32:22 error Replace `'Brain·app·mounted'` with `"Brain·app·mounted"` prettier/prettier 33:22 error Replace `'.o_brain_app'` with `".o_brain_app"` prettier/prettier 38:22 error Replace `'Click·the·Welcome·page·to·open·it·in·the·editor'` with `"Click·the·Welcome·page·to·open·it·in·the·editor"` prettier/prettier 42:22 error Replace `'Editor·header·is·visible·(page·loaded·in·edit·mode)'` with `"Editor·header·is·visible·(page·loaded·in·edit·mode)"` prettier/prettier 43:22 error Replace `'.o_brain_editor_header'` with `".o_brain_editor_header"` prettier/prettier 47:22 error Replace `'PresencePill·group·is·rendered·in·the·editor·header'` with `"PresencePill·group·is·rendered·in·the·editor·header"` prettier/prettier 48:22 error Replace `'.o_brain_presence_pill_group'` with `".o_brain_presence_pill_group"` prettier/prettier 52:22 error Replace `'Self-user·pill·is·present·inside·the·pill·group'` with `"Self-user·pill·is·present·inside·the·pill·group"` prettier/prettier 53:22 error Replace `'.o_brain_presence_pill_group·.o_brain_presence_pill'` with `".o_brain_presence_pill_group·.o_brain_presence_pill"` prettier/prettier 57:21 error Replace `·'No·peer·pills·visible·when·only·one·user·is·editing·(AC-SCREENSHOT-1·single-user·assert)'` with `⏎················"No·peer·pills·visible·when·only·one·user·is·editing·(AC-SCREENSHOT-1·single-user·assert)"` prettier/prettier 58:22 error Replace `'.o_brain_presence_pill_group'` with `".o_brain_presence_pill_group"` prettier/prettier 61:58 error Replace `'.o_brain_presence_pill--peer'` with `".o_brain_presence_pill--peer"` prettier/prettier 64:25 error Replace `'WI-3·AC-4:·Expected·0·peer·pills·when·only·the·current·user·'` with `"WI-3·AC-4:·Expected·0·peer·pills·when·only·the·current·user·"` prettier/prettier 65:25 error Insert `····` prettier/prettier 66:1 error Replace `························'NOTE:·if·a·second·test·session·is·also·running·the·brain·app·'` with `····························"NOTE:·if·a·second·test·session·is·also·running·the·brain·app·"` prettier/prettier 67:1 error Replace `························'on·this·page,·dismiss·it·before·re-running·the·tour.'` with `····························"on·this·page,·dismiss·it·before·re-running·the·tour."` prettier/prettier /data/build/rb-6542611-221669/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-6542611-221669/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)·=>·({·"<":·"&lt;",·">":·"&gt;",·"&":·"&amp;",·'"':·"&quot;"·})[c],` with `········(c)·=>·({·"<":·"&lt;",·">":·"&gt;",·"&":·"&amp;",·'"':·"&quot;"·}[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 /data/build/rb-6542611-221669/viin_web_editor/static/src/adapters/tiptap_adapter.js 169:81 error Parsing error: Unexpected token ) ✖ 399 problems (399 errors, 0 warnings) 398 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:
04/30/2026 16:50:04 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-6542611-221669/viin_brain/tests/test_perf_large_vault.py:34:1: E402 module level import not at top of file
04/30/2026 16:50:04 ERROR
odoo.modules.loading: Module test_pylint: 2 failures, 0 errors of 7 tests
04/30/2026 16:50:04 ERROR
odoo.modules.loading: At least one test failed when loading the modules.
04/30/2026 16:50:04 ERROR
odoo.tests.result: 3 failed, 0 error(s) of 24 tests when loading database 'rb-6542611-221669-381167'
04/30/2026 16:50:04 INFO
Cleaning all resource
04/30/2026 16:50:04 INFO
Cleanup finished