Wednesday, October 15, 2025
30 changes · 19.0
Enhancements to existing features
Companies using Austrian POS localization can now automatically invite the email listed in company information to access the related Fiskaly dashboard. If the company email changes, a new invitation is sent, and existing Fiskaly organization data is kept up to date even while authentication is still pending.
Original PR description
In this commit: ------------------ - If a company email is set in the company information, we send an invitation to that email, allowing the user to access their company data on the Fiskaly dashboard by logging in using the company email. - If the email is later updated, access invitation will automatically be sent to the new email. - If the fiskaly organization exists, we should update the organization data even if the authentication is remaining to keep the data uptodate. Related PR: https://github.com/odoo/iap-apps/pull/1098 Task: 4881786 Forward-Port-Of: odoo/enterprise#88106
Opening the analytic distribution popup on invoice lines with many accounts now avoids making repeated background requests. This improves responsiveness for users working with detailed analytic allocations and reduces unnecessary system load.
Original PR description
Currently opening the analytic distrubtion popup on an invoice line creates N network requests per account set on the line. Steps to reproduce ----- 1. Edit the analytic distribution on an invoice line and add a lot of accounts 2. Open the popup again 3. A lot of web_read requests are made Issue ----- The display_name for the account and currency is not being passed to the field values in recordProps(), resulting in another fetch when each Field element is rendered. Solution ----- Pass account.accountDisplayName. The display name for the currency is actually not initially loaded by the client, but since that field is invisible, we can safely use an empty string. opw-5106219 Forward-Port-Of: odoo/odoo#231576 Forward-Port-Of: odoo/odoo#231342
The HTML editor was optimized to avoid unnecessary page layout and style recalculations during common editing actions. This should make editing feel more responsive, especially in situations where selections or block checks happen frequently.
Original PR description
The goal of this PR is to improve the performance of the HTML Editor by reducing the number of times layout or style recalculations are needed. [FIX] html_editor: make isCollapsed lazy ========== The…
The goal of this PR is to improve the performance of the HTML Editor by reducing the number of times layout or style recalculations are needed. [FIX] html_editor: make isCollapsed lazy ========== The goal of this commit is to make `isCollapsed` lazy. Currently, when calling `getSelectionData`, `selection.isCollapsed` is evaluated, which can trigger a layout recalculation. We now make it lazy and evaluate it only when necessary. This change helps avoid the cost of layout recalculations (few ms) in many situations. [FIX] html_editor: cache style.display in isBlock ======== This commit ensures that calls to `getComputedStyle(node).display` in the `isBlock` utility are properly cached. Currently, each call triggers a style recalculation, which can be costly. Solution: we cache the `display` value itself, not the entire return value of `getComputedStyle`. [FIX] html_editor: imp perf in base_container_plugin ====== This commit aims to improve performance. Using a `Set` only to remove a callback from a list is quite expensive compared to using a simple `if` check during the list iteration.
UAE payroll now excludes unpaid leave and unpaid sick leave days from end-of-service and related provision calculations. Payslips also show the total unpaid leave days, helping payroll teams review final settlements more clearly and accurately.
Original PR description
This commit excludes the Out Of Contract Unpaid Leaves and Unpaid Sick Leave days from the EoS and EoS Provision Salary Rule Calculations. We also show the total number of unpaid leave days on the EoS payslip. task-4886104 Forward-Port-Of: odoo/enterprise#97063 Forward-Port-Of: odoo/enterprise#95465
Leads created from live chat chatbot conversations now include files shared by the customer in the lead description. This helps sales teams see all relevant customer-provided information in one place, reducing missed context and follow-up delays.
Original PR description
Before this PR, when a lead was created from a chatbot conversation, the attachments shared by the customer were not included in the lead description. This PR adds the functionality to include these attachments in the lead description. Enterprise: https://github.com/odoo/enterprise/pull/94970 Task-4777564 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a website helpdesk live chat creates or updates a lead, attached files are now added to the lead description in a consistent format. This helps sales or support teams see the full customer context without needing to search elsewhere.
Original PR description
This commit PR attachment conversion logic with `_attachment_to_html` introduced in the related Community PR. Related: https://github.com/odoo/odoo/pull/227563 Task-4777564
Resolved issues and error corrections
Preparation tickets in Point of Sale now handle combo products correctly when different printers are assigned to different product categories. Each printer receives the combo name plus only the relevant items for its category, reducing kitchen or service confusion.
Original PR description
Before this commit: =================== - When using separate printers for product categories, combo products were not printed correctly. - All child products of a combo were sent to every printer, regardless of their category. After this commit: ================== - Combo products are now handled properly in preparation tickets. - Each printer will print the combo product title along with only the child products that belong to its assigned category. Task: 5056115 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230982 Forward-Port-Of: odoo/odoo#225658
Accounting users limited to a branch can now access the appropriate accounts from the parent company when creating journal entries. This prevents blocked or incomplete journal entry creation for branch-only accounting users.
Original PR description
**Steps to reproduce:** - Install accountant - Create a company branch for a company - Create a non-admin user with Accounting rights and access to the branch only - Connect with the created user - Go to "Accounting / Accounting / Journal Entries" - Create a journal entry and try to set an account on a line **Issue:** There is no account available. The accounts from the parent company should be selectable. **Cause:** The accounts are searched with a "parent_of" domain on "company_ids" field, which is a many2many field. However, as the user doesn't have access to the parent company, the parent company is excluded from the search when parsing the domain. opw-5096437 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231352 Forward-Port-Of: odoo/odoo#230797
This fixes an issue where country-specific point-of-sale fields could disappear when multiple devices were connected to the same session. Businesses using Chilean or Peruvian electronic invoicing in PoS will now keep required session information consistent across devices.
Original PR description
Before this commit, the special fields were added to the PoS session in the `_load_pos_data` function. However, they were not included when sending synchronization notifications to other devices. As a result, in multi-device setups, these fields would be removed after a WebSocket notification. related: https://github.com/odoo/odoo/pull/228419 opw-5073848 Forward-Port-Of: odoo/enterprise#95455
This fix ensures Spain-specific Point of Sale session information stays present when updates are synchronized between multiple devices. It prevents important localization data from being accidentally removed after real-time notifications, improving reliability for multi-device PoS setups.
Original PR description
Before this commit, the special fields were added to the PoS session in the `_load_pos_data` function. However, they were not included when sending synchronization notifications to other devices. As a result, in multi-device setups, these fields would be removed after a WebSocket notification. related: https://github.com/odoo/enterprise/pull/95455 opw-5073848 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228419
AI attachment handling now better supports tabular files such as CSV and spreadsheet formats by organizing rows in a way that can be processed more reliably. This helps users add spreadsheet-like documents as AI sources and improves the quality of information retrieval from those files.
Original PR description
This PR aims to properly support and chunk tabular attachments including csv, xls, xlsx, and ods attachments. task-id-5045336
Shipping labels can now be sent to a selected printer based on the warehouse operation type instead of automatically using the first compatible printer. This helps businesses route labels to the correct location and avoid printing mistakes in multi-printer setups.
Original PR description
Printing shipping labels is performed from the backend, once the shipping info are received in the chatter. The printing command is sent to the frontend via the user bus, then though longpolling to the iot box. This commit adds the possibility to select a printer instead of choosing automatically the first (with the right report associated) on the list. As the change is made on a stable version, we are using system parameters to store the selected printer without adding a new field. We associate a printer with the picking type, in order for to be able to have different printers by default on different picking types. Task: 4792491 Forward-Port-Of: odoo/enterprise#97034 Forward-Port-Of: odoo/enterprise#86818
Returning a non-rental product from a rental order now correctly reduces the delivered quantity on the sale order. This prevents inaccurate order status and invoicing information after rental-related returns.
Original PR description
**Issue**: Returning a non-rental product in a rental order does not correctly update the delivered quantity. **Steps to reproduce**: - Enable rental transfers via Settings > Rental. - Create a…
**Issue**: Returning a non-rental product in a rental order does not correctly update the delivered quantity. **Steps to reproduce**: - Enable rental transfers via Settings > Rental. - Create a rental order with (in that order!): - A rental product - A non-rental product - Confirm the rental order. - Open the related sale order. - Go to the delivery and validate it. - Return the delivery and validate the return. - Observe that the delivered quantity in the sale order is incorrect. **Cause**: The [_get_outgoing_incoming_moves](https://github.com/odoo/odoo/blob/ea6776f095d556e3429d2b847a66f78f2e866380/addons/sale_stock/models/sale_order_line.py#L200C17-L200C85) method fails to detect incoming moves when the destination location has `usage='internal'` (as in rental flows), instead of `customer` (see [_is_outgoing()](https://github.com/odoo/odoo/blob/ea6776f095d556e3429d2b847a66f78f2e866380/addons/stock/models/stock_location.py#L464)). This causes the delivery quantity not to be decremented on return. **Solution**: Relax `_is_incoming()` logic to consider moves as incoming if they come from a rental and go to an internal location. opw-4894358 Forward-Port-Of: odoo/odoo#224714 Forward-Port-Of: odoo/odoo#222093
Fixes several issues in the document extraction manual correction interface, including crashes, disappearing selection boxes, and inaccurate line matching. This makes it easier and more reliable for users to correct extracted data from images and documents.
Original PR description
**[FIX] iap_extract: fix crash when clicking on another column of x2many** When a x2many field is filled using the rectangular selection tool, a crash could occur when the component is busy filling…
**[FIX] iap_extract: fix crash when clicking on another column of x2many** When a x2many field is filled using the rectangular selection tool, a crash could occur when the component is busy filling the values for a field and the user clicks on another column. This happened because the `getNewRecordValues` function was using the current value of `this.activeBoxType` to get the value for the new record. This is incorrect as `this.activeBoxType` can change when the user clicks on another column of the x2many. --- **[FIX] iap_extract: fix line matching in manual correction component** In the logic that handles the matching of selected boxes with existing lines, it was assumed that the existing lines were sorted from top to bottom, but that wasn't guaranteed. When it's not sorted, the out-of-order existing lines couldn't be match to the selected boxes. --- **[FIX] iap_extract: fix loss of focus when clicking on image viewer** When the attachment showed by the viewer is an image and the selected field is a date, a click on the image (to start a rectangular selection or to click a box) would cause a loss of focus on the field which caused the boxes to disappear, making it unusable. This happened because the date fields are displaying a calendar popup which listens on the `pointerdown` event to hide itself when the click occurs outside of it. This causes the loss of focus of the field which hides the boxes. On top of this, we also need to prevent the propagation of the click event when it occurs on the box layers, as it also causes the loss of focus on x2many fields (there is a global click event listener that exits the edit mode when the click occurs on another element). These issues weren't noticed before as they only occur on image attachments. On PDFs, the viewer is embedded in an iframe that prevents the `pointerdown` and `click` events to be visible to the main document. --- **[FIX] iap_extract: fix rectangular selection on scrollable images** The rectangular selection needs to be adjusted when the user scrolls while selecting boxes. This was already properly handled for PDFs, but not for image attachments.
The website builder’s AI command now works correctly when used on product pages. This prevents a “Missing Record” error and lets users continue editing product descriptions without interruption.
Original PR description
__Current behavior before commit:__ Using `/ai` in the website builder sends the record id as a string leading to an error in the backend because `browse` expects an integer as input. __Description of the fix:__ Use `search` instead of `browse` to support id sent as string as well as to validate ACL and existence of the record. __Steps to reproduce the issue on runbot:__ 1. Go to `/shop`. 2. Click on a product. 3. Open the website builder. 4. Enter `/ai` in the description below the product title. => A "Missing Record" error appears.
Fixes delivered quantities when customers return non-rental items that were sold on the same order as rental products. This keeps sales orders accurate after returns, reducing billing and fulfillment confusion for rental workflows.
Original PR description
**Issue**: Returning a non-rental product in a rental order does not correctly update the delivered quantity. **Steps to reproduce**: - Enable rental transfers via Settings > Rental. - Create a…
**Issue**: Returning a non-rental product in a rental order does not correctly update the delivered quantity. **Steps to reproduce**: - Enable rental transfers via Settings > Rental. - Create a rental order with (in that order!): - A rental product - A non-rental product - Confirm the rental order. - Open the related sale order. - Go to the delivery and validate it. - Return the delivery and validate the return. - Observe that the delivered quantity in the sale order is incorrect. **Cause**: The [_get_outgoing_incoming_moves](https://github.com/odoo/odoo/blob/ea6776f095d556e3429d2b847a66f78f2e866380/addons/sale_stock/models/sale_order_line.py#L200C17-L200C85) method fails to detect incoming moves when the destination location has `usage='internal'` (as in rental flows), instead of `customer` (see [_is_outgoing()](https://github.com/odoo/odoo/blob/ea6776f095d556e3429d2b847a66f78f2e866380/addons/stock/models/stock_location.py#L464)). This causes the delivery quantity not to be decremented on return. **Solution**: Relax `_is_incoming()` logic to consider moves as incoming if they come from a rental and go to an internal location. opw-4894358 Forward-Port-Of: odoo/enterprise#93442 Forward-Port-Of: odoo/enterprise#91825
This fix makes reconciliation models accessible in the invoicing app so accounting workflows no longer get blocked when those models are needed. It also cleans up awkward related views, making the invoicing experience smoother for users managing payments and reconciliation.
Original PR description
Currently flows are stuck if you don't have the models. And some views are really weird (create a reconciliation model line). 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#230775
This fix ensures Odoo Studio edits are based on the correct main view rather than a nearby extension view. This helps prevent customization issues and keeps Studio changes applied in the expected place.
Original PR description
…ry view Accidentally pass an inheriting view id to edit view. Before this commit, the studio view thus created inherited from the extension view After this commit, it inherits from the closest primary view. opw-4930800 Forward-Port-Of: odoo/enterprise#96636 Forward-Port-Of: odoo/enterprise#94747
Auto-forwarded emails with multiple recipient addresses no longer cause unrelated email addresses to be added as followers when alias local-part matching is enabled. This keeps follower lists accurate and avoids unnecessary notifications to unintended contacts.
Original PR description
Sending an email that was auto-forwarded would lead to the recipient line having two different emails which would cause any emails that were not set up as aliases to be added as followers even if…
Sending an email that was auto-forwarded would lead to the recipient line having two different emails which would cause any emails that were not set up as aliases to be added as followers even if local part detection was enabled in the alias settings. This was due to the fact that partner detection was changed in 18.2 and now looked for exact email to alias matches. Ban emails were passed to the _find_or_create_from_emails and then directly matched to the emails in the list of recipient emails. When a match was not found for emails that did not have an exact matching alias_full_name, we would then look for or create a partner for that email. This caused erroneous followers to be added. Changing the functionality to also look for matching local parts in order to skip partner finding and creation reverts this functionality to how it previously worked where extra recipients with matching local parts when local part detection was enabled would not add those partners as followers. opw-4896074 Forward-Port-Of: odoo/odoo#230004 Forward-Port-Of: odoo/odoo#216737
This fixes a formatting issue in the HTML editor where colored or gradient text inside lists could lose its color, become invisible, or create invalid nested formatting when users changed text styles. It helps keep list formatting, checklist strikethroughs, and text entered after a list visually consistent.
Original PR description
Steps to Reproduce: - Create a list in the editor. - Apply a text color to an item. - Change the font type of the text inside the list (e.g., to H1–H6). - Apply a gradient color to text inside a list…
Steps to Reproduce: - Create a list in the editor. - Apply a text color to an item. - Change the font type of the text inside the list (e.g., to H1–H6). - Apply a gradient color to text inside a list item. - Move the cursor outside the list by pressing Enter twice and start typing in the new container. Current behavior before PR: - When changing the font type (H1–H6) after applying a color, the text color turns to default color. also when applying a gradient color and then changing the font type, the text becomes transparent. - This happens because the gradient style was incorrectly applied both on the `<li>` and its child `<font>` element. As a result, Checklist items lose their line-through when checked. Also new base container outside the list ends up with a `<font>` wrapping another `<font>`. Desired behavior after PR is merged: - All child elements inside the list item inherit the color and Gradient styles are applied only to the `<font>` element. - Checklist items correctly show the line-through when checked and No invalid nested `<font class="text-gradient">` tags are created when writing outside the list after pressing Enter twice. task-5039499 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231390 Forward-Port-Of: odoo/odoo#224262
Point of Sale loyalty rewards now check whether an order meets the configured earning rules before adding new points. This prevents customers from receiving points when minimum item quantities are not met and avoids incorrect negative point adjustments when claiming free products.
Original PR description
Loyalty points were not being awarded correctly for some orders. The system granted points even when the minimum required quantity of items was not reached. In some cases, it also added negative…
Loyalty points were not being awarded correctly for some orders. The system granted points even when the minimum required quantity of items was not reached. In some cases, it also added negative loyalty points, which led to an excessive deduction for the customer —sometimes just for claiming a single free product. > Setup of the Loyalty Program (Discount & Loyalty): Program Type : Loyalty Card Rule : minimum 5 items => 10 Loyalty Points per $ Reward : Free product (Simple Pen) => in exchange of 5 Loyalty Points Steps to reproduce: ------------------- * Open the pos Shop * Select a customer with loyalty points * Add a Simple Pen * Click on * Reward > Free Product - Loyalty Program > Observation: Customer shouldn't 'win' points here New Total is mathematically correct but not logic Why the fix: ------------ We need to verify that the order is eligible to generate reward points based on the configured rules, before adding the won points. opw-4914774 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231056 Forward-Port-Of: odoo/odoo#221570
Reverse charge taxes can no longer be configured as included in product prices through the interface. This prevents incorrect tax handling by ensuring these taxes are consistently treated as added separately, improving accounting accuracy and compliance.
Original PR description
After this commit, you no longer can set a custom "price_include_override" on a tax using the UI. Even if you do, the tax engine forces such tax to be price-excluded. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231384
This fixes how Odoo decides whether expense reports can be edited, reset, or approved. It ensures those actions reflect the actual user's permissions instead of treating every check as if it had elevated access, reducing the risk of incorrect actions being available.
Original PR description
The field is_editable which used the compute method _compute_is_editable and the field can_reset which used the compute method _compute_can_reset, where called with the argument compute_sudo=True. Those 2 method then used the self.env.su which was always True. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224573
Live chat agents marked as busy will now still be considered available to answer chats, while agents marked away remain unavailable. This prevents customers from being routed away from active support staff who only wanted to suppress notifications or show they are busy.
Original PR description
Before this commit, when a human agent had the IM status "busy", the agent was not considered available for live chat. The "busy" feature is intended only to not receive notification and to show to others we are busy, but is not meant to disable availabily as a live chat operator. The issue happens because availability of the operator required the "online" IM status, which ignored "busy" that was added recently. Note that "away" is considered as not available for operator: the "away" IM status can be set manually by user but also can be triggered automatically when agent is away for a long time, and in these cases users already expect to not be considered as available live chat agents. This behavior is kept in this commit. opw-5150332 Forward-Port-Of: odoo/odoo#231475
QR code payments in Point of Sale now update the payment screen once the payment is completed. This prevents staff or customers from seeing an outdated QR code and avoids errors when finalizing the order.
Original PR description
*: pos_online_payment_self_order Before this commit: =============== - When paying with a QR code, the screen kept showing the QR code even after the payment was completed. - Closing the QR popup…
*: pos_online_payment_self_order Before this commit: =============== - When paying with a QR code, the screen kept showing the QR code even after the payment was completed. - Closing the QR popup manually and performing another action resulted in a `Finalize order` error. - This happened because the WebSocket handler flow were not updating the order state properly. After this commit: =============== - Ensure the frontend refreshes payment status directly from the server when the current order is updated. - Remove unnecessary synchronization calls to prevent stale state. - The order is now correctly marked as paid, and no finalize error occurs after closing the QR popup. Issue: =============== - The frontend WebSocket handler for `ONLINE_PAYMENTS_NOTIFICATION` was fetching the full `pos.order` unnecessarily, because the order state is already updated by another WebSocket flow. - `notify_synchronisation` in the self order flow was redundant, as updates are already handled in the `pos_self_order` module’s `pos.order` file. Task - 5107009 Forward-Port-Of: odoo/odoo#231444 Forward-Port-Of: odoo/odoo#229847
The website HTML editor now avoids creating invalid page structure when users change text formatting inside elements that visually behave like blocks. This helps preserve content layout correctly in browsers and reduces unexpected editing results.
Original PR description
Before this commit we would insert a block inside of a phrasing content if it's displayed as a block and we change its font style. For example, if we tried to modify text inside of a `<small>` that has `display: block` style, it would insert a new block inside of it. Steps to see the issue: - Have an open editor with `<small>Text</small>` content, that has `display: block` style - Select "Text" and change the font style to paragraph => It will be `<small><p>Text</p></small>` which is not valid HTML, and it will be parsed by a browser as `<small></small><p>Text</p>`, which is not the expected behavior. task-5123274 Forward-Port-Of: odoo/odoo#230682 Forward-Port-Of: odoo/odoo#229043
Project revenue totals now continue to include prepaid service products even after those products are archived. This keeps project status and profitability reports accurate when older or discontinued products are no longer active.
Original PR description
**Steps to reproduce:** 1. Install the Sale, Project, and Timesheet modules. 2. Create a service-based product with `invoicing policy > Prepaid`, linked to `Create on Order > Project and Task`. Add a project template. 3. Create a sale order with that product. 4. Go to the created project and check the project status. **Observed behavior:** * Revenue is visible in project status while the product is active. * Once the product is archived, its revenue disappears. **Root cause:** Archived products were not considered when calculating revenue. **Solution:** Backport the fix from v18 to include archived products in revenue calculations. v18 pr : https://github.com/odoo/odoo/pull/129089 added test for product archive case. opw-5070289 Forward-Port-Of: odoo/odoo#231503 Forward-Port-Of: odoo/odoo#229485
Spreadsheet list side panels now handle missing or deleted fields gracefully. This prevents editing from being blocked after migrations or custom field removals, improving reliability for users managing spreadsheet-based lists.
Original PR description
If a field disappeared from a list following a migration or a deleted custom field, the list could no longer be edited in the sidepanel because we tried to access the missing field info (name & string) Task-4915281 Forward-Port-Of: odoo/enterprise#97179 Forward-Port-Of: odoo/enterprise#96158
This fix prevents access errors when branch users create Point of Sale orders for products owned by a parent company while real-time inventory valuation is enabled. It helps sales operations continue smoothly across company branches without blocking order creation.
Original PR description
Before this commit, if a product was assigned to company A and a user from one of its branches tried to create an order with real-time inventory valuation enabled, the system would raise an access error when reading the product's cost_currency_id field. opw-4969390 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229825 Forward-Port-Of: odoo/odoo#223951
Users can now print or export their own timesheets from a single private project without hitting an access error. This removes an inconsistent reporting issue for employees who are assigned work on private projects and need to share or keep timesheet records.
Original PR description
****Behavior:**** **Current:** When a user with only 'User' access to Projects and Timesheets, is assigned to a task in a Private project by an admin user, they can then log timesheets on the task as…
****Behavior:**** **Current:** When a user with only 'User' access to Projects and Timesheets, is assigned to a task in a Private project by an admin user, they can then log timesheets on the task as it appears under "My Tasks". The user might then want to print or export the timesheets form the list view. - If the selected timesheets come from only a single private project : an Access Error is raised - If the selected timesheets come from multiple private projects, or a mix of public and private ones : no Error is raised The issue comes from the need to access to the project's name (since the project is private to the user the code raises the error) as well as the company's name. And it only happens when single projects are selected, in the other cases, the exported pdf shows the project's name at another location without error. **Expected:** Since the information is already accessible through multiple other places in odoo (and even in the exported pdf), we should allow the access here aswell. So now when printing or exporting a timesheet from a single private project, no Access Error is raised. **Steps to reproduce:** - Create 2 different projects - Create a task in each - Assign it to another user (Make sure the other user only has user access to timesheets and projects) - Set each project's visibility setting to private - Log in with the other user - Go to Timesheets --> List View Single projects: - Select one or multiple timesheet entries from one of the private projects - Select Print -> Timesheets - You should see an Access Error Multiple projects: - Select one or multiple timesheet entries from a combination of both private projects - Select Print -> Timesheets - You should not have any Errors opw-5127526 Forward-Port-Of: odoo/odoo#231188