Use actions auth session get/set for sessions

This commit is contained in:
Hubert Van De Walle
2026-09-16 15:56:52 +02:00
parent baf8ce0aeb
commit 00267b090a
+40 -7
View File
@@ -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(