Using `odoo_search_read` to List Databases and Users
Introduction
In this section, we will demonstrate how to use the odoo_search_read
function to create a web page that lists databases. When the user selects a database, the system will list the user accounts available in that database.
HTML Page (index4.html
)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>List Databases</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin-top: 50px;
}
label {
font-size: 18px;
font-weight: bold;
}
select {
width: 300px;
height: 50px;
font-size: 18px;
padding: 10px;
border: 2px solid gold;
border-radius: 5px;
background-color: white;
cursor: pointer;
outline: none;
}
select:focus {
border-color: darkgoldenrod;
}
table {
width: 80%;
margin: 30px auto;
border-collapse: collapse;
}
th, td {
border: 1px solid black;
padding: 10px;
text-align: left;
}
th {
background-color: gold;
}
#user-table {
display: none;
}
</style>
</head>
<body>
<label for="database-select">Select Database:</label>
<br><br>
<select id="database-select">
<option value="">Loading...</option>
</select>
<table id="user-table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Login</th>
<th>Lang</th>
<th>Last Authentication</th>
</tr>
</thead>
<tbody id="user-table-body">
</tbody>
</table>
<script>
var odoo_url_api = "http://192.168.5.33/api";
var token = null;
async function login_odoo(login_param) {
if (!login_param) return;
try {
let response = await fetch(`${odoo_url_api}/login`, {
method: 'POST',
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"username": login_param.username,
"password": login_param.password,
"dbname": login_param.database
}),
});
let data = await response.json();
if (data.error?.code) throw data;
return data.data;
} catch (error) {
console.error("Login failed", error);
}
}
async function odoo_get(endpoint) {
try {
let response = await fetch(`${odoo_url_api}${endpoint}`, {
method: "GET",
headers: {
"Authorization": token,
"Content-Type": "application/json"
}
});
let data = await response.json();
if (data.error?.code) throw data;
return data;
} catch (error) {
console.error("API request failed", error);
}
}
async function odoo_search_read(params) {
return new Promise((resolve, reject) => {
var myHeaders = new Headers();
myHeaders.append("Authorization", token);
myHeaders.append("Content-Type", "application/json");
fetch(`${odoo_url_api}/search_read`, {
method: "POST",
headers: myHeaders,
body: JSON.stringify(params)
})
.then(response => response.json())
.then(result => {
if (result.error?.code)
reject(result)
else
resolve(result)
})
.catch(error => reject(error));
});
}
async function populateDatabaseSelect() {
let auth = await login_odoo();
token = auth?.access_token;
let res = await odoo_get("/database-list");
let databaseData = res?.data;
let selectBox = document.getElementById("database-select");
selectBox.innerHTML = "";
if (databaseData && databaseData.length > 0) {
databaseData.forEach(db => {
let option = document.createElement("option");
option.value = db;
option.textContent = db;
selectBox.appendChild(option);
});
} else {
let option = document.createElement("option");
option.value = "";
option.textContent = "No databases available";
selectBox.appendChild(option);
}
}
document.addEventListener('DOMContentLoaded', populateDatabaseSelect);
</script>
</body>
</html>
How to Use odoo_search_read
Inspired by Odoo's search_read
, we have implemented a similar function to fetch user data.
Using it is simple:
- Open developer tools and go to the Network tab.
- Click search_read and copy the object parameters.
- Pass the parameters into
odoo_search_read
.
Example Function to Fetch Users
async function fetchUsers(database) {
let res = await odoo_search_read({
"model": "res.users",
"domain": [["share", "=", false]],
"fields": ["name", "login", "lang", "login_date", "state", "company_id"],
"limit": 80,
"sort": "",
"context": {
"lang": "en_US",
"tz": "Asia/Bangkok",
"uid": 6,
"allowed_company_ids": [1],
"params": { "menu_id": 4, "action": 72, "model": "res.users", "view_type": "list", "cids": 1 },
"search_default_no_share": 1,
"bin_size": true
}
});
let users = res?.data;
}
Conclusion
This example demonstrates how to use the odoo_search_read
function to fetch and display user data dynamically based on the selected database. We hope this helps streamline your Odoo development! ?
odoo_search_read ; odoo; rest api; jwt
Like
Reply