Fully implement odoo user search

This commit is contained in:
Tobias Kunze 2025-05-26 13:07:07 +02:00
parent 284d716571
commit 611172afdb

View file

@ -91,26 +91,40 @@ CLIENT = OdooClient()
def get_invoice_addresses(user):
"""Used during organization creation: retrieves all invoice
addresses the user owns or is connected to from the Odoo API."""
or_conditions = [
("email", "ilike", user.email),
("child_ids.email", "ilike", user.email),
]
# Were building our conditions in order:
# - in exceptions, users may be using a billing accounts email
# - if the user is associated with an odoo user, return all billing
# addresses / organizations created by the user
# - if the user is associated with an odoo contact, return all billing
# addresses with the same parent_id
or_conditions = [("email", "ilike", email)]
# Attempt to find the Odoo user ID and add condition for records created by this user
try:
odoo_users = odoo_request(
model="res.users",
method="search_read",
domain=[("login", "=", user.email)],
fields=["id"],
limit=1, # Expecting at most one user
)
if odoo_users and (uid := odoo_users[0].get("id")):
or_conditions.append(("create_uid", "=", uid))
except Exception:
pass
email = user if isinstance(user, str) else user.email
odoo_users = CLIENT.search_read(
model="res.users",
domain=[("login", "=", email)],
fields=["id"],
limit=1,
)
if odoo_users and (uid := odoo_users[0].get("id")):
or_conditions.append(("create_uid", "=", uid))
odoo_contacts = CLIENT.search_read(
model="res.partner",
domain=[
("company_type", "=", "person"),
("type", "=", "contact"),
("email", "ilike", email),
],
fields=["id", "parent_id"],
)
if odoo_contacts:
for contact in odoo_contacts:
or_conditions.append(("parent_id", "=", contact["parent_id"][0]))
if len(or_conditions) > 1:
or_conditions = ["|"] * (len(or_conditions) - 1) + or_conditions
user_conditions = ["|"] * (len(or_conditions) - 1) + or_conditions
# The domain requires the partner to be an invoice address, that is:
# Of the company_type=person, and type=invoice.
# If we were searching for an existing organization, we would also have to
@ -118,12 +132,11 @@ def get_invoice_addresses(user):
domain = [
("company_type", "=", "person"),
("type", "=", "invoice"),
] + user_conditions
] + or_conditions
try:
invoice_addresses = odoo_request(
invoice_addresses = CLIENT.search_read(
model="res.partner",
method="search_read",
domain=domain,
fields=ADDRESS_FIELDS,
)