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): def get_invoice_addresses(user):
"""Used during organization creation: retrieves all invoice """Used during organization creation: retrieves all invoice
addresses the user owns or is connected to from the Odoo API.""" addresses the user owns or is connected to from the Odoo API."""
or_conditions = [ # Were building our conditions in order:
("email", "ilike", user.email), # - in exceptions, users may be using a billing accounts email
("child_ids.email", "ilike", user.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 email = user if isinstance(user, str) else user.email
try: odoo_users = CLIENT.search_read(
odoo_users = odoo_request( model="res.users",
model="res.users", domain=[("login", "=", email)],
method="search_read", fields=["id"],
domain=[("login", "=", user.email)], limit=1,
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))
if odoo_users and (uid := odoo_users[0].get("id")):
or_conditions.append(("create_uid", "=", uid)) odoo_contacts = CLIENT.search_read(
except Exception: model="res.partner",
pass 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: # The domain requires the partner to be an invoice address, that is:
# Of the company_type=person, and type=invoice. # Of the company_type=person, and type=invoice.
# If we were searching for an existing organization, we would also have to # If we were searching for an existing organization, we would also have to
@ -118,12 +132,11 @@ def get_invoice_addresses(user):
domain = [ domain = [
("company_type", "=", "person"), ("company_type", "=", "person"),
("type", "=", "invoice"), ("type", "=", "invoice"),
] + user_conditions ] + or_conditions
try: try:
invoice_addresses = odoo_request( invoice_addresses = CLIENT.search_read(
model="res.partner", model="res.partner",
method="search_read",
domain=domain, domain=domain,
fields=ADDRESS_FIELDS, fields=ADDRESS_FIELDS,
) )