From 611172afdb3a64cf541725e47b8a1585cd89031b Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Mon, 26 May 2025 13:07:07 +0200 Subject: [PATCH] Fully implement odoo user search --- src/servala/core/odoo.py | 55 +++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/src/servala/core/odoo.py b/src/servala/core/odoo.py index d5a0ad6..81a24bc 100644 --- a/src/servala/core/odoo.py +++ b/src/servala/core/odoo.py @@ -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), - ] + # We’re building our conditions in order: + # - in exceptions, users may be using a billing account’s 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, )