Thursday, September 10, 2026
9 changes · saas-19.3
Resolved issues and error corrections
Fixes a website builder issue where applying text animation across multiple text blocks could shift centered content out of alignment. This helps editors animate selected text without disrupting the page layout visitors see.
Original PR description
### Problem: Text animation used a single span around the full selection range. When a selection crossed block elements, this placed headings and paragraphs inside a span, producing invalid HTML and changing their layout. ### Steps to reproduce: 1. Drag & drop a snippet (like the "Cover" block) that contains page centered text 2. Select a range of text spanning multiple block elements within the added snippet 3. Add an animation to the selected text. <img width="800" height="200" alt="image" src="https://github.com/user-attachments/assets/45074927-4d60-4517-b65b-7ba6d667e060" /> ### Solution: This PR splits the selection by block and creates one inline animation wrapper per block instead. The builder applies animation options to the resulting elements as one group, without changing the document's block structure. task-5155887 Forward-Port-Of: odoo/odoo#283176
The Mexican point-of-sale self-invoicing test was updated to match the new flow where public users can no longer edit existing customer details. This keeps automated checks aligned with the safer process of creating a new customer record when needed, reducing risk around customer data handling.
Original PR description
Before the related pr commit: - Public users could update customer data during the self-invoicing flow. - The test_qr_code_receipt_mx test relied on this behavior when updating customer data. After the ref commit: - Public users can no longer update customer data during self-invoicing. - Update test_qr_code_receipt_mx to create a new partner with the required customer data when the order is not linked to a customer. Related PR: odoo/odoo#283470 Task-6272660 Forward-Port-Of: odoo/enterprise#130700 Forward-Port-Of: odoo/enterprise#129948
The missing e-invoice check now opens a list limited to the invoices that actually need attention. This prevents users from seeing unrelated or overly broad invoice lists, reducing confusion during Indian e-invoicing compliance checks.
Original PR description
The `missing_einvoice` check passed custom `views` but no explicit `domain`, so its action ignored the `moves` recordset and instead opened all matching `account.move` records — an unfiltered list when no invoices were missing, and every eligible invoice (not just the flagged ones) otherwise.
Guard the action to only build when `moves` is non-empty, and pass `domain=[('id', 'in', moves.ids)]` so it's always scoped to the invoices actually found.
task-6544790
Forward-Port-Of: odoo/enterprise#130483The web code editor now correctly allows protected self-closing template tags to be changed or removed when appropriate. This prevents unnecessary editing blocks and makes template maintenance smoother for users working with web views.
Original PR description
Currently, when we get readonly attributes to prevent overwriting or deletion, we only ignore them if the selection that is being modified is contained between `<>` tags. To rectify this behavior, we also include the `<\>` self closing tags so that they may also be overwritten/deleted. opw-6325841 Forward-Port-Of: odoo/odoo#287393
The Timesheet Assistant no longer crashes when generating sample data for projects linked to partners who do not have an email address. This makes the sample data generation more reliable for users working with incomplete partner records.
Original PR description
Forward-Port-Of: odoo/enterprise#131002
This fixes a problem that allowed a company’s main Projects folder in Documents to be archived even though it should be protected. The change helps prevent accidental disruption to project document organization and access.
Original PR description
The company's project folder is supposed to be [impossible](https://github.com/odoo/enterprise/blob/20cc61e69aa3f6a59de1e962b25ce11fa402bf22/documents_project/models/documents_document.py#L44) to archive, by using the `_unlink_except_company_folders` logic. However, the method that adds the company field to the list of fields to check was missing, so it was still possible to archive a folder set as projects folder. Forward-Port-Of: odoo/enterprise#120605
Sold-out event tickets or time slots are now correctly treated as unavailable instead of allowing the normal maximum order quantity. This prevents future booking flows or integrations from mistakenly offering places that are already fully booked.
Original PR description
### Steps to reproduce: event = env['event.event'].create({ 'name': 'Repro Event', 'date_begin': '2026-09-01 08:00:00', 'date_end': '2026-09-01 18:00:00', }) ticket =…
### Steps to reproduce:
event = env['event.event'].create({
'name': 'Repro Event',
'date_begin': '2026-09-01 08:00:00',
'date_end': '2026-09-01 18:00:00',
})
ticket = env['event.event.ticket'].create({
'event_id': event.id,
'name': 'VIP',
'seats_limited': True,
'seats_max': 1,
})
env['event.registration'].create({
'event_id': event.id,
'event_ticket_id': ticket.id,
'name': 'Attendee 1',
'state': 'open',
})
ticket.seats_available -> 0
ticket.is_sold_out -> True
result = ticket._get_current_limit_per_order(event=event) print(result) # {ticket.id: 30} -- expected {ticket.id: 0}
### Issue and Expected
`_get_current_limit_per_order()` used `if not seats_available:` to detect the "no limit" case returned by `_get_seats_availability()`. That check is truthy for both `None` (genuinely no limit) and the integer `0` (fully booked), so a sold-out ticket/slot combination was incorrectly treated as unlimited and returned `limit_max_per_order or EVENT_MAX_TICKETS` (e.g. 30) instead of `0`.
### Fix
`_get_seats_availability()` explicitly documents `None` as the "no limit" sentinel, with `0` meaning "constrained, zero seats left". Use `seats_available is None` to preserve that distinction instead of a falsy check.
No functional regression was found in the current website_event flow: sold-out slots/tickets are filtered or re-derived independently before reaching this value in every existing UI path. This fixes the underlying contract of the method itself, so future or additional callers don't inherit the wrong value.
https://github.com/odoo/odoo/issues/284098
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#284100Code cleanup and technical improvements
The accounting test suite was cleaned up by removing redundant helper code and old commented-out test sections. This makes the module easier to maintain without changing how users work with the product.
Original PR description
This commit cleans up the test suite within the `account_accountant` module by removing redundant methods and old commented code. no-task Forward-Port-Of: odoo/enterprise#130857 Forward-Port-Of: odoo/enterprise#130644
Documentation and clarification updates
ERPly S.R.L. has signed Odoo's Corporate Contributor License Agreement, confirming the legal terms for its contributions. This removes the legal approval blocker for related work whose other checks already pass, helping it move forward.
Original PR description
ERPly S.R.L. (Santo Domingo, Dominican Republic) signs the Corporate Contributor License Agreement v1.0. This unblocks the `legal/cla` check on #286565, where every other CI check already passes. Signed by Rob Cruz (rob.cruz@erply.do, @rob-erply), acting on behalf of ERPly S.R.L. Forward-Port-Of: odoo/odoo#286665