Tuesday, September 2, 2025
35 changes · master
Resolved issues and error corrections
This fix prevents the quote PDF builder from trying to inspect empty documents for encryption. It avoids unnecessary failures when empty files are present, improving reliability during product document setup or data loading.
Original PR description
If the document is empty we don't need to check for encryption. Otherwise we risk getting an error. ``` Traceback (most recent call last): File "/home/odoo/src/odoo/18.0/odoo/tools/convert.py", line…
If the document is empty we don't need to check for encryption. Otherwise we risk getting an error.
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/18.0/odoo/tools/convert.py", line 544, in _tag_root
f(rec)
File "/home/odoo/src/odoo/18.0/odoo/tools/convert.py", line 444, in _tag_record
record = model._load_records([data], self.mode == 'update')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5500, in _load_records
data['record']._load_records_write(data['values'])
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5418, in _load_records_write
self.write(values)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4827, in write
real_recs._validate_fields(vals, inverse_fields)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 1631, in _validate_fields
check(self)
File "/home/odoo/src/odoo/18.0/addons/sale_pdf_quote_builder/models/product_document.py", line 46, in _check_attached_on_and_datas_compatibility
utils._ensure_document_not_encrypted(base64.b64decode(doc.datas))
File "/home/odoo/src/odoo/18.0/addons/sale_pdf_quote_builder/utils.py", line 12, in _ensure_document_not_encrypted
if pdf.PdfFileReader(io.BytesIO(document), strict=False).isEncrypted:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/odoo/tools/pdf/__init__.py", line 91, in __init__
super().__init__(stream, strict)
File "/home/odoo/.local/lib/python3.12/site-packages/PyPDF2/_reader.py", line 317, in __init__
self.read(stream)
File "/home/odoo/.local/lib/python3.12/site-packages/PyPDF2/_reader.py", line 1408, in read
self._basic_validation(stream)
File "/home/odoo/.local/lib/python3.12/site-packages/PyPDF2/_reader.py", line 1449, in _basic_validation
raise EmptyFileError("Cannot read an empty file")
PyPDF2.errors.EmptyFileError: Cannot read an empty file
```
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#224674This update fixes an issue in the Peppol demo tools where certain proxy calls could be handled incorrectly after a related internal change. It helps keep demo and testing flows working reliably without affecting normal business operations.
Original PR description
https://github.com/odoo/odoo/pull/221547 removed decorator library. By doing so, it surfaced signature problems related to usage of args and kwargs for calling `_call_peppol_proxy`, but it's demo handler decorator only handled being called with args
This update fixes several small visual issues in Odoo Discuss and Live Chat, including alignment, spacing, rounded corners, badge cropping, and button styling. These changes make the messaging interface look more consistent and easier to scan without changing core functionality.
Original PR description
Several small fixes to match with recent change of style of discuss app.
Retrying Indian EDI, e-waybill, or e-waybill IRN processing now leaves a log entry showing which user triggered the retry. This improves auditability and helps businesses understand retry activity, especially when excessive requests can lead to temporary GST blocking.
Original PR description
Manual fw-port of https://github.com/odoo/odoo/pull/223957, https://github.com/odoo/odoo/pull/223886, https://github.com/odoo/odoo/pull/207184 *=edi,ewaybill,ewaybill_irn Following the implementation of [Black list request by GST](odoo/iap-apps#1039) the users are blocked for 24 hours on generating too many request. When processing through EDI there is no log when clicked on the retry button, Which is more essentially needed now to know by which user the EDI was retried and we logged the same on the move --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224169
This fix prevents an error when a Spanish company record does not have a tax ID set and the VeriFactu batch check runs. It makes the Spanish electronic invoicing flow more reliable for companies with incomplete VAT details.
Original PR description
Replaced `['NIF']` with `.get('NIF')` to avoid a `KeyError` when the company does not have a NIF.
When the VAT value is not set on the company and the `_send_as_batch_check` method is executed, the system raises an error from [1].
This PR updates the code to use `.get('NIF')` instead of direct access, making it more robust.
[1]: https://github.com/odoo/odoo/blob/dff2423ac320fdb97d6bf1f106dc84be1d71cac2/addons/l10n_es_edi_verifactu/models/verifactu_document.py#L1165
**sentry-6829500308**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#224982The email composer now only shows templates that are available to the current user or not assigned to anyone. This prevents users from seeing templates intended for another user, reducing confusion when sending sales emails.
Original PR description
**Steps to reproduce:** 1. Install Sales. 2. Create an email template for the 'sale.order' model and assign it to the admin user under the settings page in the 'User' field. 3. Log in as the demo…
**Steps to reproduce:** 1. Install Sales. 2. Create an email template for the 'sale.order' model and assign it to the admin user under the settings page in the 'User' field. 3. Log in as the demo user. 4. Create a quotation and click the 'Send by Email' button. 5. In the wizard, click the three dots between the attachment and AI logo in the footer. 6. Observe the templates list. **Issue:** - The template created for the admin user appears for the demo user as well. **Cause:** https://github.com/odoo/odoo/blob/07626050bd0104fecd8799b56d30245d00da3f27/addons/mail/static/src/core/web/mail_composer_template_selector.js#L31-L44 - The domain used to fetch templates was incorrectly filtering for templates assigned to any user (instead of filtering for templates assigned to the current user or not assigned at all). **Solution:** - Corrected the domain to include only templates assigned to the current user and not assigned to anyone. opw-4901492 Forward-Port-Of: odoo/odoo#222073 Forward-Port-Of: odoo/odoo#217641
The New Meeting menu in Discuss now opens in the same position as similar action menus. This creates a more consistent and polished user experience with no change to functionality.
Original PR description
### Purpose of this commit: The 'New Meeting' action dropdown was align in the poisition 'right-start', while the other actions in the category was aligned in the 'right-middle' position. This PR fixes that position to 'right-middle' to create a uniform look. Before: <img width="276" height="146" alt="image" src="https://github.com/user-attachments/assets/73578f6d-066e-4e7d-b470-d886203ba27c" /> After: <img width="217" height="185" alt="image" src="https://github.com/user-attachments/assets/7d3258ce-78ad-466c-a40b-d8a01f9648f1" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
IoT devices that were initially not recognized are now checked again automatically while they remain connected. This avoids requiring users to unplug and reconnect hardware once support becomes available, reducing setup friction and interruptions.
Original PR description
Before this commit, in order for an unsupported device to become supported, it would need to be disconnected so that it was removed from the detected devices, and then reconnected at which point the supported method will be checked again. After this commit, the supported method is run on every iteration of the interface for any existing unsupported devices. This way if they can become supported without disconnecting them entirely. task-5055685 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224978
The mail message action buttons have been reordered so the copy option appears after “Send as Message” and “Log as Note.” This makes the button order more logical and avoids confusion when users choose how to handle a message.
Original PR description
The copy button appears in between the 'Send as Message' and 'Log as Note' buttons. It should appear last (after both buttons). This commit along with the corresponding enterprise commit update the sequence of these buttons to make the copy button appear last. See https://github.com/odoo/enterprise/pull/93487
This update adjusts an internal automated test for the Glory cash device integration so it runs consistently. It helps reduce false test failures during development, improving confidence in release checks without changing customer-facing behavior.
Original PR description
Before this commit, the socket.io test to check if a ping was sent every 5 seconds was failing about 1/10 times. After this commit, we increase the `advanceTime` amount from 10 seconds to 11 seconds, which fixes the inconsistency and guarantees that 2x5 second periods have elapsed. runbot-231444 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes the underlying structure of the mobile website header menu so it follows the expected page layout rules. There is no expected visual change, but it helps keep the website markup clean and more reliable for future updates.
Original PR description
The mobile header main UL was placed as a direct child of another UL... this fixes the issue by properly wrapping it inside a LI. This seems to be the case for a while, without design issues. So this is only fixed here in master.
The leave statistics view has been adjusted so information no longer overlaps visually. This makes leave balances and related calendar information easier for employees and managers to read.
Original PR description
This commit addresses an overlapping styling issue in the leave stats task-4945729 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224969 Forward-Port-Of: odoo/odoo#221099
This fixes a previously reintroduced issue where some lazy-loaded website assets were not marked to load at the right time. The change helps pages load supporting scripts more reliably without affecting day-to-day workflows.
Original PR description
Commit [1] already fixed this issue but [2] re-introduced it while refactoring assets generation logic... This commit fixes the issue for the next version (19.0). It was decided to not do it as a fix in stable as it is not critical and since the original fix only lived for a few weeks (16.3 only). [1]: https://github.com/odoo/odoo/commit/1b428bd0b0e636769bfb0967aab0e2d962667f37 [2]: https://github.com/odoo/odoo/commit/6d5d234f15e458c4a92c240fc743aee941b460e2
The accounting Send & Print wizard now hides the download option consistently, regardless of the user's selected language. This prevents translated labels from causing the option to appear when it should not, improving consistency for international users.
Original PR description
Since 7ad7a1d976391e81eaa03be7076cc61f4a6cfcbe we don't show Download option in the Send & Print wizard. However, we were checking the tuple `(value, label)` which works only if language is set to English. With this commit, we only check the technical value opw-4965650 Forward-Port-Of: odoo/odoo#221763
Website test tours were updated to match recent website builder changes, allowing an important scrollbar-related check to run again. This helps maintain confidence that website editing interactions continue to work as expected, while a separate animation issue remains to be addressed later.
Original PR description
This PR aligns tour steps with new DOM structure and re-enable related tests. The `snippet_popup_and_scrollbar` tour was broken due to changes in DOM structure from the new website builder. This tour disabled. Split `test_snippet_popup_with_scrollbar_and_animations` into two separate tours: `snippet_popup_and_scrollbar` and snippet_popup_and_animation`. Note that animation behavior remains unfixed as `On Hover` option is missing. Forward-Port-Of: odoo/odoo#211379
Sales orders linked to projects are now updated correctly even when they do not include service-type order lines. This helps teams keep sales and project records aligned and avoids missing project references in customer order follow-up.
Original PR description
- Currently, when there is no service type SOL, the project is not set on the SO. - Used sudo to write on `reinvoiced_sale_order_id` since the field is restricted by the `sales_team.group_sale_salesman` group. This fix ensures that the project is now properly set. task-4797391
Fixes an issue where IoT driver events could lose or overwrite returned action data. This helps ensure connected device actions pass the right information onward, reducing the risk of incorrect event handling.
Original PR description
A simplification in the code introduced an error overwriting the param containing the data returned by the action. This commit ensures the data is correctly provided to the event.
This fixes when editing hints are shown in the HTML editor so they only appear when the user is actually working inside the relevant content area. It helps avoid confusing or misplaced guidance after the user moves the cursor outside the editable section.
Original PR description
Some hint target providers were using the editable selection to determine which elements should receive hints. But we only want the hints when the selection is effectively in these elements (ie, we don't want the hints if we leave the editable). task-4585835 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes errors that could occur when replacing an image with a caption and then editing that caption. It also prevents misplaced tooltips from appearing around captioned images, making content editing smoother and more reliable.
Original PR description
**Current behavior before PR:** - Replacing an image that has a caption, then editing the caption and clicking outside it, would result in a traceback. - When a caption was added to an image, the previous sibling block of the image became empty. As a result, the tooltip of that empty block could appear hovering above the image. **Desired behavior after PR is merged:** - A traceback no longer occurs when the image is replaced and the caption is edited before clicking outside. - If the previous sibling block is found to be empty when a caption is added, a `<br>` element is inserted into it. This ensures the block is no longer considered empty, preventing the tooltip from appearing above the image. task: 4876199 Forward-Port-Of: odoo/odoo#215163
This fix prevents Point of Sale orders from showing an extra gift card line with a zero amount when a gift card is applied. It improves checkout accuracy and reduces confusion for cashiers and customers without changing the intended discount value.
Original PR description
When selling some product and applying a giftcard, there could be 2 giftcard lines applied on the order one with a correct amount and the other one with 0 as amount. Steps to reproduce: ------------------- * Create a gift card with 50€ * Open PoS and add a Desk Pad and a Black Drawer > Observation: There are 2 giftcard lines applied on the order Why the fix: ------------ Sometimes the discountable amount could get weird values that are really close to 0 but that was not interpreted as False. To fix this we use `floatIsZero()` instead. Note: ---------- I will introduce a hoot test in 18.3 to cover this weird use case. opw-4866358 Forward-Port-Of: odoo/odoo#224870 Forward-Port-Of: odoo/odoo#223948
This fix prevents Odoo from loading the background live communication worker unless a feature actually needs it. This reduces unnecessary resource use on websites, especially for visitors who never interact with live chat, while keeping needed messaging behavior available.
Original PR description
In [1], the `worker_service` was introduced. It encapsulates the worker handling logic that was previously in the bus service. However, there is a small difference: previously, the `send` method…
In [1], the `worker_service` was introduced. It encapsulates the worker handling logic that was previously in the bus service. However, there is a small difference: previously, the `send` method would be ignored if the worker had not yet started. We don’t want to fetch the worker script unnecessarily. This is especially important on websites, where most users do not interact with the live chat. After this PR, the worker is started when `send` is called. We don’t want each caller to implement its own "worker is started" logic. This PR fixes the issue by adding a parameter to the `send` method: `ensureWorker`. There are actually only two places where we want the worker to start if it hasn’t already. This keeps most call sites intact while controlling when the worker starts. This ensures that future calls won’t start the worker by mistake. task-5046441 [1]: https://github.com/odoo/odoo/pull/218332 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes an automated live chat test run consistently by clearing pending notifications before the test starts. It helps reduce false failures in quality checks without changing the experience for end users.
Original PR description
Before this commit, `test_session_history_navigation_back_and_forth` was sometimes failing. This test checks that browser history works correctly when navigating between a live chat session and the discuss app. The test creates a live chat channel via the `/get_session` route, then starts a tour which clicks the related record in the list view to open it in the Discuss app. However, `/get_session` initially sets `is_pinned` to False for the agent. When the active discuss channel is unpinned, another thread is set as the active thread. According to the timing, it can make the test fail. The fix resets bus notifications before starting the tour, ensuring consistent results. fixes runbot-230334,230340 Forward-Port-Of: odoo/odoo#223110 Forward-Port-Of: odoo/odoo#222991
This update fixes automated website shop tests so they match a recent checkout page structure change. It helps keep rental purchase and wishlist checkout flows reliably tested, reducing the risk of unnoticed issues reaching customers.
Original PR description
This aligns the test steps with updated template structure, where the current checkout step is rendered using a added div name="active_step" instead of the older CSS class-based method. See also: - Enterprise PR: https://github.com/odoo/odoo/pull/210879 task:4766612
This fix restores an optimization that avoids starting the IoT communication session until it is actually needed. It helps keep IoT-related point of sale and self-ordering flows efficient and prevents unnecessary background activity introduced by a previous refactor.
Original PR description
* : pos_iot, pos_self_order_iot The refactor introducing the `iot_http` service dropped by mistake the previous lazy_session optimisation [1], this commit reintroduce it. [1]: https://github.com/odoo/enterprise/commit/313bde6feb756c050a20a3459e1e8282d11ffa66 Forward-Port-Of: odoo/enterprise#93600
The Chilean electronic invoicing demo data now includes the required certificate serial number. This prevents setup errors when users test sending demo invoices to the Chilean tax authority, while leaving real production certificates unchanged.
Original PR description
**Issue** When installing l10n_cl_ed, the `subject_serial_number` field is left empty. This causes an error when attempting to send an invoice to the SII. **Steps to Reproduce** 1. Install Accounting and l10n_cl_edi 2. Create and confirm an invoice 3. Click "Send Now to SII" 4. Error: Invalid Operation **Root Cause** The `subject_serial_number` is not set during installation, and this field is required for electronic document generation. **Fix** Restore the behavior from version 17.0 by setting a default `subject_serial_number` if it's missing and the certificate is available. This ensures the demo data is functional and allows users to test the SII integration out-of-the-box. Opw-4961801 Forward-Port-Of: odoo/enterprise#90636
Finding duplicate bank transactions no longer fails when the Starting Date field is left empty. The system now uses today's date by default, helping accounting users complete the duplicate check without interruption.
Original PR description
Currently, an error occurs when attempting to find duplicate transactions in the bank. Steps to Reproduce: - Install the `Accountant` module. - In the `Accounting` Dashboard, click on `Bank`. - In…
Currently, an error occurs when attempting to find duplicate transactions in the bank.
Steps to Reproduce:
- Install the `Accountant` module.
- In the `Accounting` Dashboard, click on `Bank`.
- In Actions, click `Find Duplicate Transactions`.
- Clear the `Starting Date` and click save.
Traceback:
```py
psycopg2.errors.UndefinedFunction: operator does not exist: date >= boolean
LINE 6: AND move.date >= false
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
```
This error occurs when the system attempts to detect duplicate transactions without a `Starting Date`. During the check, it evaluates the condition `move.date >= date_from`. Since `date_from` is False, the comparison triggers an error.
This commit ensures that if the `Starting Date` is empty when finding duplicate transactions, it uses today’s date as the `Starting Date`.
Reference commit: https://github.com/odoo/enterprise/pull/87000/commits/806ab2d56952e9d0f597cf1ab36ea2f180a84323
Forward-Port-Of: odoo/enterprise#92497A date used in Belgian payroll accounting tests has been fixed so the tests remain reliable when the calendar year changes. This prevents avoidable failures in 2026 and helps keep payroll-related validation stable over time.
Original PR description
Some tests will fail in 2026. This adds a freeze time to prevent this failing. Task: 5034173 Forward-Port-Of: odoo/enterprise#93575 Forward-Port-Of: odoo/enterprise#92983
When duplicating accounting moves related to returns, the copied move is no longer incorrectly tied to the original return. This prevents confusion and reporting mistakes by ensuring duplicated records are treated as separate entries.
Original PR description
Duplicating some return's move also kept the duplicate linked to the return. This is wrong. task-5046319 Forward-Port-Of: odoo/enterprise#93390 Forward-Port-Of: odoo/enterprise#93323
The AI message action buttons now appear in a more logical order, with the copy option placed after sending as a message and logging as a note. This reduces confusion and makes the interface easier to use.
Original PR description
The copy button appears in between the 'Send as Message' and 'Log as Note' buttons. It should appear last (after both buttons). This commit along with the corresponding community commit update the sequence of these buttons to make the copy button appear last. See https://github.com/odoo/odoo/pull/224774
The Documents app now checks for existing redirect records when someone opens a shared document content link. This preserves access for older or migrated links, reducing broken document access for users and customers.
Original PR description
We do not currently check for `documents.redirect` records when accessing the `/documents/content/<access_token>` endpoint. This commit fixes this by redirecting if a `document.redirect` with the appropriate `access_token` was created for backwards compatibility. opw-4517698 Forward-Port-Of: odoo/enterprise#92342 Forward-Port-Of: odoo/enterprise#92313
Payroll users can now change salary rule colors reliably from both Salary Rules and Salary Structures. The fix ensures the chosen styling is applied directly in the salary rule preview and pop-up, making rules easier to identify and review.
Original PR description
Steps to Produce: - open payroll app - Go to Salary Rules or go to Salary Structures and open any salary rule. - try to change color of any rule. issue: - The color does not change in the Salary Rules. - Additionally, styles do not apply in the salary rule pop-up accessed through Salary Structures. Fix: - Instead of changing the color with formrenderer, a custom widget was created to apply styles directly to the field. opw-4716810 task-4774448 Forward-Port-Of: odoo/enterprise#93520 Forward-Port-Of: odoo/enterprise#83514
Spreadsheet pivot configuration now hides field relationships that cannot be stored and therefore cannot be reliably retrieved. This prevents users from selecting options that would create cell errors, and adds test coverage for many-to-many relationships.
Original PR description
Before this commit, it was possible to follow a non-store field relation in the pivot chain feature. It leads to an error in the cell as it's not possible to retrieve the value of a non-stored field. In order to ease the work of the user, we do not display non-store field relation. This commit also adds a missing test for the m2m relation. Task: 5059203
Creating a new salary offer from an employee's shortcut now automatically selects the correct employee again. This prevents manual correction and helps HR teams avoid offers being created without the intended employee attached.
Original PR description
Since this PR: https://github.com/odoo/enterprise/pull/91716, the context when creating a new offer for an employee via his smartbuttons was lacking the default employee_id. This commit fixes the issue by specifying the correct default employee_id.
The barcode app now handles manufacturing orders that have no by-products when opening the scrap window. This prevents a traceback and lets users scrap completed productions reliably.
Original PR description
Issue ----- Trying to scrap a production through the barcode app gives the user a traceback. Steps to reproduce ----- - Have a done MO - Go to barcode and try to scrap it --> Traceback Cause ----- When preparing the context for the scrap window, we try to map the MO's byProducts. When there is no byProduct, we end up trying to apply a mapping on "nothing". ----- Ticket: opw-4792599 Forward-Port-Of: odoo/enterprise#92925 Forward-Port-Of: odoo/enterprise#90623
A timezone is now set in a timesheet test calendar so automated checks use the expected dates and times. This helps keep test results reliable when demo data is included, reducing false failures during development and releases.
Original PR description
The timezone of a working calendar is not properly set in a test class, which causes datetimes to not match the expected values when running tests with demo data. This PR sets a timezone on the working calendar to solve the issue.