Name: [FIX] pos_loyalty, sale_loyalty: backport two upstream loyalty fixes - Post install tests: from test_mail to to_product_return_reason_stock

State: Failed finished in 69m

PR State: open

PR Author: David Tran

PR Author Email:

PR: #1290

Committer: David Tran

Committer Email: david.tran@tvtmarine.com

Commit: c855d12ce8bceca251d4c4707fe9d0fa67df3a97

Description:

                                [FIX] sale_loyalty: allow invoicing-only users to open sale orders

Steps to reproduce:
1. Create a user in the Invoicing group (account.group_account_invoice)
   only, without any Sales group.
2. As that user, open any sale order form (draft or confirmed with
   loyalty history).

Issue:
The form never opens; the client raises "You are not allowed to
access 'Loyalty Coupon' (loyalty.card) records". This blocks a user
who already has read/write access to sale.order in core, via the
access_sale_order_invoicing_payments rule in sale's own security
CSV, from doing their job.

Cause:
Two non-sudo reads in the sale.order extension hit loyalty models
that are restricted to the Sales groups: the gift card stat button
count queries loyalty.card directly, and the loyalty summary looks
up the coupon point name via coupon_point_ids.coupon_id without the
sudo already used one line above for loyalty.history.

Fix:
Gate the gift card count query behind a has_access('read') check, so
a user without access simply sees a zero count (the stat button
stays hidden), matching the has_access guard sale.order already uses
in _create_invoices(). Read the coupon point name through sudo(),
consistent with the loyalty.history read beside it, since the
loyalty summary is meant to be visible to anyone who can already
read the order.

Signed-off-by: David Tran <david.tran@tvtmarine.com>
(cherry picked from commit 84536036b471ced708a149c40c7f01dbf9a2d2fc)
                                

Branch: 19.0

Age:

Up-time:

Odoo 19 Test Suite Using Docker

