Thursday, January 29, 2026
11 changes · saas-18.2
Resolved issues and error corrections
This update adjusts an internal test for the PDF quote builder to use a proper encrypted PDF sample instead of arbitrary invalid data. This prevents unnecessary warning messages during automated testing, helping keep build results reliable without changing customer-facing behavior.
Original PR description
The `test_wrong_pdf` test fails on runbot in the `Nightly build` when executed under `Distro Builds > Testing distro PureTrixie without requirements for config Parallel testing`. **Steps to…
The `test_wrong_pdf` test fails on runbot in the `Nightly build` when executed under `Distro Builds > Testing distro PureTrixie without requirements for config Parallel testing`. **Steps to reproduce:** - Install `sale_pdf_quote_builder` module. - Run `test_wrong_pdf` (Make sure `PyPDF==5.4.0` is installed). - Observe `PyPDF` warnings in the logs. **Warnings:** ``` WARNING server pypdf._reader:435 invalid pdf header: b'test' WARNING server pypdf._reader:435 EOF marker not found WARNING server pypdf._reader:435 EOF marker not found ``` **Root cause:** Odoo officially supports the PyPDF version defined in requirements.txt [1]. The test passes with `PyPDF2`, but `PyPDF` is stricter and emits warnings when parsing arbitrary byte content. Because the test uses raw bytes instead of a structurally valid (but unsupported or encrypted) PDF, PyPDF logs warnings. **Fix:** This commit updates the test to use a real encrypted PDF instead of raw bytes, similar to [2]. This commit fixes test failures caused by [3]. **Note:** Refer to [4] for generating the encrypted file. [1]: https://github.com/odoo/odoo/blob/a6af7df429f9cd3bfb60347e9b30cc48fb5bfaff/requirements.txt#L63-L65 [2]: https://github.com/odoo/odoo/blob/0499dbd8944b4002883afab5d3ed76d8e55dab9c/addons/mail/tests/discuss/test_discuss_attachment_controller.py#L63-L75 [3]: https://github.com/odoo/odoo/pull/230712 [4]: https://colab.research.google.com/drive/1UfWSKDluObEkKxCg6eX-nHoe04_FGrEq#scrollTo=A5hO11Eh1qvV runbot-238399 Forward-Port-Of: odoo/odoo#246034
This fix prevents customers from accepting and signing a sales order when the Full Name field is blank. It keeps the signing step consistent by clearing the signature area and disabling the action button until a valid name is entered.
Original PR description
**Steps to produce:** - Install `sale_management` module. - `Create a SO > Click on Preview > Sign and Pay`. - Remove all text from the Full Name`. **Issue:** - The `Accept & Sign` button remains…
**Steps to produce:** - Install `sale_management` module. - `Create a SO > Click on Preview > Sign and Pay`. - Remove all text from the Full Name`. **Issue:** - The `Accept & Sign` button remains enabled even when the Full Name field is empty. **Root cause:** - At [1], When the `drawCurrentName` method is called, it retrieves text using `getCleanedName`. This method returns an empty string when no name is provided - Despite this, the code still generates an image and passes it to `printImage`, which keeps the button enabled. **Solution:** - If the cleaned name is empty or contains only spaces, do not generate image. - Instead, immediately clear the signature pad so the button remains disabled. [1]https://github.com/odoo/odoo/blob/9dedf75810bd6b7a92fe5bd279bf6bae98834750/addons/web/static/src/core/signature/name_and_signature.js#L103-L109 **Before:** <img width="400" height="400" alt="before" src="https://github.com/user-attachments/assets/5ebdf852-4cba-4e1d-9ae4-7373e4b8b91d" /> **After:** <img width="400" height="400" alt="after" src="https://github.com/user-attachments/assets/9280aa66-4f22-40d6-8a22-326cec24378d" /> **opw-5361890** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238638
Purchase orders now show product variant names and values in the vendor's language when using the variant grid with attributes set to never create variants. This prevents confusing untranslated product details on vendor-facing purchasing documents.
Original PR description
When adding a product with never variant, their name and values are not translated in the language of the partner. ### Steps to reproduce: * Activate the setting Variants and Variant Grid Entry. *…
When adding a product with never variant, their name and values are not translated in the language of the partner. ### Steps to reproduce: * Activate the setting Variants and Variant Grid Entry. * Create a product , add a translation for its name. * Create a attribute and a translation for its name, with variant creation set to never. * Create values for the attribute and add translation for their name. * Add the attribute and it's values to the product . * Create a contact and change it's language to the language of the translation. * Create a purchase order set the contact as the vendor * Add the product, and set the grid number to 1 -> the attribute and attribute value is not translated. ### Observation: When adding a product via the variant grid, the attribute and value names are added. For other attribute creation types, this information is retrieved directly from the product: https://github.com/odoo/odoo/blob/f95bcc097fd7e70af8d28a66c010ae9b9490f439/addons/purchase/models/purchase_order_line.py#L283-L288 But in case of never attribute, the name it retrieved after and we don't set the context: https://github.com/odoo/odoo/blob/f95bcc097fd7e70af8d28a66c010ae9b9490f439/addons/purchase_product_matrix/models/purchase.py#L173-L174 -> we retrieve the information but in the wrong language opw-5396058 Forward-Port-Of: odoo/odoo#242692
Event registration emails now bypass the general email exclusion list so registration messages are processed consistently for all attendees. This prevents event mailings from being incorrectly cancelled due to blacklist filtering in the mail composer.
Original PR description
**Steps to reproduce:** - Install Events & Contacts apps - Open Contacts - Create a contact "BLACKLIST", email: `blacklist@example.com` - Create a contact "GOOD", email: `good@example.com` - Open Settings > Technical > Discuss > Email Blacklist - Create a record with email: `blacklist@example.com` - Open Events - Create an event - Go to the event attendees - Create attendees for both contacts - Open Settings > Technical > Email > Emails - Both email are listed but the blacklisted one is cancelled **Issue:** The composer created in `EventMailScheduler._send_mail` is using `_process_mail_values_state` to find the list of blacklisted records and applies it to filter the mail recipients, which prevents the event mailing from being processed correctly. **Fix:** `use_exclusion_list` is set to `false` on the composer to bypass its exclusion process. opw-5046491 Forward-Port-Of: odoo/odoo#228445
This fixes the manufacturing order kanban view so long product names no longer squeeze the quantity and unit fields. Users can continue to read key production quantities clearly, improving day-to-day visibility with minimal functional change.
Original PR description
Description of the issue/feature this PR addresses: On MRP production kanban, if the name of the product is too long, `product_qty` and `product_uom_id` fields on the card shrink and become unreadable. This adds proper classes to keep those fields from shrinking no matter how long product's name is. Current behavior before PR: <img width="1561" height="303" alt="image" src="https://github.com/user-attachments/assets/08e299be-c6e2-4241-b289-aaa2fab9a94f" /> Desired behavior after PR is merged: - The size of the product's name should be fine no matter how long the name of the product is. - The `product_qty` and `product_uom_id` should not shrink if the name of the product is long. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245861
When a Peppol participant is marked as disconnected, the related proxy user is now archived during the reset process. This prevents stale registration data from blocking the customer from registering again.
Original PR description
Currently, if the participant_status gets a client_gone, we call the _reset_peppol_configuration method. But while we reset, we don't archive the proxy_user. We should do so, so the user can re-register --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246261
This update fixes several issues in Odoo's internal Hoot web testing system, including more complete request simulation, clearer test error messages, and stricter handling of expected errors. These changes help developers catch problems more reliably before they reach users, with no direct change to day-to-day business workflows.
Original PR description
### [FIX] Hoot fixes This PR contains several fixes for the Hoot system. See each commit description for more details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244726
This fix ensures that when users open records from Mail, Odoo can show the most appropriate view instead of always forcing a form view. This helps related business workflows, such as document handling, open records in the intended layout and reduces navigation friction.
Original PR description
Records of some models may not want to be shown in their form view by default. See related ENT PR for documents. We re-export to avoid patching order issues. In particular, this makes sure that if we are in the webclient, the chat window is opened before executing the "real" open. Task-5386466 Forward-Port-Of: odoo/odoo#244289
Saved carousel snippets now display at their natural height in the snippet selection dialog instead of being capped at a fixed size. This prevents taller carousel content from being cut off, making custom snippet previews more accurate for website editors.
Original PR description
Steps to reproduce: - Drag and drop a Carousel. - Add content to the first slide of the carousel to make the snippet taller. - Save the snippet as a custom snippet. - Open the snippet dialog. - Issue: The height of the preview for the saved snippet is forced to 550px, causing the snippet to be truncated. After this commit, the height is no longer forced; it now adapts to the snippet content. task-5156137 Forward-Port-Of: odoo/odoo#244251
This update fixes a minor issue on the subscription payment page by ensuring the 'Pay Now' anchor link is only displayed when the advanced payment section is visible. This prevents unnecessary links from appearing when products have been archived, creating a cleaner and more user-friendly experience for customers.
Original PR description
When the subscription is expired and has to be paid, only use an anchor for `Pay Now` if the advance payment section is displayed (it could be hidden for ex. if any of the product has been archived) Forward-Port-Of: odoo/enterprise#105802 Forward-Port-Of: odoo/enterprise#105480
This update prevents documents from automatically opening in their form view when accessed through various channels like direct URLs or systray notifications. This change addresses a user experience issue, ensuring users can access documents without unwanted automatic opening, improving usability and workflow efficiency. The fix covers several access points including direct URLs, systray notifications, and the Discuss app.
Original PR description
Users do not want to access the form view of the document by default. This PR solves three cases for accessing documents.document records that were not covered before: * From the basic path pattern `odoo/x/documents.document/<id>` * From a systray notification "Open Form View" * when we are not yet in Documents * when we already are in Documents * From the Discuss app, on the record's thread Tests for most of these are included. Additionally, make sure the document is selected on accessing from `_get_access_action`. Task-5386466 Forward-Port-Of: odoo/enterprise#104622