Thursday, December 11, 2025
30 changes · 19.0
Enhancements to existing features
The HTML editor now includes a toolbar button for applying inline code formatting to selected text. This makes the feature easier to find and use, especially for users whose keyboards make the backtick shortcut difficult to access.
Original PR description
Currently, the only way to format text as inline code is by using the backtick character. This makes the feature difficult to discover, as the backtick is not a commonly used character and is hard to access on some keyboard layouts. To address this, this commit adds a dedicated button to the HTML editor toolbar. This button wraps the selected text in inline code as if the backtick key was pressed. task-5262719
This update improves internal test feedback by showing when a method override is missing the expected decorator. It helps developers identify the real cause of compatibility issues faster, reducing investigation time during testing.
Original PR description
[IMP] test_lint: improved message during testing (add decorator override)
Before this commit, the error message appeared like this:
```
TypeError: Invalid override in product.template of load, attribute '_api_model' does not match.
Original definition in odoo.orm.models:
def load(self, fields, data)
Incompatible override definition in product:
def load(self, fields, data)
```
After:
```
TypeError: Invalid override in product.template of load, decorators does not match.
Original definition in odoo.orm.models:
@api.model
def load(self, fields, data)
Incompatible override definition in product:
def load(self, fields, data)
```This update allows users to accurately display the account holder's name alongside bank details, even when it differs from the partner's name. Previously, the account holder name was automatically set to the partner's name, which is now corrected to ensure accurate reporting and reconciliation. This change enhances data clarity and reduces potential errors.
Original PR description
Allow changing of the account holder name in case it is different from the partner name which was the computed default. Task-5222712 [Related PR](https://github.com/odoo/enterprise/pull/98572)
Resolved issues and error corrections
The inventory valuation report now sends dates in the correct server format when users view ending stock for another date. This prevents an error screen and keeps inventory value review usable across languages and time zones.
Original PR description
Steps to reproduce: - Create a PO for a product with some unit price, validate it & its receipt. - Go to Accounting > Review > Inventory Valuation - Pick another date (like one day in the future) - Click on 'Ending stock' Issue: A traceback will appear, as a `to_datetime` will be called on a string containing a timezone. `serializeDate` should be used to serialize datetime to the format used by the server, regardless of the language used, not `toISO`, as this would give an incorrect format. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates the wording of an internal documentation string in the HTML editor's positioning component. It helps developers understand the code more clearly, with no expected change for end users.
Original PR description
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#239292 Forward-Port-Of: odoo/odoo#239168
This fix stops purchase orders from crashing when note or section lines do not have a unit of measure. The system now skips price unit calculations for those non-product lines, making purchase order handling more reliable.
Original PR description
Some purchase lines are of type note or section. For those lines, the UoM is null, So when the system tries to compute the unit price Using the product UoM, we get a ValueError due to the missing…
Some purchase lines are of type note or section.
For those lines, the UoM is null,
So when the system tries to compute the unit price Using the product UoM, we get a ValueError
due to the missing UoM.
To prevent this, we need to add a condition
in the compute method so that it only processes
lines where display_type is False.
```
File "/home/odoo/src/odoo/19.0/addons/purchase/models/purchase_order_line.py", line 160, in _compute_price_unit_product_uom
line.price_unit_product_uom = line.product_uom_id._compute_price(line.price_unit, line.product_id.uom_id)
File "/home/odoo/src/odoo/19.0/addons/uom/models/uom_uom.py", line 195, in _compute_price
self.ensure_one()
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 5934, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: uom.uom()
```
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-prThe bill creation form now uses space more effectively when the journal field is hidden because there is only one purchase journal. Date and currency fields are better aligned, making the form cleaner and easier to read.
Original PR description
When you have a single purchase journal, if you create a bill, the field journal is now invisible. But the space is poorly used (huge currency conversion, useless in). We now align the calendar and the currency. Task [link](https://www.odoo.com/odoo/project.task/5270318) task-5270318
Snail mail letter PDF creation and resend handling were separated into reusable steps. This helps ensure generated letters can correctly apply cover pages and page layout requirements, especially for related follow-up letters.
Original PR description
#### [FIX] snailmail: extract report PDF generation function We extract a function `_generate_report_pdf` from `_fetch_attachment` to create the report PDF (and its filename). The resulting PDF's…
#### [FIX] snailmail: extract report PDF generation function We extract a function `_generate_report_pdf` from `_fetch_attachment` to create the report PDF (and its filename). The resulting PDF's margins are fixed and a cover page is added to it after the function is called in `_fetch_attachment`. The new function is extended in the related enterprise commit to generate the followup report inside `_fetch_attachment` (when sent via snailmail). This way it will respect the cover page option and page layout / size requirements. (See the related enterprise PR for more details.) #### [FIX] snailmail: extract letter resending function We extract a function `_resend_letters` from the `update_resend_action`. It handles the regeneration of letters after the cover option has been updated. This way the resending logic can easily extended to adjust the logic depending on attributes of the letter. The new function is extended in the related enterprise commit to disable the resending for followup report letters. This is necessary because the followup report requires special options to be generated that are not available at the point of the regeneration. #### references opw-5160121 opw-5209504 opw-5226366 Forward-Port-Of: odoo/odoo#239318 Forward-Port-Of: odoo/odoo#235699
Point of Sale customer displays now remain compatible with newer IoT Boxes by supporting the expected request format and response shapes. This helps avoid display connection or data issues when businesses use mixed Odoo and IoT Box versions.
Original PR description
In `saas-18.4` and `19.0` the customer display data service was simplified as we refactored to control IoT displays with actions instead of controllers.
However, to ensure compatibility with v19.1 IoT Boxes, we need to add a request parameter back and to accept both responses: `result: { data: { ... } }` and `result: { ... }`.
Forward-Port-Of: odoo/odoo#239493The website builder now correctly shows file sizes for GIF images in the image settings sidebar. This restores consistency with other image types and helps users make better decisions when managing page media.
Original PR description
`*` = html_builder, html_editor A previous workaround [[1]](https://github.com/odoo/odoo/commit/520dde6f20742229de32c7bf781ab4208284ee79) hid GIF file sizes in the builder because `_processImage` used to return incorrect data for GIFs, causing their size to appear as "NaN kb". The underlying `_processImage` issue was fixed in [[2]](https://github.com/odoo/odoo/commit/27be6d81497b49939d039361dc602d4575e23502), but the workaround from [[1]](https://github.com/odoo/odoo/commit/520dde6f20742229de32c7bf781ab4208284ee79) was never reverted. This commit removes that leftover logic and restores correct size display for GIF images, bringing them back in line with other image types. task-[5071548](https://www.odoo.com/odoo/project.task/5071548) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238629
Odoo now blocks invalid user-defined default values before they can disrupt record creation. This prevents errors when users create new contacts and helps keep default settings consistent with the selected field type.
Original PR description
Steps:
- Create a user defined defaults value
- Model: res.partner
- Field: date
- Value: 1
- Create a new contact
Actual result:
- invalid field type
- 'int' object is not subscriptable (depends of field type)
Expected result:
- No error
- User is not able to put an invalid value as a default
task-3729963
Forward-Port-Of: odoo/odoo#238539
Forward-Port-Of: odoo/odoo#225991This fix corrects the visual alignment of the "Style" option in the website shop category filmstrip settings. It makes the editor interface look cleaner and easier to understand when configuring top categories.
Original PR description
This commit fixes the alignment between the "L" shape and the label of the "Style" sub option for the top categories (Filmstrip) task-5222688 | Before | After | |--------|--------| | <img width="284" height="118" alt="Screenshot 2025-12-11 at 11 10 14" src="https://github.com/user-attachments/assets/82fba2bf-b605-4c75-a667-357b7f8fc08d" /> | <img width="283" height="116" alt="Screenshot 2025-12-11 at 11 09 08" src="https://github.com/user-attachments/assets/6ce63f2e-27e5-4881-8032-f4a0e9133ef5" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures holiday-related work entries keep their connection to the relevant leave record when applicable. This helps avoid incomplete HR data and reduces the risk of payroll or attendance processing issues caused by missing leave information.
Original PR description
…f any 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 update resolves a bug in the Odoo Studio interface that caused incorrect field choices when switching between different field types. The fix ensures that field selections always reflect the currently chosen field, preventing errors and improving the user experience. This improves the reliability of the Studio tool.
Original PR description
Before this commit when selecting fields in studio caused `getFieldChoices` to read from this.props which could still reference the previously selected field’s relation. when switching from a non-relational field to a relational one, the stale props sometimes provided an incorrect `relation` value This resulted in incorrect choice and errors such as `Invalid model name: undefined` during loadField. After this commit getFieldChoices now uses the updated props and safely guards relation lookups. this ensures that the available choices always correspond to the currently selected field and prevents loading choices from the previous field’s relation and avoids the traceback. task-5241639
This update resolves a technical issue that caused a traceback when reloading the WorkEntries page in Studio. The fix ensures Studio correctly loads the page action, preventing errors and improving stability. This change primarily impacts the Studio user experience.
Original PR description
**Verison:** - saas-18.2 **Steps to reproduce:** - Go to an employee form view. - Click on the WorkEntries smart button. - Open Studio. - Reload page. **Issue:** - A traceback appears after reloading the page in Studio. **Cause:** - The smart button URL uses the model name hr.work.entry, but Studio’s service_action expects a path without dots. Because the action cannot be loaded correctly, the view breaks and triggers the traceback. **Solution:** - Return the proper path instead of the model name so that the action loads correctly. This prevents the error when reloading the page. task-5236317 Forward-Port-Of: odoo/odoo#239335 Forward-Port-Of: odoo/odoo#235662
This update resolves an issue where multiple daily attendance entries were incorrectly merging, resulting in inaccurate duration calculations. The fix ensures that each attendance entry is accurately recorded, preventing overlaps and providing correct work time data. This improves the reliability of employee time tracking.
Original PR description
In this commit, we fixed the merge of multiple attendance work entries on the same day. Currently, when you create multiple attendances on the same day, the work entry duration is considering the last one's duration. Reason: converting a work entry into intervals will be in a full day interval which is wrong, it will consider previous work entries as included ones within the new one. Fix: we need to regenerate the old ones too. Related task: 5405642
This update fixes a technical error preventing the Nilvera E-Invoice module from correctly generating invoices when using bank accounts. The issue stemmed from a mismatch in how the system identifies address fields, specifically when dealing with bank records. This fix ensures invoices can now be successfully sent.
Original PR description
**Steps to reproduce:** * Install the **Türkiye - Nilvera E-Invoice (l10n_tr_nilvera_einvoice)** modules * Configure test mode following the [setup…
**Steps to reproduce:**
* Install the **Türkiye - Nilvera E-Invoice (l10n_tr_nilvera_einvoice)** modules
* Configure test mode following the [setup guide](https://docs.google.com/document/d/1EUzvTBnSm9-VwIfBsX299MHGXIVys-uijnsJ1fpz7vI/edit?tab=t.0).
* Create a bank account for the main company and fill the **Bank** selector (bank identifier dropdown).
* Create and attempt to send a customer invoice via Nilvera.
**Observed behavior:**
* A server error occurs: `KeyError: 'country_id'` in `l10n_tr_nilvera_einvoice/models/account_edi_xml_ubl_tr.py` at line 172 while generating `<cac:PayeeFinancialAccount>`.
* The invoice cannot be sent.
**Cause:**
* `_get_address_node()` determines field names using `vals.get('model', 'res.partner')`.
* When the parent class calls `_get_address_node({**vals, 'partner': bank})` with a `res.bank` record, it does **not** pass a `model` parameter.
* The method falls back to `'res.partner'` and attempts to read `country_id` from a `res.bank` record, which instead uses the field `country`.
* This mismatch triggers a `KeyError`.
**Fix:**
* Detect the appropriate field set by checking `partner._name` rather than relying on `vals.get('model')`.
* Use `country` / `state` when the record is `res.bank`.
* Use `country_id` / `state_id` when the record is `res.partner`.
opw-5380246This update corrects a potential issue in the Chilean VAT (l10n_cl_edi) module where an incorrect sequence number could be generated for VAT documents. Previously, if a specific journal setting wasn't configured, the system might produce sequences starting with 'False'. This fix ensures accurate and reliable sequence generation, preventing reporting errors.
Original PR description
Before this commit, if the journal is not set to using the document (l10n_latam_use_documents), the method _get_last_sequence could return a sequence that starts with False. opw-5404813 Forward-Port-Of: odoo/enterprise#101824
This update corrects a display issue in the SA EDI version of vendor bills. When a bill's currency doesn't match the company's local currency, the amounts shown in the currency conversion section were incorrectly appearing as negative. The fix ensures accurate currency calculations and proper bill formatting.
Original PR description
**Steps to reproduce:** - Create a vendor bill with currency not matching the currency of an SA company - Print the bill in the SA EDI specific format (is not shown on preview) or export as PDF **Issue:** Amounts displayed in the currency conversion section of the bill incorrectly show negative values for subtotal and total. **Solution:** The view affecting the bill in question referred to `o.amount_untaxed_signed` and `o.amount_total_signed` where either unsigned `o.amount_untaxed` and `o.amount_total` or `abs(o.amount_[...]_signed)` should be used instead, as in other localizations. opw-5253213 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236654
This update resolves an issue where top-up events would fail when a company's archived account was used. The team has simplified the reconciliation process, now skipping it as it's considered a 'nice to have'. This ensures top-ups function correctly even with archived accounts.
Original PR description
Before this commit: Webhook 'topup.succeeded' events would fail if the company `transfer_account_id` field is set to an archived account at the reconciliation step After this commit: As the reconciliation is a "nice to have", we skip the reconciliation step Steps to reproduce: - Install `hr_expense_stripe_demo` - Fill the KYC of doom - Archive the account set on the company `transfer_account_id` field - Create a top-up - Nothing happens, error 550 logged on IAP test
This update fixes a technical issue that prevented product catalog search options from being properly translated into different languages. By wrapping labels with the '_t' function, the system now supports localization, ensuring consistent and accurate translations across all Odoo languages. This improves the user experience for international customers.
Original PR description
When adding the search options in the catalog view[^1], the labels were not made translatable. This commit wraps the labels with the _t function to ensure they can be translated into different languages. [^1]: https://github.com/odoo/odoo/commit/96dc626f8d489817c944420178c22dba5c916799
This update fixes a technical issue related to how audit status information is calculated in financial reports. The previous calculation used incorrect settings, leading to inaccurate reporting. This change ensures that audit status data is correctly processed across various localized versions of Odoo Enterprise.
Original PR description
When computing allow_account_audit_status_on_lines, we used the wrong field_name and default_value. Removed all the localized value as this fix should have been the one done in the first place. task-5106852
This update resolves an issue where the Gantt chart would crash when event start or end dates were cleared. The fix ensures the Gantt calculation only runs when a valid date range exists, preventing errors caused by comparing dates with empty values. This improves stability and usability of event scheduling.
Original PR description
When removing the start or end date on an Event, the system raises a traceback during Gantt information computation. **Steps to Reproduce:** 1. Install `website_event_track_gantt` module. 2. Create a new Event. 3. Add at least one **Track** with a track **Date** and **Duration**. 4. In the Event form, clear the Start or End Date field. **Error:** `TypeError: '<' not supported between instances of 'datetime.datetime' and 'bool'` **Cause:** When the event start or end date is removed, those fields become False. During computation, the system attempts to compare these False values with the track dates (which are real datetimes), resulting in an invalid datetime-boolean comparison, causing the error. **Fix:** This commit ensures the Gantt calculation only executes when the event has a valid date range, avoiding comparisons that include missing values. no id Forward-Port-Of: odoo/enterprise#101541
This update resolves an issue where the color picker test was failing intermittently due to timing problems. The fix ensures the test waits for all steps to complete, preventing unpredictable results and improving the reliability of the website customization process. This enhances the overall quality and stability of the website builder.
Original PR description
__Behavior before commit:__ Since `edit` writes one character after the other, using it on a color picker to write an RGBA color calls `make_scss_customization` when the input value reaches the RGB color. Then, another call is made when the entire color is written (because they are both valid colors). However usually the test finished before the steps for the second call were reached because the `Deferred` was only waiting for the first call. __Fix:__ Wait for all steps to avoid nondeterministic behavior. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/234621 Forward-Port-Of: odoo/odoo#239441
This update removes the display of guest amounts from the payment screen in the Odoo Restaurant Point of Sale module. Previously, this information was shown for all orders, which was causing confusion and unnecessary data. This change simplifies the payment process for users.
Original PR description
Before this commit, for all of the orders there was the amount per guest displayed in the payment screen. opw-5394429 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a minor usability issue where clicking the question mark (?) on the website would unexpectedly focus a field. This was causing a frustrating user experience, particularly on mobile devices. The fix ensures the question mark only displays the tooltip, as intended.
Original PR description
On desktop: - Hovering the "?" opens the tooltip; - Clicking on the "?" focuses the field => bug On Mobile: - Clicking on the "?" focuses the field => bug Clicking on the "?" should not focus the field (annoying because it could open a "Search more" on M2O, a bottom sheet, etc.) task-5359752 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update enhances the IoT app by providing clear notification feedback when users enable remote debug. Previously, there was no indication of success or failure when entering the debug token. Now, users will receive a confirmation message, improving the user experience and troubleshooting.
Original PR description
When activating the remote debug from iot app backend there is no feedback when entering the token. We now display a notification to inform whether the remote debug is enabled or not. Task: 5388242
This update resolves a confusing issue with audio/video device selection in Odoo's Discuss calls, specifically on Chromium browsers. The system now correctly requests necessary permissions and displays a clear 'Permission Needed' message when permissions aren't granted, leading to a smoother user experience.
Original PR description
Backport of https://github.com/odoo/odoo/pull/236499 This commit removes the 'Browser Default' placeholder for audio/video device selection on Chromium-based browsers, as they already return their own default device and the placeholder causes confusion. The device-selection dropdown will now display 'Permission Needed' when permissions are not granted. Clicking the dropdown will trigger the permission dialog if the necessary permissions are not granted. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a discrepancy in the demo data where the maximum paid time off was incorrectly displayed as 21 days. The change ensures the demo data accurately reflects the legal maximum of 24 days for employees working 6 days a week, aligning with current regulations. This update improves the accuracy of the demo environment for testing and training.
Original PR description
In the demo data, the number of paid time off was displayed as 21, when it should be 20. The issue was tracked to the statement used for assigning the working schedule to each employee. Also the maximum time off possible is now 24 days as stated by the law (for people working 6 days a week). task-5172492
This update resolves a technical issue where the POS appointment booking tab displayed incorrectly for users with Arabic language settings. The fix corrects how dates are formatted, preventing a traceback error caused by an incorrect date translation. This ensures a smooth and accurate booking experience for all users, regardless of their language.
Original PR description
Currently, when the user language is arabic and we try to select the booking tab inside pos, a traceback appears. Steps to reproduce: ------------------- * Make sure shop has activate the booking feature * Set appointment type to "Table" * Set user language to arabic * Open pos session * Open the booking tab > Traceback: ... invalid isoformat string Why the fix: ------------ `.toFormat` was responsible for the "translation" of the date to arabic. opw-5380768