Wednesday, January 7, 2026
15 changes · 19.0
Enhancements to existing features
This update ensures Odoo's internal crawler, Odoobot, follows website guidelines outlined in robots.txt. By checking if our crawler is permitted to access specific URLs, we prevent unauthorized data fetching and improve the reliability of our data collection process. This enhances our data integrity and avoids potential issues with website owners.
Original PR description
### Purpose Add `robots.txt` compliance to the `_fetch_url` helper. Before fetching any URL, we now check the site's `robots.txt` and ensure that our user agent (`Odoobot/1.0`) is allowed to access the requested path. ### Changes - Added `robots.txt` validation using `urllib.robotparser` - Respect disallow rules for the `Odoobot/1.0` user agent ### Why This ensures that our crawler behaves politely, avoids fetching disallowed resources, and provides more transparent failure reporting. --- **Task-ID:** 4779962
Resolved issues and error corrections
This update resolves an issue where deleting a specific product (Booking Fees) caused an access error due to company-related permissions. The fix uses `sudo()` to ensure the product template can be accessed regardless of the currently selected company, improving stability and preventing data loss.
Original PR description
**Steps to produce:** - Install `appointment_account_payment` and `l10n_be` with demo data. - Go to product `Booking Fees` and assign company `YourCompany`. - Switch the current company to `Belgium Company`. - Try to delete any product. **Issue:** - An access error is raised when deleting a product. **Root cause:** - During product deletion, method `_unlink_except_booking_fee_product_template` is executed [1]. - If the 'Booking Fees' product is assigned to another company, the current company cannot access its record, which triggers an access error. **Solution:** - Use `sudo()` when fetching the "Booking Fees" product template so that the record can be accessed regardless of the current company. [1]: https://github.com/odoo/enterprise/blob/0ba44def7fd961e1c17aa218e1a86a48f0918371/appointment_account_payment/models/product_template.py#L9-L15 opw-5255991 --- Forward-Port-Of: odoo/enterprise#101582
This update removes the use of Gemini 1.5 models within the AI features of Odoo Enterprise. The change provides a clear error message when attempting to use these models, preventing unexpected behavior. This ensures a more stable and reliable AI experience for users.
Original PR description
This PR deprecates the Gemini 1.5 models. Specifically, it gives a proper non-technical error when the model is used. The error occurs either when the user tries to set the model on an agent or if the model is already on the agent, it will raise the error upon usage of the agent. task-5129790
This update corrects a visual issue where the OCR label for expense documents was incorrectly displayed, causing misalignment in the expense report grid. The fix ensures that all labels and data fields are properly aligned, improving the user experience when viewing OCR-processed expenses. This was triggered by a change in how OCR data is handled.
Original PR description
Prerequisites ------------- To test this scenario you need either OCR credits, a free trial or to use the IAP account we have in the spreadsheet. Steps To Reproduce ------------------ 1- Go to Expenses > My Expenses. 2- Upload a receipt to trigger OCR. 3- Open the expense in Normal Mode (It works fine in Debug Mode). Issue ----- "Payment Method" field is misaligned - label appears in the value column and field appears in the label column. Cause ----- The label for "ID of the request to IAP-OCR" (`extract_document_uuid`) is visible when OCR data exists, but its field is only visible in Debug Mode. This orphan label breaks the grid layout. opw-5369619 Forward-Port-Of: odoo/enterprise#103189
A technical issue causing a traceback when using the AI button in the applicant refusal process has been resolved. The fix involved modifying the widget's behavior to correctly identify applicant IDs, preventing a required field error. This ensures the AI refusal feature functions reliably.
Original PR description
Step to reproduce: - Install hr_recruitment. - Open any applicant in any job position. - Click the Refuse button to open the refusal wizard. - Enable the send email toggle key. - Click on AI button Issue: traceback occurs Reason: - required field for using this widget is not defined. - so it tries to slice the res_ids field which is still not defined Solution: - In stable versions, we cannot add the missing required fields because this would cause upgrade issues. - Instead, we extend the widget and override its behavior to use active_model and active_id. task-5058510 Forward-Port-Of: odoo/enterprise#99498
This update fixes an issue where job offer emails didn't include the employee's name in the subject line. Now, the email subject will automatically include the employee's name, improving clarity and personalization for candidates. This ensures a more professional and informative communication.
Original PR description
**Steps to reproduce:** - Go to Employees app and select any employee - Press "Offers" smart button - Create a new job offer and send it by email **Issue:** The employee name is not populated in the email subject. Task: 5407028 Forward-Port-Of: odoo/enterprise#102628
This update corrects calculations for Belgian withholding taxes in the HR payroll module, ensuring accurate reporting up to the year 2026. This change addresses a technical adjustment to reflect the latest tax regulations for employees in Belgium, maintaining compliance and accurate financial reporting.
Original PR description
TaskID: 5403525 Forward-Port-Of: odoo/enterprise#103271 Forward-Port-Of: odoo/enterprise#103215
This update resolves a technical issue preventing the POS system from correctly interacting with new IoT box devices. The fix adds a necessary 'version' field to the IoT box data loaded into the POS, ensuring the WebRTC check functions as intended. This improves compatibility and stability of the POS with updated IoT devices.
Original PR description
In odoo/enterprise#101547, a check was added to never try using WebRTC when paired to a new IoT box image (where WebRTC is removed). This works outside of the POS, but due to the IoT box models being loaded directly from the POS data, they were missing the version field required for the check. This commit adds the `version` field to the IoT box fields loaded in the POS, fixing the WebRTC check.
This update fixes a bug that occurred when a user deleted the 'Default 48 hours/week' working schedule. The 'Payroll: Update data' cron job then encountered an error because the reference to this schedule was no longer found. This ensures the payroll update process continues to function correctly after schedule deletions.
Original PR description
When the ``Default 48 hours/week`` working schedule is deleted and the ``Payroll: Update data`` cron runs, a traceback is raised. Steps to reproduce the error: - Install ``l10n_mx_hr_payroll`` module…
When the ``Default 48 hours/week`` working schedule is deleted and
the ``Payroll: Update data`` cron runs, a traceback is raised.
Steps to reproduce the error:
- Install ``l10n_mx_hr_payroll`` module with demo data
- Switch to ``INNOVACION VALOR Y DESARROLLO SA SA`` company
- Go to Employees > Configuration > Settings > Change Company Working Hours
- Go to Working Schedules > Delete ``Default 48 hours/week`` working schedule
- Run the ``Payroll: Update data`` cron
Traceback:
```py
ValueError: External ID not found in the system: l10n_mx_hr_payroll.resource_calendar_def_48h
ParseError: while parsing /home/odoo/src/enterprise/l10n_mx_hr_payroll/data/hr_payroll_structure_type_data.xml:3, somewhere inside <record id="l10n_mx_employee" model="hr.payroll.structure.type">
<field name="name">Mexico: Employee</field>
<field name="default_resource_calendar_id" ref="l10n_mx_hr_payroll.resource_calendar_def_48h"/>
<field name="country_id" ref="base.mx"/>
</record>
```
The ``Payroll: Update data`` cron updates payroll data that references the ``Default 48 hours/week`` working schedule.
If the user has deleted this working schedule, the external ID no longer exists, leading to the above traceback.
sentry-7166574553A bug preventing users from searching within sign templates has been fixed. Previously, the search function within PDF templates was unresponsive. This update removes a technical issue that blocked users from utilizing the search feature, ensuring proper functionality.
Original PR description
Currently when the user is viewing sign templates, they are unable to search within a PDF. **Steps to replicate:** * Install `sign` with demo data * Sign > Templates > Open a template * Try searching using the magnifying glass button **Observed Behavior:** * User is unable to type anything in the PDF search box. **Root cause:** * This error happens because `preventDefault()` is called during a `keydown` event. At [1], calling `event.preventDefault()` stops the key’s normal behavior, so the typed character is not added to the input field. **Solution:** * Remove the `preventDefault` call which allows the search to work again. [1]: https://github.com/odoo/enterprise/blob/3df585779e6ede664279331c4531043688dadf17/sign/static/src/backend_components/editable_pdf_iframe_mixin.js#L623 opw-5366074 Forward-Port-Of: odoo/enterprise#102749
This update streamlines security permissions within the VoIP CRM module. Previously, access was granted based on multiple roles, which has been simplified to only require the 'salesman' role. This change enhances security and reduces potential access issues.
Original PR description
`group_sale_manager` implies `group_sale_salesman`[1] [2]. Just checking `group_sale_salesman` is enough. [1]: https://github.com/odoo/odoo/blob/54681272e9f00a171fe49f690979e2a8353ff5fb/addons/sales_team/security/sales_team_security.xml#L25-L33 [2]: https://github.com/odoo/odoo/blob/54681272e9f00a171fe49f690979e2a8353ff5fb/addons/sales_team/security/sales_team_security.xml#L17-L23i Task-5461729
This update fixes a cluttered appraisal form view issue that occurred when a large number of appraisal templates were used. The change simplifies the form by reverting to a standard, searchable dropdown, enhancing usability and readability for users. This improves the overall user experience when managing appraisals.
Original PR description
Steps to reproduce: - Install the hr_appraisal module. - Open the form view of an appraisal when more than 100 appraisal templates exist. Issue: When the appraisal form view is opened with a large number of templates, the view becomes cluttered because all templates are displayed at once. Fix: This PR removes the widget and reverts to a standard related field with a searchable dropdown, improving readability and usability. task-5438146
This update resolves an issue where long date ranges in Field Service tasks caused the kanban card layout to break. The fix ensures the date range widget stays within the card's boundaries, maintaining a consistent and visually appealing user experience. This prevents visual disruptions and improves usability.
Original PR description
Steps to reproduce: ---------------------------- 1. Install Field Service module 2. Open any task from Field service module 3. In the Planned date field set a wide range spanning years, for example:…
Steps to reproduce: ---------------------------- 1. Install Field Service module 2. Open any task from Field service module 3. In the Planned date field set a wide range spanning years, for example: Dec 16, 2024, 1:30 PM → Oct 13, 2026, 6:00 PM. 4. Go back to kanban view 5. Adjust display to around 360 px Observation: ---------------------------- The planned date daterange widget overflows and extends outside the kanban card, breaking the card layout and visual containment. Issue: ---------------------------- The daterange widget's parent container did not enforce a width, so the widget could grow beyond the kanban card boundary when a long date range was used. Solution: ---------------------------- Add the w-100 class to the daterange container div to enforce full-width layout within the kanban card. Before: <img width="584" height="529" alt="before_css" src="https://github.com/user-attachments/assets/e89302b0-975c-47eb-91ec-89dbfe813493" /> After: <img width="561" height="528" alt="after_css" src="https://github.com/user-attachments/assets/48b60a78-18da-4504-98ef-a9c4013b107b" /> opw-5219941
This update corrects inconsistencies in the documentation across several Odoo modules. The changes ensure that all public documentation is clear, accurate, and follows established standards. This improves the usability and maintainability of the system for internal teams.
This update resolves a validation error that occurred when creating new spreadsheet templates within the Quality Control app. The fix provides a default name for the template, ensuring the creation process completes successfully. This improves usability for users creating quality control spreadsheets.
Original PR description
**Issue** A validation error is raised when creating a new spreadsheet template from a Quality Control Point. **Steps to reproduce** 1. Open the Quality app. 2. Go to Quality Control > Control…
**Issue** A validation error is raised when creating a new spreadsheet template from a Quality Control Point. **Steps to reproduce** 1. Open the Quality app. 2. Go to Quality Control > Control Points. 3. Click "New". 4. Set the type to "Spreadsheet". 5. Click on Spreadsheet Template > Search More. 6. Click "New". -> A validation error is raised. **Cause** In `quality_view`: https://github.com/odoo/enterprise/blob/f54585f84b0fa7a73efb3f0e14266972d510f0a6/quality_control/views/quality_views.xml#L840C17-L845C19 the `many2one_spreadsheet` widget (see [`many2one_spreadsheet_field.js`](https://github.com/odoo/enterprise/blob/f54585f84b0fa7a73efb3f0e14266972d510f0a6/spreadsheet_edition/static/src/assets/components/many2one_spreadsheet_field.js#L36)) overrides "Create and Edit" to create a new spreadsheet through `Many2XSpreadsheetAutocomplete`: https://github.com/odoo/enterprise/blob/f54585f84b0fa7a73efb3f0e14266972d510f0a6/spreadsheet_edition/static/src/assets/components/many2one_spreadsheet_field.js#L11C9-L14C51 This flow does not set a default value for the required `name` field, nor does `action_open_new_spreadsheet`:https://github.com/odoo/enterprise/blob/8365feab396679f0323e89c2f4e0c825a0b2ee7e/spreadsheet_edition/models/spreadsheet_mixin.py#L348 Since `name` is required: https://github.com/odoo/enterprise/blob/8365feab396679f0323e89c2f4e0c825a0b2ee7e/quality_control/models/quality_spreadsheet_template.py#L12 validation fails. **Solution** Provide a default value for the `name` field, using the same default as in `documents_document.py`: https://github.com/odoo/enterprise/blob/8365feab396679f0323e89c2f4e0c825a0b2ee7e/documents_spreadsheet/models/documents_document.py#L321 opw-5340710 Forward-Port-Of: odoo/enterprise#101671