Post install tests: from test_mail to to_product_return_reason_stock

  • install_module account,account_add_gln,account_check_printing,account_debit_note,account_edi,account_edi_proxy_client,account_edi_ubl_cii,account_fleet,account_payment,account_payment_interco,account_peppol,account_peppol_advanced_fields,account_peppol_response,account_qr_code_emv,account_qr_code_sepa,account_tax_python,account_test,account_update_tax_tags,analytic,api_doc,attachment_indexation,auth_oauth,auth_passkey,auth_passkey_portal,auth_password_policy,auth_password_policy_portal,auth_password_policy_signup,auth_signup,auth_timeout,auth_totp,auth_totp_mail,auth_totp_portal,barcodes,barcodes_gs1_nomenclature,base,base_address_extended,base_automation,base_geolocalize,base_iban,base_import,base_import_module,base_install_request,base_setup,base_sparse_field,base_vat,board,bus,calendar,calendar_sms,certificate,cloud_storage,cloud_storage_azure,cloud_storage_google,cloud_storage_migration,contacts,crm,crm_iap_enrich,crm_iap_mine,crm_livechat,crm_mail_plugin,crm_sms,data_recycle,delivery,delivery_mondialrelay,delivery_stock_picking_batch,digest,event,event_booth,event_booth_sale,event_crm,event_crm_sale,event_product,event_sale,event_sms,fleet,gamification,gamification_sale_crm,google_account,google_address_autocomplete,google_calendar,google_gmail,google_recaptcha,hr,hr_attendance,hr_calendar,hr_expense,hr_fleet,hr_gamification,hr_holidays,hr_holidays_attendance,hr_holidays_homeworking,hr_homeworking,hr_homeworking_calendar,hr_hourly_cost,hr_livechat,hr_maintenance,hr_org_chart,hr_presence,hr_recruitment,hr_recruitment_skills,hr_recruitment_sms,hr_recruitment_survey,hr_skills,hr_skills_event,hr_skills_slides,hr_skills_survey,hr_timesheet,hr_timesheet_attendance,hr_work_entry,hr_work_entry_holidays,html_builder,html_editor,http_routing,iap,iap_crm,iap_mail,im_livechat,iot_base,l10n_vn_edi_viettel,l10n_vn_edi_viettel_pos,l10n_vn_viin,l10n_vn_viin_account_asset,l10n_vn_viin_account_reports,l10n_vn_viin_account_reports_asset,l10n_vn_viin_freight_project,l10n_vn_viin_stock_reports,link_tracker,loyalty,lunch,mail,mail_bot,mail_bot_hr,mail_group,mail_plugin,maintenance,marketing_card,mass_mailing,mass_mailing_crm,mass_mailing_crm_sms,mass_mailing_event,mass_mailing_event_sms,mass_mailing_event_track,mass_mailing_event_track_sms,mass_mailing_sale,mass_mailing_sale_sms,mass_mailing_slides,mass_mailing_sms,mass_mailing_themes,microsoft_account,microsoft_calendar,microsoft_outlook,mrp,mrp_account,mrp_landed_costs,mrp_product_expiry,mrp_repair,mrp_subcontracting,mrp_subcontracting_account,mrp_subcontracting_dropshipping,mrp_subcontracting_landed_costs,mrp_subcontracting_purchase,mrp_subcontracting_repair,onboarding,partner_autocomplete,partnership,payment,payment_adyen,payment_aps,payment_asiapay,payment_authorize,payment_buckaroo,payment_custom,payment_demo,payment_dpo,payment_ecpay,payment_flutterwave,payment_iyzico,payment_mercado_pago,payment_mollie,payment_nuvei,payment_paymob,payment_paypal,payment_payu,payment_razorpay,payment_redsys,payment_stripe,payment_toss_payments,payment_worldline,payment_xendit,phone_validation,point_of_sale,portal,portal_rating,pos_account_tax_python,pos_adyen,pos_cashdro,pos_cashmatic,pos_discount,pos_dpopay,pos_edi_ubl,pos_event,pos_event_sale,pos_glory_cash,pos_hr,pos_hr_restaurant,pos_imin,pos_loyalty,pos_mercado_pago,pos_mollie,pos_mrp,pos_online_payment,pos_online_payment_self_order,pos_pine_labs,pos_qfpay,pos_razorpay,pos_repair,pos_restaurant,pos_restaurant_adyen,pos_restaurant_loyalty,pos_restaurant_stripe,pos_safaricom,pos_sale,pos_sale_loyalty,pos_sale_margin,pos_self_order,pos_self_order_adyen,pos_self_order_pine_labs,pos_self_order_qfpay,pos_self_order_razorpay,pos_self_order_sale,pos_self_order_stripe,pos_self_order_viva_com,pos_sms,pos_stripe,pos_viva_com,privacy_lookup,product,product_email_template,product_expiry,product_margin,product_matrix,project,project_account,project_hr_expense,project_hr_skills,project_mail_plugin,project_mrp,project_mrp_account,project_mrp_sale,project_mrp_stock_landed_costs,project_purchase,project_purchase_stock,project_sale_expense,project_sms,project_stock,project_stock_account,project_stock_landed_costs,project_timesheet_holidays,project_todo,purchase,purchase_edi_ubl_bis3,purchase_mrp,purchase_product_matrix,purchase_repair,purchase_requisition,purchase_requisition_sale,purchase_requisition_stock,purchase_stock,rating,repair,resource,resource_mail,rpc,sale,sale_crm,sale_edi_ubl,sale_expense,sale_expense_margin,sale_gelato,sale_gelato_stock,sale_loyalty,sale_loyalty_delivery,sale_management,sale_margin,sale_mrp,sale_mrp_margin,sale_pdf_quote_builder,sale_product_matrix,sale_project,sale_project_stock,sale_project_stock_account,sale_purchase,sale_purchase_project,sale_purchase_stock,sale_service,sale_sms,sale_stock,sale_stock_margin,sale_stock_product_expiry,sale_timesheet,sale_timesheet_margin,sales_team,sms,sms_twilio,snailmail,snailmail_account,social_media,spreadsheet,spreadsheet_account,spreadsheet_dashboard,spreadsheet_dashboard_account,spreadsheet_dashboard_event_sale,spreadsheet_dashboard_hr_expense,spreadsheet_dashboard_hr_timesheet,spreadsheet_dashboard_im_livechat,spreadsheet_dashboard_pos_hr,spreadsheet_dashboard_pos_restaurant,spreadsheet_dashboard_sale,spreadsheet_dashboard_sale_timesheet,spreadsheet_dashboard_stock_account,spreadsheet_dashboard_website_sale,spreadsheet_dashboard_website_sale_slides,stock,stock_account,stock_delivery,stock_dropshipping,stock_fleet,stock_landed_costs,stock_maintenance,stock_picking_batch,stock_sms,survey,survey_crm,test_access_rights,test_action_bindings,test_assetsbundle,test_auth_custom,test_base_automation,test_convert,test_converter,test_crm_full,test_data_module,test_data_module_install,test_discuss_full,test_event_full,test_html_field_history,test_http,test_import_export,test_inherit,test_inherit_depends,test_inherits,test_inherits_depends,test_mail,test_mail_full,test_mail_sms,test_main_flows,test_mass_mailing,test_mimetypes,test_orm,test_read_group,test_resource,test_rpc,test_runbot_support,test_sale_product_configurators,test_sale_purchase_edi_ubl,test_search_panel,test_spreadsheet,test_testing_utilities,test_translation_import,test_uninstall,test_viin_approval,test_viin_mail_tracking,test_viin_stock_account,test_viin_web_cohort,test_viin_web_gantt,test_viin_web_map,test_viin_web_sankey,test_website,test_website_modules,test_website_slides_full,theme_default,to_account_accountant,to_account_asset,to_account_asset_purchase,to_account_counterpart,to_account_payment,to_account_reports,to_attendance_device,to_base,to_config_management,to_equipment_maintenance_schedule,to_equipment_woking_frequency,to_erponline_utility,to_fee_definition,to_fee_definition_sale,to_geo_routes,to_git,to_git_odoo_version,to_hr_employee_grade,to_invoice_tax_details,to_legal_invoice_number,to_mail_template_multilang_fix,to_maintenance_by_working_hours,to_maintenance_notification,to_maintenance_request_simple_mediate,to_odoo_module,to_odoo_module_sale,to_odoo_version,to_okr,to_okr_project,to_product_code_sequence,to_product_dimensions,to_product_license,to_product_license_sale,to_product_maintenance_schedule,to_product_milestone,to_product_odoo_version,to_product_return_reason,to_product_return_reason_stock,to_sale_order_advance,to_sshkey,to_stock_asset,to_stock_asset_equipment,to_stock_equipment,to_token_expiration,to_upload_file,to_web_thousand_sep,to_website_apps_store,transifex,uom,utm,viin_account,viin_account_onbehalf_payment,viin_api_request_logger,viin_appointment,viin_appointment_crm,viin_appointment_sale,viin_appointment_sale_crm,viin_appointment_website,viin_appointment_website_hr,viin_approval,viin_approval_account,viin_approval_analytic,viin_approval_flexible_flow,viin_approval_maintenance,viin_approval_mrp,viin_approval_procurement,viin_approval_project,viin_approval_purchase,viin_approval_purchase_stock,viin_approval_purpose_routing,viin_approval_sale,viin_approval_sale_project,viin_approval_stock,viin_backend_theme,viin_brand,viin_brand_account,viin_brand_auth_oauth,viin_brand_auth_signup,viin_brand_auth_totp,viin_brand_auth_totp_mail,viin_brand_auth_totp_portal,viin_brand_base_import,viin_brand_base_setup,viin_brand_calendar,viin_brand_contacts,viin_brand_crm,viin_brand_digest,viin_brand_fleet,viin_brand_hr,viin_brand_hr_expense,viin_brand_hr_skills,viin_brand_html_editor,viin_brand_im_livechat,viin_brand_l10n_vn,viin_brand_mail,viin_brand_mail_bot,viin_brand_mail_plugin,viin_brand_mass_mailing,viin_brand_mass_mailing_crm,viin_brand_mass_mailing_sale,viin_brand_mass_mailing_sms,viin_brand_mass_mailing_themes,viin_brand_mrp,viin_brand_onboarding,viin_brand_payment,viin_brand_payment_paypal,viin_brand_portal,viin_brand_pos,viin_brand_product,viin_brand_purchase,viin_brand_sale,viin_brand_sale_management,viin_brand_social_media,viin_brand_spreadsheet,viin_brand_spreadsheet_dashboard,viin_brand_stock,viin_brand_web,viin_brand_web_unsplash,viin_brand_website,viin_brand_website_event,viin_brand_website_event_exhibitor,viin_brand_website_forum,viin_brand_website_links,viin_brand_website_profile,viin_brand_website_sale,viin_brand_website_slides,viin_crm,viin_document,viin_document_account,viin_document_freight,viin_document_freight_air,viin_document_freight_consol,viin_document_hr,viin_document_hr_recruitment,viin_document_mrp,viin_document_parsing,viin_document_project,viin_document_purchase,viin_document_sale,viin_document_stock,viin_freight_air,viin_freight_air_consol,viin_freight_complete_suite,viin_freight_consol,viin_freight_customs,viin_freight_customs_consol,viin_freight_document_parsing,viin_freight_gantt,viin_freight_management,viin_freight_project,viin_freight_road,viin_freight_sale,viin_freight_sale_margin,viin_freight_sale_multi_currency,viin_freight_sale_onbehalf,viin_freight_sale_purchase,viin_helpdesk,viin_hr,viin_hr_holidays_gantt,viin_hr_maintenance,viin_logistics,viin_logistics_account,viin_logistics_cargo_template,viin_logistics_package_type,viin_logistics_route,viin_logistics_sale,viin_logistics_sale_stock,viin_logistics_sale_timesheet,viin_logistics_sales_team,viin_mail_thread_product,viin_mail_thread_stock,viin_mail_thread_uom,viin_mail_tracking,viin_maintenance,viin_maintenance_preventive_mode,viin_product,viin_project,viin_project_gantt,viin_qrcode,viin_safe_ir_metadata_proxy,viin_sale_multi_currency,viin_sale_onbehalf_management,viin_sale_supplier_pricelist,viin_sale_supplier_pricelist_margin,viin_sale_supplier_pricelist_margin_timesheet,viin_spreadsheet,viin_spreadsheet_dashboard_crm,viin_spreadsheet_dashboard_finance,viin_spreadsheet_dashboard_freight,viin_stock,viin_stock_account,viin_stock_account_ee,viin_tracking_location,viin_tracking_location_route,viin_web_cohort,viin_web_gantt,viin_web_map,viin_web_sankey,viin_zalo,viin_zalo_account,viin_zalo_auth_oauth,viin_zalo_crm,viin_zalo_helpdesk,viin_zalo_sale,viin_zalo_website_livechat,web,web_hierarchy,web_tour,web_unsplash,website,website_blog,website_cf_turnstile,website_crm,website_crm_iap_reveal,website_crm_livechat,website_crm_partner_assign,website_crm_sms,website_customer,website_event,website_event_booth,website_event_booth_exhibitor,website_event_booth_sale,website_event_booth_sale_exhibitor,website_event_crm,website_event_exhibitor,website_event_sale,website_event_track,website_event_track_live,website_event_track_live_quiz,website_event_track_quiz,website_forum,website_google_map,website_hr_recruitment,website_hr_recruitment_livechat,website_links,website_livechat,website_mail,website_mail_group,website_mass_mailing,website_mass_mailing_sms,website_partner,website_payment,website_profile,website_project,website_sale,website_sale_autocomplete,website_sale_collect,website_sale_collect_wishlist,website_sale_comparison,website_sale_comparison_wishlist,website_sale_gelato,website_sale_loyalty,website_sale_mass_mailing,website_sale_mondialrelay,website_sale_mrp,website_sale_slides,website_sale_stock,website_sale_stock_wishlist,website_sale_wishlist,website_slides,website_slides_forum,website_slides_survey,website_sms,website_timesheet
  • exec_odoo --db_port 5432 --log-level=test --max-cron-threads=0 --http-interface=127.0.0.1 --load=base,rpc,web,viin_brand,to_erponline_utility,test_runbot_support --stop-after-init --test-enable --test-tags=/test_mail,/test_mail_full,/test_mail_sms,/test_main_flows,/test_mass_mailing,/test_mimetypes,/test_orm,/test_read_group,/test_resource,/test_rpc,/test_runbot_support,/test_sale_product_configurators,/test_sale_purchase_edi_ubl,/test_search_panel,/test_spreadsheet,/test_testing_utilities,/test_translation_import,/test_uninstall,/test_viin_approval,/test_viin_mail_tracking,/test_viin_stock_account,/test_viin_web_cohort,/test_viin_web_gantt,/test_viin_web_map,/test_viin_web_sankey,/test_website,/test_website_modules,/test_website_slides_full,/theme_default,/to_account_accountant,/to_account_asset,/to_account_asset_purchase,/to_account_counterpart,/to_account_payment,/to_account_reports,/to_attendance_device,/to_base,/to_config_management,/to_equipment_maintenance_schedule,/to_equipment_woking_frequency,/to_erponline_utility,/to_fee_definition,/to_fee_definition_sale,/to_geo_routes,/to_git,/to_git_odoo_version,/to_hr_employee_grade,/to_invoice_tax_details,/to_legal_invoice_number,/to_mail_template_multilang_fix,/to_maintenance_by_working_hours,/to_maintenance_notification,/to_maintenance_request_simple_mediate,/to_odoo_module,/to_odoo_module_sale,/to_odoo_version,/to_okr,/to_okr_project,/to_product_code_sequence,/to_product_dimensions,/to_product_license,/to_product_license_sale,/to_product_maintenance_schedule,/to_product_milestone,/to_product_odoo_version,/to_product_return_reason,/to_product_return_reason_stock,-at_install,-/website_event_booth_exhibitor/tests/test_wevent_booth_exhibitor.py:TestWEventBoothExhibitorCommon.test_register,-/website_sale/tests/test_website_sale_image.py:TestWebsiteSaleRemoveImage.test_website_sale_add_and_remove_main_product_image_no_variant,-:TestIndustryFsmUi.test_ui,-/sale_management/tests/test_sale_ui.py:TestUi.test_04_portal_sale_signature_without_name_tour,-:TestMigrateEmployeeWithContract,-:TestMigrateEmployee,-/l10n_pe_edi_pos/tests/test_frontend.py:TestUi.test_pos_invoice_order_and_refund,-/helpdesk/tests/test_helpdesk_rating.py:TestHelpdeskRating.test_helpdesk_dashboard,-/website/tests/test_ui.py:TestUi.test_33_website_menus,-/account/tests/test_tour.py:TestUi.test_01_account_tour,-/website_sale_wishlist/tests/test_wishlist_process.py:TestWishlistProcess.test_01_wishlist_tour,-/test_l10n_be_hr_payroll_account/tests/test_employee_job_change.py:TestEmployeeJobChange.test_employee_job_change,-/test_website_sale_full/tests/test_ui_rental_comparison.py:TestUi.test_website_sale_renting_comparison_ui,-/knowledge/tests/test_knowledge_editor_commands.py:TestKnowledgeEditorCommands.test_knowledge_calendar_command_tour,-:TestAddToCartSnippet.test_configure_product,-.test_generic_localization,-:TestPickShipBackorder.test_pick_assign_and_backorder,-/hr_holidays/tests/test_leave_requests.py:TestLeaveRequests.test_calendar_event_create_access_rights,-:TestError.test_04_multi_db,-:TestOrderEdiUbl.test_so_import_product_from_po,-:TestReportsRendering.test_report_specific_paperformat_args,-:TestKpiProvider
