Saturday, September 27, 2025
15 changes · 19.0
Enhancements to existing features
This update adds broader automated checks for Mexican payroll CFDI signing scenarios, including bonuses, savings funds, and deductions. It helps reduce the risk of payroll e-documents being generated or signed incorrectly, improving compliance confidence for Mexican payroll operations.
Original PR description
This adds a bunch of scenarios for the CFDI signing. Task: 5066078
This change improves troubleshooting by preserving the full error details when automated web tour steps fail. It helps developers identify the real source of failures faster, reducing time spent diagnosing unclear browser errors.
Original PR description
Because it only embeds the error message, and because it ultimately gets `console.error`-ed, an error during a `run()` function is currently extremely unhelpful e.g.
Cannot read properties of undefined (reading 'ownerDocument')
might be all you get. And despite what one might assume, browsers (or at least chrome) don't seem to chain stacktraces when using `{cause}`, so even printing stacktraces on `console.error` does not yield useful information, the stacktrace point to `performAction` instead of a useful location.
So use the `Error#stack` if it's available. In chrome that includes both the error message and the full stack, so a formatted error message is unnecessary. Fall back on a formatted error message if the error has no stack for some reason.
Forward-Port-Of: odoo/odoo#227169The website editor now handles translatable content more precisely, avoiding unnecessary editable behavior on elements that should not be directly changed. This improves reliability when translating website pages and reduces the chance of accidental editing side effects.
Original PR description
[IMP] html_builder, *: improve the logic of the translation plugin *: website The goal of this commit is to improve the logic of the `TranslationPlugin` plugin. Indeed, we do not want this plugin to…
[IMP] html_builder, *: improve the logic of the translation plugin *: website The goal of this commit is to improve the logic of the `TranslationPlugin` plugin. Indeed, we do not want this plugin to handle the addition of the `o_editable` class to html elements. Instead we let this task to `SetupEditorPlugin` as usual. The problem is still that some html elements have translatable attributes and those elements will not have the `o_editable` class as they do not have the branding (oe data information). To handle those, a new `o_editable_attribute` system class is added on them. Thanks to those classes, we know which nodes are translatable (elements that are editable and elements with the `o_editable_attribute` class have an attribute that is translatable). The advantage of handling the translation that way is that we do not add the `o_editable` class on elements that are not savable. This is better also in order to not add the `contenteditable` attribute abusively. Related to task-4367641 Forward-Port-Of: odoo/odoo#223901
This change makes it easier for other Odoo modules to add extra information when calculating analytic distributions for accounting entries. It supports more tailored accounting workflows without changing the standard behavior for users.
Original PR description
**Description of the issue/feature this PR addresses:** Add an inherit point to let others modules specify others/new values when the analytic distribution is build on the analytic distribution model. **Functional example:** If you wan to determine your analytic distribution on the employee (so the `employee_id` field is added into `account.analytic.distribution.model`), the specific module can not edit the dict (who is extracted by this PR). So I propose to extract the `dict` creation into a dedicated method. **Current behavior before PR:** It's not possible to edit the `dict` **Desired behavior after PR is merged:** Update the `dict` (and let it as a `frozendict` to use it as a key). ✅ I don't find any duplicates PR --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222661
Resolved issues and error corrections
This fixes Planning test behavior that could cause later automated checks to fail unexpectedly. It improves confidence in test results without changing the product experience for end users.
Original PR description
Due to the nature of the test cases written returning an empty object to actionService in test cases as they overriden using onRpc and causes a delay error, which causes the next case to fail. Fix: - Replace the empty object with a false, which is handled in the function runbot-231599
Documentation and clarification updates
This update adds new members to the Adhoc corporate Contributor License Agreement record. It keeps legal contribution records current so contributions from these members can be accepted under the proper agreement.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228593 Forward-Port-Of: odoo/odoo#226715
The project creation wizard now displays the Customer field neatly on one line when Billable is enabled. This improves visual consistency and makes the form easier to read, without changing any business process or data behavior.
Original PR description
**Steps to Reproduce:** - Go to the Projects app - Click "Create" to open the wizard - Enable the "Billable" option - Observe the alignment of the "Customer" field that appears **Issue:** The…
**Steps to Reproduce:** - Go to the Projects app - Click "Create" to open the wizard - Enable the "Billable" option - Observe the alignment of the "Customer" field that appears **Issue:** The "Customer" label and input field are stacked vertically, with the input's underline (green line) positioned below the label, leading to uneven spacing and misalignment compared to other fields. **Current behaviour:** - The "Customer" field is visually misaligned , its label and input are not horizontally aligned, causing UI inconsistency. **Expected behaviour:** - The "Customer" label and input field should align horizontally on a single line, with the input's underline matching the label's baseline. **Fix:** The layout is updated using proper flexbox classes to ensure the "Customer" label and input field appear on the same line with proper vertical alignment. Task-4949146 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221242
This update fixes an internal equity test that could fail unpredictably because records were compared in an inconsistent order. Making the test deterministic helps reduce false alarms in automated checks and supports smoother maintenance without changing customer-facing behavior.
Original PR description
The test `test_option_into_share` was failing because `assertRecordValues` compares lists in order, and the records returned by the `cap.table` search were not in the same sequence as the expected values in the test. This commit makes the test deterministic by replacing list-based `assertRecordValues` calls with individual assertions per record. [RB-232585](https://runbot.odoo.com/odoo/error/232585)
The Point of Sale discount flow now avoids a crash when staff use the ticket screen with draft orders and keyboard input. This keeps the checkout/ticket review experience stable when global discounts are configured.
Original PR description
Steps: ---------- - Install pos_discount. - Open a PoS config with a global discount configured. - Add a product to the order. - Open the ticket screen, select an order line, and press any key on the keyboard. Issue: ---------- - A traceback is raised for accessing product_id from an undefined order line. Cause: ---------- - The system tries to compare the selected order line's product with the global discount product, but draft order lines cannot be selected on the ticket screen. Fix: ---------- - Compare only if the selected line is available. task-5095765
Users with view-only access can now mark or unmark documents as favorites using the keyboard shortcut without seeing an access error. This makes the Documents app shortcut behavior consistent with manual favoriting and avoids interruptions for users browsing shared documents.
Original PR description
steps to reproduce =================== - Select a document where you have viewer permission. - Try to toggle the favorite through a hotkey. - Access Error when toggling favorite. Technical =========== - To maintain compatibility with stable versions and avoid changing the return type of the existing method, created the helper method, which will call `toggle_favorited` as we need to handle it for multiple records. After this commit ================== - This commit handles the accessError for shortcut flow. As in 18.3 we already have documents_favorite widget https://github.com/odoo/enterprise/pull/82639 which will work for manually favoriting the document, but it is not handling the shortcut flow. Task-4910326 Forward-Port-Of: odoo/enterprise#89928
This fixes an error that blocked newly created users from loading demo data in the Appraisal app. The change ensures the demo data loading process has the necessary access rights, making onboarding and testing smoother.
Original PR description
Currently, an error occurs when a new user tries to load demo data in the `Appraisal` module. Steps to reproduce: --- - Install `hr_appraisal` module (without demo data) - Create NEW user > Login…
Currently, an error occurs when a new user tries to load demo data in the `Appraisal` module.
Steps to reproduce:
---
- Install `hr_appraisal` module (without demo data)
- Create NEW user > Login with new user
- Open `Appraisal` and Click `Load Demo Data`
Traceback:
---
```py
ParseError: <record id="calendar_event_appraisal_1" model="calendar.event" forcecreate="1">
<field name="user_id" ref="base.user_admin"/>
<field name="name">Appraisal of Emma Granger</field>
<field name="partner_ids" eval="[(6,0,[ref('hr.work_contact_sj'), ref('hr.work_contact_mw'), ref('hr.work_contact_eg')])]"/>
<field name="start" eval="(DateTime.now() + relativedelta(months=1)).strftime('%Y-%m-%d 07:00:00')"/>
<field name="stop" eval="(DateTime.now() + relativedelta(months=1)).strftime('%Y-%m-%d 09:00:00')"/>
<field name="res_model_id" ref="hr_appraisal.model_hr_appraisal"/>
<field name="res_model">hr.appraisal</field>
<field name="res_id" ref="hr_appraisal.hr_appraisal_1"/>
</record>
ValueError: ParseError('while parsing /home/odoo/odoo/enterprise/hr_appraisal/data/scenarios/hr_appraisal_scenario.xml:561, somewhere inside\n<record id="calendar_event_appraisal_1" model="calendar.event" forcecreate="1">\n <field name="user_id" ref="base.user_admin"/>\n <field name="name">Appraisal of Emma Granger</field>\n <field name="partner_ids" eval="[(6,0,[ref(\'hr.work_contact_sj\'), ref(\'hr.work_contact_mw\'), ref(\'hr.work_contact_eg\')])]"/>\n <field name="start" eval="(DateTime.now() + relativedelta(months=1)).strftime(\'%Y-%m-%d 07:00:00\')"/>\n <field name="stop" eval="(DateTime.now() + relativedelta(months=1)).strftime(\'%Y-%m-%d 09:00:00\')"/>\n <field name="res_model_id" ref="hr_appraisal.model_hr_appraisal"/>\n <field name="res_model">hr.appraisal</field>\n <field name="res_id" ref="hr_appraisal.hr_appraisal_1"/>\n </record>') while evaluating
'action = model._load_demo_data()'
```
This error occurs because the new user has not been granted administrative rights.
This commit resolves the issue by granting the user superuser rights.
sentry-6110523247
Forward-Port-Of: odoo/enterprise#93461Forward-Port-Of: odoo/enterprise#95022
Original PR description
Forward-Port-Of: odoo/enterprise#95022
The mobile preview button now uses the intended color in both the website menu and the HTML builder top bar. This makes the editing interface more visually consistent and easier to recognize for users previewing pages on mobile.
Original PR description
- The mobile preview button color is changed at two places: 1. In the website systray menu. 2. In the HTML builder top-bar. Before: <img width="222" height="103" alt="outsidediff" src="https://github.com/user-attachments/assets/b2d3997a-4011-440f-8d14-22b5ebaf295c" /> <img width="428" height="104" alt="indiff" src="https://github.com/user-attachments/assets/2cb07173-2f20-42b0-abb2-289ed7476347" /> After: <img width="251" height="89" alt="image" src="https://github.com/user-attachments/assets/2c6f516c-96a7-495e-bea4-0e6e7b39ae8c" /> <img width="409" height="92" alt="image" src="https://github.com/user-attachments/assets/ea939d9d-d47c-472f-b62d-db1dc8bd81c4" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
New users can now load demo data in the Attendance app without running into a permissions error. This makes it easier for teams to try or evaluate Attendance features without needing administrator intervention.
Original PR description
Currently, an error occurs when a new user tries to load demo data in the ``Attendance`` module. Steps to reproduce: --- - Install ``hr_attendance`` module (without demo data) - Create NEW user >…
Currently, an error occurs when a new user tries to load demo data in the ``Attendance`` module.
Steps to reproduce:
---
- Install ``hr_attendance`` module (without demo data)
- Create NEW user > Login with new user
- Open ``Attendance`` and Click ``Load Demo Data``
Traceback:
---
```
AccessError
You are not allowed to create 'Resource Working Time' (resource.calendar) records.
This operation is allowed for the following groups:
- Administration/Settings
Contact your administrator to request access if necessary.
ParseError
while parsing /home/odoo/src/odoo/saas-18.1/addons/hr_attendance/data/scenarios/hr_attendance_scenario.xml:5, somewhere inside <record id="resource_calendar_std_38h" model="resource.calendar" forcecreate="1">
<field name="name">Standard 32 hours/week (4 work days, friday free)</field>
<field name="company_id" eval="False"/>
<field name="hours_per_day">8</field>
<field name="attendance_ids" eval="[(5, 0, 0), (0, 0, {'name': 'Monday Morning', 'dayofweek': '0', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}), (0, 0, {'name': 'Monday Lunch', 'dayofweek': '0', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}), (0, 0, {'name': 'Monday Afternoon', 'dayofweek': '0', 'hour_from': 13, 'hour_to': 17, 'day_period': 'afternoon'}), (0, 0, {'name': 'Tuesday Morning', 'dayofweek': '1', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}), (0, 0, {'name': 'Tu...
ValueError
ParseError('while parsing /home/odoo/src/odoo/saas-18.1/addons/hr_attendance/data/scenarios/hr_attendance_scenario.xml:5, somewhere inside\n<record id="resource_calendar_std_38h" model="resource.calendar" forcecreate="1">\n <field name="name">Standard 32 hours/week (4 work days, friday free)</field>\n <field name="company_id" eval="False"/>\n <field name="hours_per_day">8</field>\n <field name="attendance_ids" eval="[(5, 0, 0), (0, 0, {\'name\': \'Monday Morning\', \'dayofweek\': \'0\', \'hour_from\': 8, \'hour_to\': 12, \'day_period\': \'morning\'}), (0, 0, {\'name\': \'Monday Lunch\', \'dayofweek\': \'0\', \'hour_from\': 12, \'hour_to\': 13, \'day_period\': \'lunch\'}), (0, 0, {\'name\': \'Monday Afternoon\', \'dayofweek\': \'0\', \'hour_from\': 13, \'hour_to\': 17, \'day_period\': \'afternoon\'}), (0, 0, {\'name\': \'Tuesday Morning\', \'dayofweek\': \'1\', \'hour_from\': 8, \'hour...
```
This error occurs because the new user has not been granted administrative rights.
This commit resolves the issue by granting the user superuser rights.
sentry-6110523247
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#195714Archiving multiple Helpdesk teams connected to different websites no longer causes an error. This helps administrators manage teams in bulk more reliably when using website helpdesk forms.
Original PR description
Currently, an error occurs when archiving multiple helpdesk teams linked to different websites. **Steps to reproduce:** - Install the `website_helpdesk` module. - Go to Website, Configuration >…
Currently, an error occurs when archiving multiple helpdesk teams linked to different websites. **Steps to reproduce:** - Install the `website_helpdesk` module. - Go to Website, Configuration > Websites and create two websites (`W1` and `W2`). - Go to Helpdesk, Configuration > Helpdesk Teams > create two teams (`T1` and `T2`). - Enable the `Website Form` (under `Help Center`), assign `W1` to `T1` and `W2` to `T2`. - Return to the list view, select both teams, and attempt to `archive` them. **Error:** `ValueError: Expected singleton: website(3, 1)` **Root Cause:** At [1], the code incorrectly uses `with_website.website_id.id`, when `multiple websites` are involved, this leads to an `error`. **Fix:** This commit prevents errors and ensures that users can archive multiple helpdesk teams linked to different websites [1]: https://github.com/odoo/enterprise/blob/8b72fdef63f634ccf436b49adbac5c1f9358c127/website_helpdesk/models/helpdesk.py#L102 sentry-6867906123 Forward-Port-Of: odoo/enterprise#94318