diff --git a/src/odoo_client.py b/src/odoo_client.py index 023578d..c73490b 100644 --- a/src/odoo_client.py +++ b/src/odoo_client.py @@ -1,23 +1,48 @@ -import os +import subprocess import requests import random from typing import Any, TypeVar +from urllib.parse import urlparse from model import OdooModel T = TypeVar("T", bound=OdooModel) +def _get_odoo_session_id() -> str: + result = subprocess.run( + ["actions", "auth", "session", "get", "odoo"], + capture_output=True, + text=True, + ) + lines = result.stdout.splitlines() + if len(lines) > 1: + lines = lines[1:] + session_id = lines[0].strip() if lines else "" + if not session_id: + raise Exception( + "Failed to retrieve odoo session_id via `actions auth session get odoo`" + ) + return session_id + + +def _set_odoo_session_id(session_id: str) -> None: + subprocess.run( + ["actions", "auth", "session", "set", "odoo", session_id], + capture_output=True, + text=True, + ) + + class OdooClient: def __init__(self): self.base_url = "https://www.odoo.com" + self._domain = urlparse(self.base_url).hostname self.session = requests.Session() - if session_id := os.getenv("ODOO_SESSION_ID"): - self.session.cookies.set("session_id", session_id) - else: - raise Exception("ODOO_SESSION_ID is not set") - self.session.cookies.set("cids", "1") - self.session.cookies.set("frontend_lang", "en_US") + self._session_id = _get_odoo_session_id() + self.session.cookies.set("session_id", self._session_id, domain=self._domain) + self.session.cookies.set("cids", "1", domain=self._domain) + self.session.cookies.set("frontend_lang", "en_US", domain=self._domain) def rpc( self, model: str, method: str, *args: Any, **kwargs: Any @@ -39,6 +64,14 @@ class OdooClient: json=body, ) response.raise_for_status() + + new_session_id = self.session.cookies.get( + "session_id", domain=self._domain + ) + if new_session_id and new_session_id != self._session_id: + _set_odoo_session_id(new_session_id) + self._session_id = new_session_id + return response def web_search_read(