Create Date Level Message
09/24/2026 22:15:36 INFO
Using Docker Image Odoo 19 Ubuntu 24.04 Python 3.12:

FROM ubuntu:noble

ENV LANG C.UTF-8
ENV ODOO_TEST_FAILURE_RETRIES=2

# Retrieve the target architecture to install the correct wkhtmltopdf package
ARG TARGETARCH

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 file fonts-freefont-ttf fonts-noto-cjk gawk gnupg gsfonts libldap2-dev libjpeg9-dev libsasl2-dev libxslt1-dev lsb-release npm ocrmypdf sed sudo unzip xfonts-75dpi zip zlib1g-dev software-properties-common git \
&& 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 publicsuffix python3 flake8 python3-dbfread python3-dev python3-gevent python3-pip python3-setuptools python3-wheel python3-markdown python3-mock python3-phonenumbers python3-websocket python3-google-auth libpq-dev pylint python3-jwt python3-asn1crypto python3-html2text python3-suds python3-xmlsec \
&& rm -rf /var/lib/apt/lists/*

# Install wkhtml
RUN curl -o xfonts-base.deb http://archive.ubuntu.com/ubuntu/pool/main/x/xfonts-base/xfonts-base_1.0.5+nmu1_all.deb && dpkg -i xfonts-base.deb
RUN curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.jammy_amd64.deb \
&& apt-get install -y --no-install-recommends ./wkhtmltox.deb \
&& rm -rf /var/lib/apt/lists/* wkhtmltox.deb xfonts-base.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/19.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 --break-system-packages --no-cache-dir setuptools wheel && \
python3 -m pip install --break-system-packages coverage==7.4.4 flamegraph

# install latest postgresql-client
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ noble-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
&& GNUPGHOME="$(mktemp -d)" \
&& export GNUPGHOME \
&& repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \
&& gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \
&& gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& apt-get update \
&& apt-get install --no-install-recommends -y postgresql-client \
&& rm -f /etc/apt/sources.list.d/pgdg.list \
&& rm -rf /var/lib/apt/lists/*

# Install Google Chrome
ARG CHROME_VERSION=150.0.7871.114

RUN set -eux; \
echo 'repo_add_once="false"' > /etc/default/google-chrome; \
curl -sSLf "https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}-1_amd64.deb" \
-o /tmp/chrome.deb; \
apt-get update; \
apt-get -y install --no-install-recommends /tmp/chrome.deb; \
apt-mark hold google-chrome-stable; \
rm -f /tmp/chrome.deb /etc/apt/sources.list.d/google-chrome.list; \
rm -rf /var/lib/apt/lists/*; \
google-chrome --version | grep -F "${CHROME_VERSION}"

# 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

ENV PIP_BREAK_SYSTEM_PACKAGES=1

ADD https://raw.githubusercontent.com/Viindoo/odoo/19.0/requirements.txt /root/requirements.txt
RUN python3 -m pip install --break-system-packages --no-cache-dir setuptools wheel && \
python3 -m pip install --break-system-packages --upgrade --force-reinstall --ignore-installed --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 --break-system-packages --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==6.1.0
#RUN python3 -m pip uninstall pylint pylint-odoo isort Pygments -y
RUN python3 -m pip install --break-system-packages --upgrade --force-reinstall --ignore-installed --no-cache-dir --upgrade pylint-odoo==9.0.5
RUN python3 -m pip install --break-system-packages --upgrade --force-reinstall --ignore-installed --no-cache-dir --upgrade Pygments==2.15.0 --no-deps

# 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@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
# Tránh warning do bug của ubuntu
RUN rm -rf /usr/lib/python3.12/dist-packages/charset_normalizer-3.3.2.dist-info

# Install cloc package
RUN set -x ; \
apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends cloc pv \
&& rm -rf /var/lib/apt/lists/*

RUN python3 -m pip install --no-cache-dir --upgrade google-auth==2.36.0
RUN python3 -m pip install --no-cache --use-pep517 python-pkcs11~=0.7.0
09/24/2026 22:30:07 INFO
Post install tests: from test_mail to to_product_return_reason_stock:
Command: exec_odoo args: --db_port 5432 --log-level=test --max-cron-threads=0 --http-interface=127.0.0.1 --load=base,rpc,web,viin_brand,to_erponline_utility,test_runbot_support --stop-after-init --test-enable --test-tags=/test_mail,/test_mail_full,/test_mail_sms,/test_main_flows,/test_mass_mailing,/test_mimetypes,/test_orm,/test_read_group,/test_resource,/test_rpc,/test_runbot_support,/test_sale_product_configurators,/test_sale_purchase_edi_ubl,/test_search_panel,/test_spreadsheet,/test_testing_utilities,/test_translation_import,/test_uninstall,/test_viin_approval,/test_viin_mail_tracking,/test_viin_stock_account,/test_viin_web_cohort,/test_viin_web_gantt,/test_viin_web_map,/test_viin_web_sankey,/test_website,/test_website_modules,/test_website_slides_full,/theme_default,/to_account_accountant,/to_account_asset,/to_account_asset_purchase,/to_account_counterpart,/to_account_payment,/to_account_reports,/to_attendance_device,/to_base,/to_config_management,/to_equipment_maintenance_schedule,/to_equipment_woking_frequency,/to_erponline_utility,/to_fee_definition,/to_fee_definition_sale,/to_geo_routes,/to_git,/to_git_odoo_version,/to_hr_employee_grade,/to_invoice_tax_details,/to_legal_invoice_number,/to_mail_template_multilang_fix,/to_maintenance_by_working_hours,/to_maintenance_notification,/to_maintenance_request_simple_mediate,/to_odoo_module,/to_odoo_module_sale,/to_odoo_version,/to_okr,/to_okr_project,/to_product_code_sequence,/to_product_dimensions,/to_product_license,/to_product_license_sale,/to_product_maintenance_schedule,/to_product_milestone,/to_product_odoo_version,/to_product_return_reason,/to_product_return_reason_stock,-at_install,-/website_event_booth_exhibitor/tests/test_wevent_booth_exhibitor.py:TestWEventBoothExhibitorCommon.test_register,-/website_sale/tests/test_website_sale_image.py:TestWebsiteSaleRemoveImage.test_website_sale_add_and_remove_main_product_image_no_variant,-:TestIndustryFsmUi.test_ui,-/sale_management/tests/test_sale_ui.py:TestUi.test_04_portal_sale_signature_without_name_tour,-:TestMigrateEmployeeWithContract,-:TestMigrateEmployee,-/l10n_pe_edi_pos/tests/test_frontend.py:TestUi.test_pos_invoice_order_and_refund,-/helpdesk/tests/test_helpdesk_rating.py:TestHelpdeskRating.test_helpdesk_dashboard,-/website/tests/test_ui.py:TestUi.test_33_website_menus,-/account/tests/test_tour.py:TestUi.test_01_account_tour,-/website_sale_wishlist/tests/test_wishlist_process.py:TestWishlistProcess.test_01_wishlist_tour,-/test_l10n_be_hr_payroll_account/tests/test_employee_job_change.py:TestEmployeeJobChange.test_employee_job_change,-/test_website_sale_full/tests/test_ui_rental_comparison.py:TestUi.test_website_sale_renting_comparison_ui,-/knowledge/tests/test_knowledge_editor_commands.py:TestKnowledgeEditorCommands.test_knowledge_calendar_command_tour,-:TestAddToCartSnippet.test_configure_product,-.test_generic_localization,-:TestPickShipBackorder.test_pick_assign_and_backorder,-/hr_holidays/tests/test_leave_requests.py:TestLeaveRequests.test_calendar_event_create_access_rights,-:TestError.test_04_multi_db,-:TestOrderEdiUbl.test_so_import_product_from_po,-:TestReportsRendering.test_report_specific_paperformat_args,-:TestKpiProvider
09/24/2026 22:30:07 INFO
Docker command:
cd /data/build; mkdir -p /data/build/.pip-tmp && TMPDIR=/data/build/.pip-tmp python3 -m pip install --user --no-cache-dir --progress-bar off -r Viindoo-tvtmaaddons-19.0/requirements.txt && mkdir -p /data/build/.pip-tmp && TMPDIR=/data/build/.pip-tmp python3 -m pip install --user --no-cache-dir --progress-bar off -r Viindoo-erponline-enterprise-19.0/requirements.txt && python3 rb-c855d12-225060/odoo-bin --addons-path rb-c855d12-225060/odoo/addons,rb-c855d12-225060/addons,Viindoo-tvtmaaddons-19.0,Viindoo-erponline-enterprise-19.0,Viindoo-branding-19.0 -d rb-c855d12-225060-418430 --data-dir /data/build/datadir --db_port 5432 --log-level=test --max-cron-threads=0 --http-interface=127.0.0.1 --load=base,rpc,web,viin_brand,to_erponline_utility,test_runbot_support --stop-after-init --test-enable --test-tags=/test_mail,/test_mail_full,/test_mail_sms,/test_main_flows,/test_mass_mailing,/test_mimetypes,/test_orm,/test_read_group,/test_resource,/test_rpc,/test_runbot_support,/test_sale_product_configurators,/test_sale_purchase_edi_ubl,/test_search_panel,/test_spreadsheet,/test_testing_utilities,/test_translation_import,/test_uninstall,/test_viin_approval,/test_viin_mail_tracking,/test_viin_stock_account,/test_viin_web_cohort,/test_viin_web_gantt,/test_viin_web_map,/test_viin_web_sankey,/test_website,/test_website_modules,/test_website_slides_full,/theme_default,/to_account_accountant,/to_account_asset,/to_account_asset_purchase,/to_account_counterpart,/to_account_payment,/to_account_reports,/to_attendance_device,/to_base,/to_config_management,/to_equipment_maintenance_schedule,/to_equipment_woking_frequency,/to_erponline_utility,/to_fee_definition,/to_fee_definition_sale,/to_geo_routes,/to_git,/to_git_odoo_version,/to_hr_employee_grade,/to_invoice_tax_details,/to_legal_invoice_number,/to_mail_template_multilang_fix,/to_maintenance_by_working_hours,/to_maintenance_notification,/to_maintenance_request_simple_mediate,/to_odoo_module,/to_odoo_module_sale,/to_odoo_version,/to_okr,/to_okr_project,/to_product_code_sequence,/to_product_dimensions,/to_product_license,/to_product_license_sale,/to_product_maintenance_schedule,/to_product_milestone,/to_product_odoo_version,/to_product_return_reason,/to_product_return_reason_stock,-at_install,-/website_event_booth_exhibitor/tests/test_wevent_booth_exhibitor.py:TestWEventBoothExhibitorCommon.test_register,-/website_sale/tests/test_website_sale_image.py:TestWebsiteSaleRemoveImage.test_website_sale_add_and_remove_main_product_image_no_variant,-:TestIndustryFsmUi.test_ui,-/sale_management/tests/test_sale_ui.py:TestUi.test_04_portal_sale_signature_without_name_tour,-:TestMigrateEmployeeWithContract,-:TestMigrateEmployee,-/l10n_pe_edi_pos/tests/test_frontend.py:TestUi.test_pos_invoice_order_and_refund,-/helpdesk/tests/test_helpdesk_rating.py:TestHelpdeskRating.test_helpdesk_dashboard,-/website/tests/test_ui.py:TestUi.test_33_website_menus,-/account/tests/test_tour.py:TestUi.test_01_account_tour,-/website_sale_wishlist/tests/test_wishlist_process.py:TestWishlistProcess.test_01_wishlist_tour,-/test_l10n_be_hr_payroll_account/tests/test_employee_job_change.py:TestEmployeeJobChange.test_employee_job_change,-/test_website_sale_full/tests/test_ui_rental_comparison.py:TestUi.test_website_sale_renting_comparison_ui,-/knowledge/tests/test_knowledge_editor_commands.py:TestKnowledgeEditorCommands.test_knowledge_calendar_command_tour,-:TestAddToCartSnippet.test_configure_product,-.test_generic_localization,-:TestPickShipBackorder.test_pick_assign_and_backorder,-/hr_holidays/tests/test_leave_requests.py:TestLeaveRequests.test_calendar_event_create_access_rights,-:TestError.test_04_multi_db,-:TestOrderEdiUbl.test_so_import_product_from_po,-:TestReportsRendering.test_report_specific_paperformat_args,-:TestKpiProvider ;
09/24/2026 22:30:07 INFO
Restoring from: rb-c855d12-225060-418425
09/24/2026 22:30:07 INFO
Container rb-c855d12-225060-418430 started !
09/24/2026 23:40:04 INFO
Container rb-c855d12-225060-418430 stopped !
09/24/2026 23:40:04 ERROR
odoo.addons.test_main_flows.tests.test_flow.TestUi.test_01_main_flow_tour.browser: FAILED: [153/306] Tour main_flow_tour → Step .ui-menu-item > a:contains('the_flow.product'). Element (.ui-menu-item > a:contains('the_flow.product')) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.bus.websocket: Unable to acquire lock for test cursor after 20s Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 364, in get_messages self._process_control_command(cmd, data) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 750, in _process_control_command self._disconnect(data['code'], data.get('reason')) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 618, in _disconnect self._terminate() File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 643, in _terminate with acquire_cursor(self._db) as cr: File "/usr/lib/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 55, in acquire_cursor with suppress(PoolError), Registry(db).cursor() as cr: ^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 801, in _patched_cursor return test_cursor.TestCursor( ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/test_cursor.py", line 47, in __init__ raise Exception(f'Unable to acquire lock for test cursor after {lock_timeout}s') Exception: Unable to acquire lock for test cursor after 20s
09/24/2026 23:40:04 ERROR
odoo.addons.test_main_flows.tests.test_flow: FAIL: TestUi.test_01_main_flow_tour Traceback (most recent call last): File "/data/build/rb-c855d12-225060/odoo/addons/test_main_flows/tests/test_flow.py", line 107, in test_01_main_flow_tour self.main_flow_tour() File "/data/build/rb-c855d12-225060/odoo/addons/test_main_flows/tests/test_flow.py", line 100, in main_flow_tour self.start_tour("/odoo", 'main_flow_tour', login="admin", timeout=180) File "/data/build/rb-c855d12-225060/addons/account/tests/common.py", line 1656, in start_tour super().start_tour(url_path, tour_name, **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('main_flow_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [153/306] Tour main_flow_tour → Step .ui-menu-item > a:contains('the_flow.product'). Element (.ui-menu-item > a:contains('the_flow.product')) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_event_sale_with_product_configurator.TestEventProductConfiguratorUi.test_event_using_product_configurator.browser: FAILED: [11/51] Tour event_sale_with_product_configurator_tour → Step ul.ui-autocomplete a:contains("Registration Event (TEST variants)"). Element (ul.ui-autocomplete a:contains("Registration Event (TEST variants)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.bus.websocket: Unable to acquire lock for test cursor after 20s Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 364, in get_messages self._process_control_command(cmd, data) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 750, in _process_control_command self._disconnect(data['code'], data.get('reason')) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 618, in _disconnect self._terminate() File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 643, in _terminate with acquire_cursor(self._db) as cr: File "/usr/lib/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 55, in acquire_cursor with suppress(PoolError), Registry(db).cursor() as cr: ^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 801, in _patched_cursor return test_cursor.TestCursor( ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/test_cursor.py", line 47, in __init__ raise Exception(f'Unable to acquire lock for test cursor after {lock_timeout}s') Exception: Unable to acquire lock for test cursor after 20s
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_event_sale_with_product_configurator: FAIL: TestEventProductConfiguratorUi.test_event_using_product_configurator Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_event_sale_with_product_configurator.py", line 118, in test_event_using_product_configurator self.start_tour("/odoo", 'event_sale_with_product_configurator_tour', login='salesman') File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('event_sale_with_product_configurator_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [11/51] Tour event_sale_with_product_configurator_tour → Step ul.ui-autocomplete a:contains("Registration Event (TEST variants)"). Element (ul.ui-autocomplete a:contains("Registration Event (TEST variants)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator.TestProductConfiguratorUi.test_01_product_configurator.browser: FAILED: [11/32] Tour sale_product_configurator_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.bus.websocket: Unable to acquire lock for test cursor after 20s Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 364, in get_messages self._process_control_command(cmd, data) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 750, in _process_control_command self._disconnect(data['code'], data.get('reason')) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 618, in _disconnect self._terminate() File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 643, in _terminate with acquire_cursor(self._db) as cr: File "/usr/lib/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 55, in acquire_cursor with suppress(PoolError), Registry(db).cursor() as cr: ^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 801, in _patched_cursor return test_cursor.TestCursor( ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/test_cursor.py", line 47, in __init__ raise Exception(f'Unable to acquire lock for test cursor after {lock_timeout}s') Exception: Unable to acquire lock for test cursor after 20s
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator: FAIL: TestProductConfiguratorUi.test_01_product_configurator Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py", line 37, in test_01_product_configurator self.start_tour("/odoo", 'sale_product_configurator_tour', login='salesman') File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('sale_product_configurator_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [11/32] Tour sale_product_configurator_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator.TestProductConfiguratorUi.test_02_product_configurator_advanced.browser: FAILED: [12/28] Tour sale_product_configurator_advanced_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.bus.websocket: Unable to acquire lock for test cursor after 20s Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 364, in get_messages self._process_control_command(cmd, data) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 750, in _process_control_command self._disconnect(data['code'], data.get('reason')) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 618, in _disconnect self._terminate() File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 643, in _terminate with acquire_cursor(self._db) as cr: File "/usr/lib/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 55, in acquire_cursor with suppress(PoolError), Registry(db).cursor() as cr: ^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 801, in _patched_cursor return test_cursor.TestCursor( ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/test_cursor.py", line 47, in __init__ raise Exception(f'Unable to acquire lock for test cursor after {lock_timeout}s') Exception: Unable to acquire lock for test cursor after 20s
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator: FAIL: TestProductConfiguratorUi.test_02_product_configurator_advanced Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py", line 105, in test_02_product_configurator_advanced self.start_tour("/odoo", 'sale_product_configurator_advanced_tour', login='salesman') File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('sale_product_configurator_advanced_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [12/28] Tour sale_product_configurator_advanced_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator.TestProductConfiguratorUi.test_03_product_configurator_edition.browser: FAILED: [11/42] Tour sale_product_configurator_edition_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.bus.websocket: Unable to acquire lock for test cursor after 20s Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 364, in get_messages self._process_control_command(cmd, data) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 750, in _process_control_command self._disconnect(data['code'], data.get('reason')) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 618, in _disconnect self._terminate() File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 643, in _terminate with acquire_cursor(self._db) as cr: File "/usr/lib/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 55, in acquire_cursor with suppress(PoolError), Registry(db).cursor() as cr: ^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 801, in _patched_cursor return test_cursor.TestCursor( ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/test_cursor.py", line 47, in __init__ raise Exception(f'Unable to acquire lock for test cursor after {lock_timeout}s') Exception: Unable to acquire lock for test cursor after 20s
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator: FAIL: TestProductConfiguratorUi.test_03_product_configurator_edition Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py", line 128, in test_03_product_configurator_edition self.start_tour("/odoo", 'sale_product_configurator_edition_tour', login='salesman') File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('sale_product_configurator_edition_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [11/42] Tour sale_product_configurator_edition_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator.TestProductConfiguratorUi.test_05_product_configurator_pricelist.browser: FAILED: [15/29] Tour sale_product_configurator_pricelist_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.bus.websocket: Unable to acquire lock for test cursor after 20s Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 364, in get_messages self._process_control_command(cmd, data) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 750, in _process_control_command self._disconnect(data['code'], data.get('reason')) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 618, in _disconnect self._terminate() File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 643, in _terminate with acquire_cursor(self._db) as cr: File "/usr/lib/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 55, in acquire_cursor with suppress(PoolError), Registry(db).cursor() as cr: ^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 801, in _patched_cursor return test_cursor.TestCursor( ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/test_cursor.py", line 47, in __init__ raise Exception(f'Unable to acquire lock for test cursor after {lock_timeout}s') Exception: Unable to acquire lock for test cursor after 20s
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator: FAIL: TestProductConfiguratorUi.test_05_product_configurator_pricelist Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py", line 193, in test_05_product_configurator_pricelist self.start_tour("/odoo", 'sale_product_configurator_pricelist_tour', login='salesman') File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('sale_product_configurator_pricelist_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [15/29] Tour sale_product_configurator_pricelist_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator.TestProductConfiguratorUi.test_06_product_configurator_optional_products.browser: FAILED: [11/26] Tour sale_product_configurator_optional_products_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.bus.websocket: Unable to acquire lock for test cursor after 20s Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 364, in get_messages self._process_control_command(cmd, data) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 750, in _process_control_command self._disconnect(data['code'], data.get('reason')) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 618, in _disconnect self._terminate() File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 643, in _terminate with acquire_cursor(self._db) as cr: File "/usr/lib/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 55, in acquire_cursor with suppress(PoolError), Registry(db).cursor() as cr: ^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 801, in _patched_cursor return test_cursor.TestCursor( ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/test_cursor.py", line 47, in __init__ raise Exception(f'Unable to acquire lock for test cursor after {lock_timeout}s') Exception: Unable to acquire lock for test cursor after 20s
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator: FAIL: TestProductConfiguratorUi.test_06_product_configurator_optional_products Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py", line 219, in test_06_product_configurator_optional_products self.start_tour( File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('sale_product_configurator_optional_products_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [11/26] Tour sale_product_configurator_optional_products_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator.TestProductConfiguratorUi.test_product_attribute_multi_type.browser: FAILED: [11/16] Tour product_attribute_multi_type → Step ul.ui-autocomplete a:contains("Big Burger"). Element (ul.ui-autocomplete a:contains("Big Burger")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator: FAIL: TestProductConfiguratorUi.test_product_attribute_multi_type Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py", line 286, in test_product_attribute_multi_type self.start_tour("/odoo", 'product_attribute_multi_type', login="salesman") File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('product_attribute_multi_type', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [11/16] Tour product_attribute_multi_type → Step ul.ui-autocomplete a:contains("Big Burger"). Element (ul.ui-autocomplete a:contains("Big Burger")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator.TestProductConfiguratorUi.test_product_configurator_uom_selection.browser: FAILED: [14/37] Tour sale_product_configurator_uom_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.bus.websocket: Unable to acquire lock for test cursor after 20s Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 364, in get_messages self._process_control_command(cmd, data) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 750, in _process_control_command self._disconnect(data['code'], data.get('reason')) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 618, in _disconnect self._terminate() File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 643, in _terminate with acquire_cursor(self._db) as cr: File "/usr/lib/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 55, in acquire_cursor with suppress(PoolError), Registry(db).cursor() as cr: ^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 801, in _patched_cursor return test_cursor.TestCursor( ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/test_cursor.py", line 47, in __init__ raise Exception(f'Unable to acquire lock for test cursor after {lock_timeout}s') Exception: Unable to acquire lock for test cursor after 20s
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator: FAIL: TestProductConfiguratorUi.test_product_configurator_uom_selection Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py", line 335, in test_product_configurator_uom_selection self.start_tour("/odoo", 'sale_product_configurator_uom_tour', login='salesman') File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('sale_product_configurator_uom_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [14/37] Tour sale_product_configurator_uom_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator.TestProductConfiguratorUi.test_product_configurator_update_custom_values.browser: FAILED: [11/27] Tour sale_product_configurator_custom_value_update_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.bus.websocket: Unable to acquire lock for test cursor after 20s Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 364, in get_messages self._process_control_command(cmd, data) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 750, in _process_control_command self._disconnect(data['code'], data.get('reason')) File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 618, in _disconnect self._terminate() File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 643, in _terminate with acquire_cursor(self._db) as cr: File "/usr/lib/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/addons/bus/websocket.py", line 55, in acquire_cursor with suppress(PoolError), Registry(db).cursor() as cr: ^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 801, in _patched_cursor return test_cursor.TestCursor( ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/build/rb-c855d12-225060/odoo/tests/test_cursor.py", line 47, in __init__ raise Exception(f'Unable to acquire lock for test cursor after {lock_timeout}s') Exception: Unable to acquire lock for test cursor after 20s
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_configurator: FAIL: TestProductConfiguratorUi.test_product_configurator_update_custom_values Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py", line 248, in test_product_configurator_update_custom_values self.start_tour( File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('sale_product_configurator_custom_value_update_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [11/27] Tour sale_product_configurator_custom_value_update_tour → Step ul.ui-autocomplete a:contains("Customizable Desk (TEST)"). Element (ul.ui-autocomplete a:contains("Customizable Desk (TEST)")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_matrix.TestSaleMatrixUi.test_sale_matrix_ui.browser: FAILED: [11/47] Tour sale_matrix_tour → Step ul.ui-autocomplete a:contains("Matrix"). Element (ul.ui-autocomplete a:contains("Matrix")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.addons.test_sale_product_configurators.tests.test_sale_product_matrix: FAIL: TestSaleMatrixUi.test_sale_matrix_ui Traceback (most recent call last): File "/data/build/rb-c855d12-225060/addons/test_sale_product_configurators/tests/test_sale_product_matrix.py", line 58, in test_sale_matrix_ui self.start_tour("/odoo", 'sale_matrix_tour', login='salesman') File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2610, in start_tour self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs) File "/data/build/rb-c855d12-225060/odoo/tests/common.py", line 2580, in browser_js self.fail('%s\n\n%s' % (message, error)) AssertionError: The test code "odoo.startTour('sale_matrix_tour', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo", "delayToCheckUndeterminisms": 0})" failed FAILED: [11/47] Tour sale_matrix_tour → Step ul.ui-autocomplete a:contains("Matrix"). Element (ul.ui-autocomplete a:contains("Matrix")) has not been found. TIMEOUT step failed to complete within 10000 ms.
09/24/2026 23:40:04 ERROR
odoo.tests.result: 11 failed, 0 error(s) of 2013 tests when loading database 'rb-c855d12-225060-418430'
09/24/2026 23:40:04 INFO
Cleaning all resource
09/24/2026 23:40:04 INFO
Cleanup finished