Skip to content

Conversation

@Callum027
Copy link
Collaborator

Refactor the record manager list and search methods, and other methods on record managers, so that it is possible to use lazy evaluation.

The list and search methods now return ListRecords and SearchRecords objects, which do not perform any requests or processing at first. Calling the as_ids, as_dicts or as_records methods on these objects invokes the API request, but instead of returning lists as with the previous behaviour, generators are returned instead so the user can choose between performing per-item processing lazily on each iteration, or converting to a list to eagerly evaluate everything.

This removes the as_id and as_dict optional parameters from the list and search methods, which were not possible to express correctly with generators due to bugs in how Mypy handles conditional overloads. Returning a common object that contains separate methods with different, static return types is easier to make compliant with static type checkers.

Callum Dickinson added 3 commits October 17, 2025 14:50
This adds support for updating records in place, using new `update` methods added to the record and record manager base classes.

The `update` method has the same smart evaluation of field names based on record classes that the `create` method has. This allows ID or object field names to be used for model refs, and field aliases.
Add a new manager for attachment records (`ir.attachment`) in Odoo.

These are intended to be used for uploading/downloading attachments to/from invoices.
Invoice attachments will then be attached to invoice emails sent out to customers.

The contents of the attachments won't be fetched when querying them from Odoo by default;
instead it is intended that the separate `download` method be used to download the attachment
contents separately. An `upload` method is also available, to provide an easier to use interface
for uploading attachments.
Refactor the record manager `list` and `search` methods, and other methods on record managers, so that it is possible to use lazy evaluation.

The `list` and `search` methods now return `ListRecords` and `SearchRecords` objects, which do not perform any requests or processing at first. Calling the `as_ids`, `as_dicts` or `as_records` methods on these objects invokes the API request, but instead of returning lists as with the previous behaviour, generators are returned instead so the user can choose between performing per-item processing lazily on each iteration, or converting to a list to eagerly evaluate everything.

This removes the `as_id` and `as_dict` optional parameters from the `list` and `search` methods, which were not possible to express correctly with generators due to bugs in how Mypy handles conditional overloads. Returning a common object that contains separate methods with different, static return types is easier to make compliant with static type checkers.
@Callum027 Callum027 self-assigned this Oct 31, 2025
@Callum027
Copy link
Collaborator Author

Related Mypy bug for the issues with overloading: python/mypy#12056

@Callum027 Callum027 force-pushed the callum/add-attachment-support branch 3 times, most recently from 43aa7c6 to 025f474 Compare November 3, 2025 03:17
@Callum027 Callum027 force-pushed the callum/add-attachment-support branch 4 times, most recently from b803591 to 72e70f9 Compare November 12, 2025 05:31
@Callum027 Callum027 force-pushed the callum/add-attachment-support branch 6 times, most recently from 8c2be27 to 6687f46 Compare December 15, 2025 22:46
Base automatically changed from callum/add-attachment-support to main December 16, 2025 03:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants