Wednesday, April 16, 2025
26 changes · saas-18.2
Resolved issues and error corrections
The Discuss call view now has more breathing room around the edges, reducing the chance that controls are hidden or accidentally tapped on mobile devices with curved screens. The call panel also has a slightly rounded look to better match the rest of the Discuss interface.
Original PR description
Before this commit, the spacing around the call view was too narrow, which could lead to a degraded user experience, for example on mobile devices with curved screen where having elements too close…
Before this commit, the spacing around the call view was too narrow, which could lead to a degraded user experience, for example on mobile devices with curved screen where having elements too close to the sides could hide them or cause involuntary touch interactions. This commit also adds a slight curve to the call view to better match the overall style of discuss. | Before | After | |--------|--------| | <img width="753" alt="Screenshot 2025-04-16 at 14 14 29" src="https://github.com/user-attachments/assets/b5bbc1f3-3b1d-420e-ac45-6f05edf6c75a" /> | <img width="959" alt="Screenshot 2025-04-16 at 14 34 21" src="https://github.com/user-attachments/assets/a42e2e3f-83df-49fe-86ac-1848ff68bb47" /> | | <img width="387" alt="Screenshot 2025-04-16 at 14 15 33" src="https://github.com/user-attachments/assets/8262f3d3-bab0-47df-8ca4-2942887680c4" /> | <img width="387" alt="Screenshot 2025-04-16 at 14 34 44" src="https://github.com/user-attachments/assets/03e813cd-9a5a-4e7d-87ef-364058016d6a" /> |
Live chat call start notifications now show the agent’s custom live chat name instead of a generic or incorrect user name. This makes conversations clearer for visitors and keeps the customer-facing agent identity consistent.
Original PR description
Before this PR, the live chat user name of the agent was not used in the call start notification. This PR fixes the issue. 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 makes small visual refinements across Odoo Discuss, including rounder inputs, cleaner avatars, clearer new-message markers, and improved unread indicators. It also changes the call button wording so users see “join the call” when a call is already active, reducing confusion.
Original PR description
- editable input in discuss header and chat window header are rounded - avatar bg leaked some `.bg-view` in many places, fixed by `.rounded-3` on container - "new" message separator text has weight changed from `.fw-bolder` to `.fw-bolder` - "new" message separator line is larger but reduced opacity - "new" message separator has `.shadow-sm` - thread new message banner has `.shadow-sm` and bottom rounded. - "start a call" becomes "join the call" when there's an ongoing call - discuss sidebar unread indicator is slightly bigger - "You:" message prefix icon has slightly reduced opacity
This update aligns the Belgian fiscal POS self-ordering service with the latest connection method used for real-time communication. It helps ensure self-ordering continues to connect reliably after the related platform change.
Original PR description
The commit https://github.com/odoo/odoo/pull/202553/commits/cebf5cd5702926fffdd61814ddd672aa17ff52fb changes the method connecting the service to the websocket. The change in pos_blackbox_be has not been done so it needs to be.
Miscellaneous changes
Before this commit, the text wrapping in the product categories sometimes resulted in ugly breaks in the middle of words where not needed. Steps to reproduce ----- 1. Configure a category with spaces in Point of Sale > Configuration > PoS Product Categories For example, a category named "Special Menu" 2. Open a self-ordering kiosk, the "Special Menu" will be displayed as "Special M" + "enu" Cause ----- The styling `word-break: break-all;` was added to this element in #140095 to avoid
Original PR description
Before this commit, the text wrapping in the product categories sometimes resulted in ugly breaks in the middle of words where not needed. Steps to reproduce ----- 1. Configure a category with spaces in Point of Sale > Configuration > PoS Product Categories For example, a category named "Special Menu" 2. Open a self-ordering kiosk, the "Special Menu" will be displayed as "Special M" + "enu" Cause ----- The styling `word-break: break-all;` was added to this element in #140095 to avoid overlapping category names. However `break-all` always breaks in the exact place needed, often resulting in breaks in the middle of words. Solution ----- Use `overflow-wrap: break-word;` instead which will break between words if possible and only break in the middle of a word if needed. opw-4642999 Forward-Port-Of: odoo/odoo#205080
When submitting the new address, the `post` method from the `http` service is called. This method expects a response in JSON. The problem arises when a redirection occurs during that call, then the returned content might be of another type which triggers an error. For example, it is possible to be redirected to the `/shop/cart` page if the cart is not valid. Steps to reproduce: - Add a product to your cart - Then head over to the address form during checkout. - Before confirming your addre
Original PR description
When submitting the new address, the `post` method from the `http` service is called. This method expects a response in JSON. The problem arises when a redirection occurs during that call, then the…
When submitting the new address, the `post` method from the `http` service is called. This method expects a response in JSON. The problem arises when a redirection occurs during that call, then the returned content might be of another type which triggers an error. For example, it is possible to be redirected to the `/shop/cart` page if the cart is not valid.
Steps to reproduce:
- Add a product to your cart
- Then head over to the address form during checkout.
- Before confirming your address, in another tab, open the backend and remove every order line in your cart.
- Then back on the previous tab, confirm your address.
- You can observe an error in the console:
```
SyntaxError: Unexpected token '<', ..."
<!DOCTYPE "... is not valid JSON
```
This commit fixes this issue by sending the redirection URL in the result of `shop_address_submit` and lets the client handle the redirection.
This commit also renames the `successUrl` value to `redirectUrl` to make it more clear that it is not necessarily a success URL any more, but the next location URL for the user, ie. redirect.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#201755Versions -------- - 16.0+ Steps ----- 1. Run the `test_gift_card_email_sender` without `website_sale_loyalty`. Issue ----- `AttributeError` Cause ----- The `sale_loyalty` test calls `_auto_apply_rewards`, which is defined in `website_sale_loyalty`. Solution -------- The test works just as well without the method call, so we can simply remove it. runbot-163194 Forward-Port-Of: odoo/odoo#206295
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Run the `test_gift_card_email_sender` without `website_sale_loyalty`. Issue ----- `AttributeError` Cause ----- The `sale_loyalty` test calls `_auto_apply_rewards`, which is defined in `website_sale_loyalty`. Solution -------- The test works just as well without the method call, so we can simply remove it. runbot-163194 Forward-Port-Of: odoo/odoo#206295
Steps to Reproduce: - Open the industry fsm app and navigate to the activity view. - Click on any task to open its form view. Issue: - A traceback error occurs when opening a task on large screens because 'newWindow' is undefined. Fix: - Set a default empty objec in openRecord to ensure 'newWindow' is always defined. [Issue](https://github.com/odoo/enterprise/commit/2bd4b62d828cc0a283bcbf12eccd918c2d8076b6) task-4664793 Forward-Port-Of: odoo/odoo#204737
Original PR description
Steps to Reproduce: - Open the industry fsm app and navigate to the activity view. - Click on any task to open its form view. Issue: - A traceback error occurs when opening a task on large screens because 'newWindow' is undefined. Fix: - Set a default empty objec in openRecord to ensure 'newWindow' is always defined. [Issue](https://github.com/odoo/enterprise/commit/2bd4b62d828cc0a283bcbf12eccd918c2d8076b6) task-4664793 Forward-Port-Of: odoo/odoo#204737
Problem --------- As of Jan 01, 2025 the Romanian tax authority will accept blank tax IDs for recipient individuals of an e-invoice in the form "0000000000000". However, in Odoo a blank tax id number for an individual contact is denoted as '/'. Objective --------- When creating the Invoice XML, if the res.partner has an empty Tax ID, or a tax ID that is "/" or <2 characters, replace the value by 0000000000000 in the produced XML. task-4610149 --- I confirm I have signed the CLA a
Original PR description
Problem --------- As of Jan 01, 2025 the Romanian tax authority will accept blank tax IDs for recipient individuals of an e-invoice in the form "0000000000000". However, in Odoo a blank tax id number for an individual contact is denoted as '/'. Objective --------- When creating the Invoice XML, if the res.partner has an empty Tax ID, or a tax ID that is "/" or <2 characters, replace the value by 0000000000000 in the produced XML. task-4610149 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205932 Forward-Port-Of: odoo/odoo#200977
Contains two commits. One adds the node in `account_edi_ubl_cii` module and one to adapt the Nilvera e-invoice to use it. Forward-Port-Of: odoo/odoo#204508
Original PR description
Contains two commits. One adds the node in `account_edi_ubl_cii` module and one to adapt the Nilvera e-invoice to use it. Forward-Port-Of: odoo/odoo#204508
Before this commit: - No `I` button was displayed on configuring combo products Following this commit: - The `I` button is made visible when configuring combo products. task-4654063 Forward-Port-Of: odoo/odoo#206174 Forward-Port-Of: odoo/odoo#203210
Original PR description
Before this commit: - No `I` button was displayed on configuring combo products Following this commit: - The `I` button is made visible when configuring combo products. task-4654063 Forward-Port-Of: odoo/odoo#206174 Forward-Port-Of: odoo/odoo#203210
Before this commit, if the state of an order was set to 'cancel' and then the order was synced to the server, it would incorrectly be saved as 'paid'. This could happen in a POS restaurant environment, for example, when releasing a table. As a result, empty orders would appear as paid, which is incorrect. This behavior was particularly problematic in certain localizations where such empty, paid orders lacked required fiscal data, leading to errors during session closing. opw-4714877 ---
Original PR description
Before this commit, if the state of an order was set to 'cancel' and then the order was synced to the server, it would incorrectly be saved as 'paid'. This could happen in a POS restaurant environment, for example, when releasing a table. As a result, empty orders would appear as paid, which is incorrect. This behavior was particularly problematic in certain localizations where such empty, paid orders lacked required fiscal data, leading to errors during session closing. opw-4714877 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205334
Before this commit, when a product template had an attribute with only one value and another attribute with multiple values, the PoS would sometimes select the wrong `product.product` after using the variant configurator. This happened because `product_template_variant_value_ids` only includes attribute values that have more than one possible value. opw-4689034 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205392
Original PR description
Before this commit, when a product template had an attribute with only one value and another attribute with multiple values, the PoS would sometimes select the wrong `product.product` after using the variant configurator. This happened because `product_template_variant_value_ids` only includes attribute values that have more than one possible value. opw-4689034 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205392
Before this commit, opening a session would immediately assign a sequence name, even before the opening control step was completed. If the user clicks on the backend, the session would be deleted but the sequence number would be skipped, leading to gaps. With this fix, sessions are first assigned a temporary name upon creation. The final sequence name is only generated after the opening amount is set, ensuring that the sequence remains continuous and accurate. opw-4711954 --- I confirm
Original PR description
Before this commit, opening a session would immediately assign a sequence name, even before the opening control step was completed. If the user clicks on the backend, the session would be deleted but the sequence number would be skipped, leading to gaps. With this fix, sessions are first assigned a temporary name upon creation. The final sequence name is only generated after the opening amount is set, ensuring that the sequence remains continuous and accurate. opw-4711954 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205138
Problem: When calling `modify_image` for an attachment linked to a record that hasn't been created yet (`res_id` is `None`), a traceback occurs. This is because `fields` lacks the `res_id` key when we call: request.env[fields['res_model']] .browse(fields['res_id']) .check_access_rights('write') Solution: Use `0` as default `res_id`. This is consistent with what `get_existing_attachment` already does: fields['res_id'] = fields.get('res_id') or 0 Steps to re
Original PR description
Problem:
When calling `modify_image` for an attachment linked to a record that hasn't been created yet (`res_id` is `None`), a traceback occurs. This is because `fields` lacks the `res_id` key when we call:
request.env[fields['res_model']]
.browse(fields['res_id'])
.check_access_rights('write')
Solution:
Use `0` as default `res_id`. This is consistent with what `get_existing_attachment` already does:
fields['res_id'] = fields.get('res_id') or 0
Steps to reproduce:
1. Go to "Email Marketing" > "New".
2. Fill in the "Subject" and choose a mailing list.
3. In the mail body, insert a template containing an image.
4. Click on the image and replace it.
5. Save (only at this step). → Traceback occurs since `modify_image` is called with a `None` res_id.
opw-4715999
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#206092
Forward-Port-Of: odoo/odoo#205838There has been a recent change to the specs where they changed the endpoint to send B2C invoices: `uploadb2c`. So now, - if an invoice is made to a commercial partner that is of type company, we keep sending it to the old endpoint (no change); - if it is made to a non-company customer, then we send to the new endpoint. task-4645442 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205867 Forward-Port-Of: odoo/odoo#203743
Original PR description
There has been a recent change to the specs where they changed the endpoint to send B2C invoices: `uploadb2c`. So now, - if an invoice is made to a commercial partner that is of type company, we keep sending it to the old endpoint (no change); - if it is made to a non-company customer, then we send to the new endpoint. task-4645442 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205867 Forward-Port-Of: odoo/odoo#203743
[REF] web: move default dates to a function - getAllDayDates function was added to be able to inherit it in other modules and change default dates if needed. task-4164485 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#206036 Forward-Port-Of: odoo/odoo#189917
Original PR description
[REF] web: move default dates to a function - getAllDayDates function was added to be able to inherit it in other modules and change default dates if needed. task-4164485 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#206036 Forward-Port-Of: odoo/odoo#189917
Steps to reproduce: - Drag and drop image gallery snippet. - Delete the snippet. - Click on Undo. - The snippet appears but images will not be there. The issue comes from the fact that when the snippet is deleted, a relayout of the snippet is triggered for each image present in it. This is necessary when an image is deleted, but not when the snippet itself is deleted. task-4690318 Forward-Port-Of: odoo/odoo#206019
Original PR description
Steps to reproduce: - Drag and drop image gallery snippet. - Delete the snippet. - Click on Undo. - The snippet appears but images will not be there. The issue comes from the fact that when the snippet is deleted, a relayout of the snippet is triggered for each image present in it. This is necessary when an image is deleted, but not when the snippet itself is deleted. task-4690318 Forward-Port-Of: odoo/odoo#206019
Before this commit, if the language name couldn't be detected by babel, attempting to translate the message resulted in a crash with `UnknownLocaleError`. Steps to reproduce: - make a livechat with visitor with `crh-Latn` locale - as livechat operator, attempt to translate the message This happens because babel is unable to parse `crh-Latn`, which stands for Crimean Tatar based on Latin script. This locale has been officially approved by the National Commission on the Crimean Tatar Langu
Original PR description
Before this commit, if the language name couldn't be detected by babel, attempting to translate the message resulted in a crash with `UnknownLocaleError`. Steps to reproduce: - make a livechat with…
Before this commit, if the language name couldn't be detected by babel, attempting to translate the message resulted in a crash with `UnknownLocaleError`. Steps to reproduce: - make a livechat with visitor with `crh-Latn` locale - as livechat operator, attempt to translate the message This happens because babel is unable to parse `crh-Latn`, which stands for Crimean Tatar based on Latin script. This locale has been officially approved by the National Commission on the Crimean Tatar Language on April 4th [1], very recently from the date of this commit. Because of the recency of the new locale, babel lack its parsing. Failure lead to error `UnknownLocaleError`, which is a problem because data of translated message also passes the Language name, which requires the good parsing of the locale by babel. This commit fixes the issue by displaying the language name as the locale code in case babel was unable to parse it. In practice this happens rarely, and there's incentive to update babel as quickly as possible, but that's not a reason to display the translated message even if it cannot deduce the lang name. [1]: https://babel.ua/en/news/116901-ukraine-approves-new-crimean-tatar-orthography-based-on-latin-script Forward-Port-Of: odoo/odoo#205943
Fix some issues related to the comment composer in portal chatter. task-4715576 Forward-Port-Of: odoo/odoo#205939
Original PR description
Fix some issues related to the comment composer in portal chatter. task-4715576 Forward-Port-Of: odoo/odoo#205939
Steps to reproduce the bug: - Enter Website Edit mode. - Drag and drop a snippet onto the page. - Click on the text in the snippet and then click on the AI text generator button in the editor toolbar. - Close the dialog. - A traceback occurs. The `onClose` handler in the `openChatGPTDialog` function was previously passing the `restore` function directly. This caused a TypeError when `closeParams` was introduced as an argument in the `onClose` function of the `dialogService` since this
Original PR description
Steps to reproduce the bug: - Enter Website Edit mode. - Drag and drop a snippet onto the page. - Click on the text in the snippet and then click on the AI text generator button in the editor toolbar. - Close the dialog. - A traceback occurs. The `onClose` handler in the `openChatGPTDialog` function was previously passing the `restore` function directly. This caused a TypeError when `closeParams` was introduced as an argument in the `onClose` function of the `dialogService` since this commit [1]. The bug comes from the fact that the `preserveCursor` function's `restore` expects a Map object, but `closeParams` is an object. To fix this, the `onClose` handler now calls `restore` inside an anonymous function (`() => restore()`) to avoid passing unexpected values and prevent the TypeError. [1]: https://github.com/odoo/odoo/commit/31c00161fd3a77c9fbd260754cb8c142fcb0d652 task-4708314 Forward-Port-Of: odoo/odoo#205517
Revealed by the changes to single app tests (which now test every module). While at it, remove a few unnecessary setting of product-id on non-variant scenarios, they don't blow up but they look a lot like odoo/odoo#206050 and why bother? https://runbot.odoo.com/odoo/error/163244 Forward-Port-Of: odoo/odoo#206053
Original PR description
Revealed by the changes to single app tests (which now test every module). While at it, remove a few unnecessary setting of product-id on non-variant scenarios, they don't blow up but they look a lot like odoo/odoo#206050 and why bother? https://runbot.odoo.com/odoo/error/163244 Forward-Port-Of: odoo/odoo#206053
…simplfied When the partner has no VAT and it is within Europe and it is below the simplified invoice limit, we could indicate the invoice as simplified by default. If it is wrong, the user can still change it. opw-4633564 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#206058 Forward-
Original PR description
…simplfied When the partner has no VAT and it is within Europe and it is below the simplified invoice limit, we could indicate the invoice as simplified by default. If it is wrong, the user can still change it. opw-4633564 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#206058 Forward-Port-Of: odoo/odoo#204630
Steps to Reproduce (Calendar View): 1. Open the Calendar view on the monthly scale. 2. Create a planning slot by clicking on a date to plan. 3. Notice that the default hours are set to 7 AM to 7 PM. Steps to Reproduce (Gantt View): 1. Open the Gantt view on the weekly scale. 2. Create a planning slot by clicking on a grid cell. 3. Observe that the default hours are set to 8 AM to 5 PM. - In the Calendar view on the monthly scale, creating a planning slot defaults to 7 AM to 7 PM.
Original PR description
Steps to Reproduce (Calendar View): 1. Open the Calendar view on the monthly scale. 2. Create a planning slot by clicking on a date to plan. 3. Notice that the default hours are set to 7 AM to 7 PM. Steps to Reproduce (Gantt View): 1. Open the Gantt view on the weekly scale. 2. Create a planning slot by clicking on a grid cell. 3. Observe that the default hours are set to 8 AM to 5 PM. - In the Calendar view on the monthly scale, creating a planning slot defaults to 7 AM to 7 PM. - In the Gantt view on the weekly scale, creating a planning slot defaults to 8 AM to 5 PM. - These default hours do not align with the working calendar, leading to inconsistencies. - This fix adjusts the default hour settings in both views to ensure they align with the working calendar and account for unavailability. task-4164485 Forward-Port-Of: odoo/enterprise#83426 Forward-Port-Of: odoo/enterprise#69888
https://runbot.odoo.com/odoo/error/163099 This issue became visible as part of the change to test ACLs (removal of demo data, possibly change to groups too) as well as running the "single app tests" on *every module*, not just the apps. The issue is that `self.Requests.user` and `self.employee_user` are unrelated (the amazingly named `self.employee_user` doesn't even have a user). On leave creation, this triggers the rule `hr_leave_rule_employee_update` which checks if: - The current us
Original PR description
https://runbot.odoo.com/odoo/error/163099 This issue became visible as part of the change to test ACLs (removal of demo data, possibly change to groups too) as well as running the "single app tests"…
https://runbot.odoo.com/odoo/error/163099 This issue became visible as part of the change to test ACLs (removal of demo data, possibly change to groups too) as well as running the "single app tests" on *every module*, not just the apps. The issue is that `self.Requests.user` and `self.employee_user` are unrelated (the amazingly named `self.employee_user` doesn't even have a user). On leave creation, this triggers the rule `hr_leave_rule_employee_update` which checks if: - The current user is the employee's, which is not the case because the employee doesn't have a user. - Or the current user is the employee's leave manager, which is also not the case because the employee does not have a leaves manager. As a result the creation of the leaves fails immediately. Fix in 17.4 as the test was introduced in #53940 which was merged in (what would become) 17.3, even though the test setup means it might not be possible to trigger there because of all the demo messing with groups. Forward-Port-Of: odoo/enterprise#83427
Previously, the intrastat_code_id was filtered by checking against a large list that is sent to the frontend. This caused huge memory usage due to the list being used in many objects and the list itself being large, around 10k items. This memory leak caused slowness in the frontend while going through the product form views. Currently, the list is not being sent. The domain itself is evaluated from the frontend without sending a list. This reduces memory footprint and slowness. Forward-Port-
Original PR description
Previously, the intrastat_code_id was filtered by checking against a large list that is sent to the frontend. This caused huge memory usage due to the list being used in many objects and the list itself being large, around 10k items. This memory leak caused slowness in the frontend while going through the product form views. Currently, the list is not being sent. The domain itself is evaluated from the frontend without sending a list. This reduces memory footprint and slowness. Forward-Port-Of: odoo/enterprise#82239