Daily updates from Odoo
Tuesday, August 19, 2025
24 changes · saas-18.4
Resolved issues and error corrections
Fixed an issue that could block visitors and portal customers from opening the online shop when product categories were shown in the sidebar. The shop now ignores hidden or empty categories during sidebar display, preventing error pages and keeping the browsing experience available.
Original PR description
## Version 18.4+ ## Steps to reproduce - On the `/shop` page, in editor mode: - Select the product display block; - Enable `Categories` display and set it to `Sidebar`; - Disable the option `Collapse…
## Version 18.4+ ## Steps to reproduce - On the `/shop` page, in editor mode: - Select the product display block; - Enable `Categories` display and set it to `Sidebar`; - Disable the option `Collapse Category Recursive`; - Open a new incognito window (or use a Portal user). - Try to access `/shop`. ## Issue When the category display is set to `Sidebar` collapse and some categories have unpublished products, the `ir.rule` introduced in commit 120a7633505891ba3e02e879f0c1a8287a690456 prevents Public and Portal users from accessing the shop. This results in a 403 or 500 error due to inaccessible child categories being used in the recursive sidebar rendering. ## Cause Commit 120a7633505891ba3e02e879f0c1a8287a690456 added a rule to hide empty categories from Public and Portal users by restricting access to categories where `has_published_products = True`. However, the sidebar template continues to loop over all `child_id`, including categories filtered out by access rules. Since Public and Portal users no longer have access to empty categories, this results in access errors during template rendering. opw-4937000
The HTML editor now clears multiple text styles, such as font size, color, and bold, with a single click of the remove formatting button. This avoids repeated user actions and makes content cleanup more predictable.
Original PR description
**Current behaviour before PR:** Steps to reproduce: - Select a text - Apply font size - Apply color - Apply bold - Clicking on removeFormat button doesn't remove all formats User has to click on removeFormat button twice to remove the format. **Desired behaviour after PR is merged:** Now, all formats are getting removed at once when clicking on removeFormat button. task-4911199 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222512 Forward-Port-Of: odoo/odoo#218093
Expenses created with the default placeholder name can now be renamed automatically by OCR when receipt details are read. This helps employees and accountants get clearer expense records without manual corrections.
Original PR description
Introduces the function `_get_untitled_expense_name` that will be used by the OCR to check whether the expense still has its default name, in which case it can be overwritten. task-[4684825](https://www.odoo.com/odoo/project/967/tasks/4684825) Forward-Port-Of: odoo/odoo#223037
Users can now upload an empty text file while attaching a bill to a purchase order without triggering an error. This prevents a small edge-case upload issue from interrupting the bill attachment workflow.
Original PR description
Currently, an error occurs when a user uploads an empty text file while attaching a bill in a purchase order. **Steps to reproduce**: - Install the `purchase` module. - In the purchase order(form),…
Currently, an error occurs when a user uploads an empty text file while attaching a bill in a purchase order. **Steps to reproduce**: - Install the `purchase` module. - In the purchase order(form), click **Upload Bill** button. - Upload an empty text file. (e.g; [sample here](https://drive.google.com/file/d/1z35T2NY03YVJJPaEL-WjlV8pjvqVCyBW/view?usp=sharing)) - Observe the error. **Errors:** - If the **'python-magic'** library is installed: `TypeError - 'bool' object is not subscriptable` - If not installed: `AttributeError: 'bool' object has no attribute 'startswith'` The issue occurs when the uploaded attachment is empty, `attachment.raw = False` at [1]. This is then passed to `guess_mimetype`, which expects binary data, resulting in an error. [1] - https://github.com/odoo/odoo/blob/3e24ff8d3c36b4b924077933ef78a8289a435ee3/addons/account/models/ir_attachment.py#L120 This commit ensures `guess_mimetype` always receives binary input when the file is empty. Sentry - 6654301906, 6749801114 Forward-Port-Of: odoo/odoo#212939
The eCommerce product filter panel now behaves more consistently when shoppers select an attribute. Selected filter sections remain expanded instead of unexpectedly collapsing, making product browsing smoother and less confusing.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Have 5 or more product attributes visible in eCommerce; 2. go to /shop; 3. select an attribute. Issue ----- The list we just selected an attribute value from collapsed. Cause ----- While some parts allow accordions to auto-expand if 4 or less attributes are visible, or if an attribute is selected, other parts only look at the number of visible attributes. Solution -------- In parts where it only checks whether more than 4 attributes are visible, also add a check on `_status` to improve consistency. opw-4986032 Forward-Port-Of: odoo/odoo#222342
This fixes a loophole that allowed employees to create time off requests from a shortcut even when the time off type required an approved allocation. Requests now follow the same allocation checks everywhere, helping prevent unauthorized leave balances and keeping HR records accurate.
Original PR description
Steps: - Navigate to Time Off > Configuration > Time Off Types. - Open a time off type that requires allocation. - Click on the 'Time Off' smart button and try to create a request. Issues: - Employees could create time off requests via the smart button even without an approved allocation. - This bypassed the existing restriction enforced in the standard time off request creation flow. Fix: - Added a constraint on the time off model to validate allocations even when requests are created via the smart button. - Ensured validation covers both allocation presence and allowed negative leaves. - Raised a ValidationError when no valid allocation is found. - Added a test case to ensure constraint behaves correctly. - Adjusted some of tests to comply with the new validation. Task - 4671236 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222050 Forward-Port-Of: odoo/odoo#208214
The website editor now waits for a clicked navigation link to finish loading before opening edit mode. This prevents the editing sidebar from appearing on the wrong page and avoids editor breakages when adding content immediately after navigating.
Original PR description
Following the [html_builder refactoring], we could start editing right after we clicked to navigate to another page, and the editor wouldn't wait for the new iframe, which isn't the expected behavior. Steps to reproduce the issue: - Open website - Click on any nav link, e.g. contact us and click edit right away => Sidebar opens before the contact us page is opened. This is not an expected behavior and also if we try to drop a snippet - the editor breaks. This commit follows the [html_builder refactoring]. Related to task-4367641 [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
This update stops an unnecessary warning from appearing in stock accounting by replacing use of an outdated internal method. It reduces noise for users and administrators without changing business workflows or stock valuation behavior.
Original PR description
Before this commit a deprecated method is used and create a useless warning. 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#222148
Fixed an issue that could prevent users from opening filtered repair order lists from the Inventory dashboard. Repair orders are now matched against the correct scheduling date and filtered properly when multiple date categories are involved.
Original PR description
The _search_date_category method was using the incorrect field 'scheduled_date' instead of 'schedule_date', which broke the domain logic. This commit also wraps individual domain clauses in an expression.OR(...) to ensure proper filtering across multiple date categories, in line with the updated ORM search behavior (task-4150178). Caused by: https://github.com/odoo/odoo/commit/92301a5b300dec1ddfca44dc35318b83d67c56fa This fix aligns `_search_date_category` logic in repair to match what is done in mrp & stock. https://github.com/user-attachments/assets/e45791c3-feaf-4d52-9f63-6ff43fb84ca8 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222256
Fixed an issue where Attendance kiosk mode could show all check-in options for a company even when only Barcode/RFID was configured. This happened for website-linked public users without passwords, and the kiosk now avoids treating those users like trial-database users.
Original PR description
### Steps to reproduce: - Install Attendance and Website modules - Have a company 'Company A' - Create a new company 'Company B' - Set the Attendance kiosk mode to 'Barcode / RFID' for both companies…
### Steps to reproduce: - Install Attendance and Website modules - Have a company 'Company A' - Create a new company 'Company B' - Set the Attendance kiosk mode to 'Barcode / RFID' for both companies - Update all websites to be related to Company B - Go to the Kiosk mode for Company B - Notice it makes you choose between the 3 check in types while we only chose 'Barcode / RFID' ### Cause: When openning the kiosk mode it will check if the database is a trial one or if the user doesn't have a password and if so we assume that the database is a trial one. If it is a trial database we set the kiosk mode as 'settings' which shows all check in types when openning the kiosk mode. https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/hr_attendance/controllers/main.py#L101-L102 https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/hr_attendance/controllers/main.py#L185-L196 When creating a new company and set website for it we create a public user for this company and normally we don't set password for this user as no one is gonna login using it. ### Fix: We check if the user doesn't have a password and if he is not a public user. As we assume that if he is a public user he won't have a password anyways. opw-4916329 Forward-Port-Of: odoo/odoo#220355
Fixed an issue during checkout where submitting the address form could send shoppers to the wrong page if the submit button contained a link. This helps keep customers in the intended checkout flow and reduces failed or confusing purchases.
Original PR description
On checkout step /shop/address, if you have an href on the button, during the post to /shop/address/submit, you will be redirected in GET to the href value. opw-discord-internal Forward-Port-Of: odoo/odoo#220165
This fix ensures an HR employee test can run correctly even when demo data is not installed. It adjusts the test setup so automated checks are more reliable across build configurations, reducing false failures in validation pipelines.
Original PR description
Before this commit the test `test_webjson_employees` was failing in no demo builds as the json route only works in demo databases or when explicitly set. See https://github.com/odoo/odoo/pull/182196 This commit enables the system parameter, so that the test can be run as intended in no demo databases. Runbot Error: https://runbot.odoo.com/odoo/error/162907 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205580
Razorpay payment providers can no longer be enabled and published without the required account credentials. This prevents businesses from accidentally offering a payment option that is not ready to process transactions.
Original PR description
## Version 17.0+ No OAuth in 16.0 ## Issue Razorpay can be enabled and published without being properly configured. ## Steps to reproduce - Go to `Payment Providers` and open `Razorpay`; - Set the state to `Enabled` and publish without providing any credentials. ## Fix Added constraints and revised account linking logic, similar to Stripe. Based on 1b6a7aeb245f0007675943ed7aacf5064e46fe61 suggested by ALSH. opw-4922315 Forward-Port-Of: odoo/odoo#222530 Forward-Port-Of: odoo/odoo#219943
This fixes an issue where some images, such as course rank badges, could appear much larger when entering edit mode. Image dimensions are now preserved correctly during editing, helping pages remain visually consistent for users.
Original PR description
Problem: On the Courses page, the user rank badge image becomes much larger when entering edit mode. Cause: During HTML sanitization, `img.width` is removed and its value is moved to `img.style.width`. If `img.width` is a number (e.g., `100`), it is interpreted as `100px`. However, when assigned to `img.style.width` without a unit, the style is considered invalid, and the image defaults to its original size. The same applies to `img.height`. Solution: When transferring width or height to style, ensure a unit is added. If the original attribute is a plain number without a unit, default to `px`. Steps to reproduce: - Open Website > Courses - Observe the user rank badge is appropriately sized - Enter edit mode > The badge image becomes much larger than expected opw-4993038 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221843
Grouped outgoing bill payments now keep the full combined memo from each individual payment. This ensures suppliers receive the expected payment communication and avoids confusion caused by missing or altered memo details.
Original PR description
The payment memo of grouped bills should always consist of the concatenation of individual payments memos. This commit is a partial revert of the changes done in this PR https://github.com/odoo/odoo/pull/162762 The original task was intended to improve internal workflows and should not have impacted payment communications to suppliers. task-4936572 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223256 Forward-Port-Of: odoo/odoo#218787
OCR processing now correctly replaces default “Untitled Expense” names with the detected expense name, even when translations are involved. This prevents newly scanned expense documents from keeping generic names and improves test coverage to avoid regressions.
Original PR description
The combination of the following recent changes prevented the OCR from filling the name of the expense: - New expenses are named "Untitled Expense {date}" by default instead of the name of the…
The combination of the following recent changes prevented the OCR from filling the name of the expense:
- New expenses are named "Untitled Expense {date}" by default instead of the name of the attachment (see commit odoo/odoo@ca1f644).
- The OCR doesn't override the name if it's not set to the default value (see commit 5c813dc).
The first commit didn't update the default expense name that was used in the OCR code, it was still computed from the attachment name.
After the second commit, the OCR couldn't fill in the name of the expense anymore, since it was expecting the name to be the attachment name, but it was "Untitled Expense {date}" instead.
This is fixed by checking that the expense name contains "Untitled Expense" (and taking translation into consideration).
This commit also improves the tests in multiple ways:
- For the `test_auto_send_for_digitization` test, it now mimicks an upload of the document to force the creation of the expense with the default name, this should prevent this from happening again.
- It now uses an actual PDF document instead of "fake" attachments.
- Minor clean up.
task-[4684825](https://www.odoo.com/odoo/project/967/tasks/4684825)
Forward-Port-Of: odoo/enterprise#92324Employees can no longer create time off requests that require an approved allocation by using the Time Off smart button. This closes a workflow gap so absence requests follow the same eligibility rules everywhere they are created, reducing payroll and leave balance inconsistencies.
Original PR description
Steps: - Navigate to Time Off > Configuration > Time Off Types. - Open a time off type that requires allocation. - Click on the 'Time Off' smart button and try to create a request. Issues: - Employees could create time off requests via the smart button even without an approved allocation. - This bypassed the existing restriction enforced in the standard time off request creation flow. Fix: - Added a constraint on the time off model to validate allocations even when requests are created via the smart button. - Ensured validation covers both allocation presence and allowed negative leaves - Raised a ValidationError when no valid allocation is found. - Added a test case to ensure constraint behaves correctly. - Adjusted some of tests to comply with the new validation. Task - 4671236 Forward-Port-Of: odoo/enterprise#91798 Forward-Port-Of: odoo/enterprise#89975
This fix prevents unwanted spacing when users add columns to customized report tables in Studio. New table cells now use a neutral container, helping reports keep consistent alignment and formatting.
Original PR description
Before this commit when adding a column into a modified qweb table (q-table node) we inserte a `p` as the cell's first child. This was problematic as a margin was always present, messing with the whole table alignment. After this commit, we put a simple DIV. task-5005441 Forward-Port-Of: odoo/enterprise#92085
Payments made from the customer portal for subscriptions are now properly linked to the invoice created during checkout. This ensures users can see the payment from the invoice, improving payment traceability and reducing confusion during billing follow-up.
Original PR description
### Steps to reproduce: - Activate a payment method - Create a subscription and preview it in portal view - Pay this order through the order's portal view - Navigate to the invoice got generated -…
### Steps to reproduce: - Activate a payment method - Create a subscription and preview it in portal view - Pay this order through the order's portal view - Navigate to the invoice got generated - Notice there is not 'Payments' smart button ### Cause: Since https://github.com/odoo/enterprise/pull/77432/commits/02f72f94b7c996fa19c6bfc70a704d27aa677245 we stopped creating the invoice before the payment and the transaction in the controller and we let _post_process do this invoice creation. So the invoice actually gets created after the payment not before and when preparing the payment values the invoice_ids will be False https://github.com/odoo/odoo/blob/6c88e6ffd2c906b72b31d3c34ad3d6da5efba204/addons/account_payment/models/payment_transaction.py#L155-L170 Then we create the invoice for the transaction and we don't propagate it to the payment. https://github.com/odoo/enterprise/blob/20fd574367757c06f30c344056e8b8d91ba8244c/sale_subscription/models/payment_transaction.py#L72-L84 ### Fix: Link the payment to the invoice after creating the invoice and link it to the transaction. opw-4867631 Forward-Port-Of: odoo/enterprise#91690
Applicants hired through the salary configurator now keep their recorded skills when they become employees. This prevents loss of important HR information and helps employee profiles remain complete after hiring.
Original PR description
Originally, an applicant, who became an employee through the salary configurator flow, loses his skill info. So, the migration of applicant information, through the salary configurator flow, to employee view has been adjusted. Forward-Port-Of: odoo/enterprise#87076
Egyptian payroll now applies the exempt amount before calculating income tax. This helps prevent employees from being charged too much tax in payroll calculations.
Original PR description
Issue: - The income tax calculation in Egyptian payroll did not properly account for the exempt amount. - This could result in over-calculating tax for employees by not applying the exemption. Fix: - Updated the 'Taxable Amount' salary rule to correctly apply the exempt amount before tax is calculated. Task-4815156 Forward-Port-Of: odoo/enterprise#86395
This fix ensures existing Indian GST records get the correct return period when GSTR-2B data is fetched. It helps keep tax reporting periods consistent and avoids outdated period information in GST reports.
Original PR description
Following up on this commit: https://github.com/odoo/enterprise/commit/eda621c07393ad8e897503c852a9b00480affc52 The recompute was already handled while sending GSTR-1 data, but the part for fetching GSTR-2B was missed in that commit. With this PR, we ensure that the `return_period_month_year` is recomputed as well when fetching GSTR-2B for existing records. Forward-Port-Of: odoo/enterprise#92503
This fixes an error that occurred when users opened Swiss payroll wage type forms. Restoring the activity and message panel support keeps the form working as expected and preserves behavior from earlier versions.
Original PR description
To reproduce: ============= 1- Install Swiss payroll 2- go to payroll configurations 3- wage types 4- open the form view of one wage type Problem: ======== The hr_salary_rule no longer inherits mail.thread due to this PR : https://github.com/odoo/enterprise/pull/83136 So we cannot load the chatter and a traceback will happen Fix: ===== inherit mail.thread in hr_salary rule so the chatter can work properly There's another solution to do which is removing the chatter from the view But the chatter exists in the previous versions and we try to make it work in 18.4 opw-5015226
A leftover, unnecessary parameter was removed from the Belgian point-of-sale certification code. This is a small cleanup that reduces confusion for maintainers and helps keep the POS code reliable without changing user-facing behavior.
Original PR description
An unnecessary parameter has been added and mistakenly not removed. This commit removes it.