Külső API¶
Az Odoo-t általában belsőleg bővítik modulokkal, de sok funkciója és minden adata kívülről is elérhető külső elemzés vagy különféle eszközökkel való integráció céljából. A Modellek API egy része könnyen elérhető XML-RPC segítségével, és különféle nyelvekről hozzáférhető.
Fontos
A PHP8 verziótól kezdve az XML-RPC kiterjesztés alapértelmezés szerint nem biztos, hogy elérhető. Tekintse meg a kézikönyvet a telepítési lépésekért.
Megjegyzés
Access to data via the external API is only available on Custom Odoo pricing plans. Access to the external API is not available on One App Free or Standard plans. For more information visit the Odoo pricing page or reach out to your Customer Success Manager.
Lásd még
Kapcsolat¶
Konfiguráció¶
Ha már van telepítve egy Odoo szerver, egyszerűen használhatja annak paramétereit.
Fontos
Az Odoo Online példányok esetében (<domain>.odoo.com), a felhasználók helyi jelszó nélkül jönnek létre (személyként az Odoo Online hitelesítési rendszeren keresztül van bejelentkezve, nem maga a példány által). Az XML-RPC használatához az Odoo Online példányokon, jelszót kell beállítania a használni kívánt felhasználói fiókon:
Jelentkezzen be a példányába egy adminisztrátori fiókkal.
Menjen a menüpontra.
Kattintson arra a felhasználóra, akit az XML-RPC hozzáféréshez használni szeretne.
Kattintson a Művelet gombra, és válassza a Jelszó megváltoztatása lehetőséget.
Állítson be egy Új jelszó értéket, majd kattintson a Jelszó megváltoztatása gombra.
A szerver url az instance domainje (pl. https://mycompany.odoo.com), az adatbázis neve az instance neve (pl. mycompany). A felhasználónév a konfigurált felhasználó bejelentkezése, ahogy a Jelszó megváltoztatása képernyőn látható.
url = <insert server URL>
db = <insert database name>
username = 'admin'
password = <insert password for your admin user (default: admin)>
url = <insert server URL>
db = <insert database name>
username = "admin"
password = <insert password for your admin user (default: admin)>
$url = <insert server URL>;
$db = <insert database name>;
$username = "admin";
$password = <insert password for your admin user (default: admin)>;
final String url = <insert server URL>,
db = <insert database name>,
username = "admin",
password = <insert password for your admin user (default: admin)>;
var (
url = <insert server URL>
db = <insert database name>
username = "admin"
password = <insert password for your admin user (default: admin)>
)
API kulcsok¶
Új a(z) 14.0 verzióban.
Az Odoo támogatja az api kulcsokat, és (moduloktól vagy beállításoktól függően) követelheti ezeket a kulcsokat a webszolgáltatási műveletek végrehajtásához.
Az API kulcsok használata a szkriptekben egyszerűen azt jelenti, hogy a jelszavát a kulccsal helyettesíti. A bejelentkezés továbbra is használatban marad. Az API kulcsot ugyanolyan gondosan kell tárolnia, mint a jelszavát, mivel lényegében ugyanazt a hozzáférést biztosítják a felhasználói fiókjához (bár nem használhatók a felületre történő bejelentkezéshez).
Ahhoz, hogy kulcsot adjon hozzá a fiókjához, egyszerűen menjen a Preferenciák (vagy Profilom) menüpontra:
majd nyissa meg a Fiók biztonsága fület, és kattintson az Új API kulcs gombra:
Adjon meg egy leírást a kulcshoz, ez a leírás legyen a lehető legvilágosabb és legteljesebb: ez az egyetlen módja annak, hogy később azonosítani tudja a kulcsait, és eldöntse, hogy el kell-e távolítania őket, vagy meg kell-e tartania.
Kattintson a Kulcs generálása gombra, majd másolja le a megadott kulcsot. Tárolja ezt a kulcsot gondosan: ez egyenértékű a jelszavával, és akárcsak a jelszavát, a rendszer később nem tudja visszakeresni vagy megjeleníteni a kulcsot. Ha elveszíti ezt a kulcsot, új kulcsot kell létrehoznia (és valószínűleg törölnie kell az elveszített kulcsot).
Miután kulcsokat konfigurált a fiókjában, azok megjelennek az Új API kulcs gomb felett, és lehetősége lesz törölni őket:
Egy törölt API kulcs nem állítható vissza vagy újra beállítható. Új kulcsot kell generálnia, és frissítenie kell minden helyen, ahol a régi kulcsot használta.
Tesztadatbázis¶
A felfedezés egyszerűsítése érdekében kérhet egy tesztadatbázist a https://demo.odoo.com oldalon:
import xmlrpc.client
info = xmlrpc.client.ServerProxy('https://demo.odoo.com/start').start()
url, db, username, password = info['host'], info['database'], info['user'], info['password']
require "xmlrpc/client"
info = XMLRPC::Client.new2('https://demo.odoo.com/start').call('start')
url, db, username, password = info['host'], info['database'], info['user'], info['password']
require_once('ripcord.php');
$info = ripcord::client('https://demo.odoo.com/start')->start();
list($url, $db, $username, $password) = array($info['host'], $info['database'], $info['user'], $info['password']);
Megjegyzés
Ezek a példák a Ripcord könyvtárat használják, amely egyszerű XML-RPC API-t biztosít. A Ripcord megköveteli, hogy az XML-RPC támogatás engedélyezve legyen a PHP telepítésében.
Mivel a hívások HTTPS protokollon keresztül történnek, szükséges, hogy az OpenSSL kiterjesztés is engedélyezve legyen.
final XmlRpcClient client = new XmlRpcClient();
final XmlRpcClientConfigImpl start_config = new XmlRpcClientConfigImpl();
start_config.setServerURL(new URL("https://demo.odoo.com/start"));
final Map<String, String> info = (Map<String, String>)client.execute(
start_config, "start", emptyList());
final String url = info.get("host"),
db = info.get("database"),
username = info.get("user"),
password = info.get("password");
Megjegyzés
Ezek a példák az Apache XML-RPC könyvtárat használják.
A példák nem tartalmazzák az importokat, mivel ezek az importok nem illeszthetők be a kódba.
client, err := xmlrpc.NewClient("https://demo.odoo.com/start", nil)
if err != nil {
log.Fatal(err)
}
info := map[string]string{}
client.Call("start", nil, &info)
url = info["host"].(string)
db = info["database"].(string)
username = info["user"].(string)
password = info["password"].(string)
Megjegyzés
Ezek a példák a github.com/kolo/xmlrpc könyvtárat használják.
A példák nem tartalmazzák az importokat, mivel ezek az importok nem illeszthetők be a kódba.
Bejelentkezés¶
Az Odoo megköveteli az API felhasználóitól, hogy hitelesítve legyenek, mielőtt a legtöbb adatot lekérdezhetik.
Az xmlrpc/2/common végpont meta-hívásokat biztosít, amelyek nem igényelnek hitelesítést, mint például maga a hitelesítés vagy a verzióinformációk lekérése. Annak ellenőrzésére, hogy a kapcsolati információk helyesek-e, mielőtt megpróbálnánk hitelesíteni, a legegyszerűbb hívás a szerver verziójának lekérdezése. Maga a hitelesítés az authenticate függvényen keresztül történik, és egy felhasználói azonosítót (uid) ad vissza, amelyet a hitelesített hívásokban használnak a bejelentkezés helyett.
common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
common.version()
common = XMLRPC::Client.new2("#{url}/xmlrpc/2/common")
common.call('version')
$common = ripcord::client("$url/xmlrpc/2/common");
$common->version();
final XmlRpcClientConfigImpl common_config = new XmlRpcClientConfigImpl();
common_config.setServerURL(new URL(String.format("%s/xmlrpc/2/common", url)));
client.execute(common_config, "version", emptyList());
client, err := xmlrpc.NewClient(fmt.Sprintf("%s/xmlrpc/2/common", url), nil)
if err != nil {
log.Fatal(err)
}
common := map[string]any{}
if err := client.Call("version", nil, &common); err != nil {
log.Fatal(err)
}
Eredmény:
{
"server_version": "13.0",
"server_version_info": [13, 0, 0, "final", 0],
"server_serie": "13.0",
"protocol_version": 1,
}
uid = common.authenticate(db, username, password, {})
uid = common.call('authenticate', db, username, password, {})
$uid = $common->authenticate($db, $username, $password, array());
int uid = (int)client.execute(common_config, "authenticate", asList(db, username, password, emptyMap()));
var uid int64
if err := client.Call("authenticate", []any{
db, username, password,
map[string]any{},
}, &uid); err != nil {
log.Fatal(err)
}
Metódusok hívása¶
A második végpont az xmlrpc/2/object. Ezt az odoo modellek metódusainak hívására használják az execute_kw RPC függvényen keresztül.
Minden execute_kw hívás a következő paramétereket veszi fel:
a használni kívánt adatbázis, egy karakterlánc
a felhasználói azonosító (az
authenticateáltal lekérve), egy egész száma felhasználó jelszava, egy karakterlánc
a modell neve, egy karakterlánc
a metódus neve, egy karakterlánc
egy tömb/lista a pozíció szerint átadott paraméterekkel
egy kulcsszó szerint átadandó paraméterek leképezése/dict (opcionális)
Example
For instance, to search for records in the res.partner model, we can call
name_search with name passed by position and limit passed by
keyword (in order to get maximum 10 results):
models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))
models.execute_kw(db, uid, password, 'res.partner', 'name_search', ['foo'], {'limit': 10})
models = XMLRPC::Client.new2("#{url}/xmlrpc/2/object").proxy
models.execute_kw(db, uid, password, 'res.partner', 'name_search', ['foo'], {limit: 10})
$models = ripcord::client("$url/xmlrpc/2/object");
$models->execute_kw($db, $uid, $password, 'res.partner', 'name_search', array('foo'), array('limit' => 10));
final XmlRpcClient models = new XmlRpcClient() {{
setConfig(new XmlRpcClientConfigImpl() {{
setServerURL(new URL(String.format("%s/xmlrpc/2/object", url)));
}});
}};
models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "name_search",
asList("foo"),
new HashMap() {{ put("limit", 10); }}
));
models, err := xmlrpc.NewClient(fmt.Sprintf("%s/xmlrpc/2/object", url), nil)
if err != nil {
log.Fatal(err)
}
var result bool
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "name_search",
[]string{"foo"},
map[string]bool{"limit": 10},
}, &result); err != nil {
log.Fatal(err)
}
Eredmény:
true
Rekordok listázása¶
A rekordok listázhatók és szűrhetők a search() metóduson keresztül.
search() kötelező domain szűrőt (esetleg üres) vesz fel, és visszaadja az adatbázis azonosítóit minden szűrőnek megfelelő rekordnak.
Example
Például az ügyfél cégek listázásához:
models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', True]]])
models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', true]]])
$models->execute_kw($db, $uid, $password, 'res.partner', 'search', array(array(array('is_company', '=', true))));
asList((Object[])models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "search",
asList(asList(
asList("is_company", "=", true)))
)));
var records []int64
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "search",
[]any{[]any{
[]any{"is_company", "=", true},
}},
}, &records); err != nil {
log.Fatal(err)
}
Eredmény:
[7, 18, 12, 14, 17, 19, 8, 31, 26, 16, 13, 20, 30, 22, 29, 15, 23, 28, 74]
Lapozás¶
Alapértelmezés szerint a keresés visszaadja az összes feltételnek megfelelő rekord azonosítóját, ami lehet egy hatalmas szám. Az offset és limit paraméterek elérhetők, hogy csak a feltételnek megfelelő rekordok egy részhalmazát kérjük le.
Example
models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', True]]], {'offset': 10, 'limit': 5})
models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', true]]], {offset: 10, limit: 5})
$models->execute_kw($db, $uid, $password, 'res.partner', 'search', array(array(array('is_company', '=', true))), array('offset'=>10, 'limit'=>5));
asList((Object[])models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "search",
asList(asList(
asList("is_company", "=", true))),
new HashMap() {{ put("offset", 10); put("limit", 5); }}
)));
var records []int64
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "search",
[]any{[]any{
[]any{"is_company", "=", true},
}},
map[string]int64{"offset": 10, "limit": 5},
}, &records); err != nil {
log.Fatal(err)
}
Eredmény:
[13, 20, 30, 22, 29]
Rekordok számlálása¶
Ahelyett, hogy egy esetlegesen hatalmas rekordlistát kérnénk le és számolnánk meg, a search_count() használható arra, hogy csak a lekérdezésnek megfelelő rekordok számát kapjuk meg. Ugyanazt a domain szűrőt veszi fel, mint a search(), és nincs más paramétere.
Example
models.execute_kw(db, uid, password, 'res.partner', 'search_count', [[['is_company', '=', True]]])
models.execute_kw(db, uid, password, 'res.partner', 'search_count', [[['is_company', '=', true]]])
$models->execute_kw($db, $uid, $password, 'res.partner', 'search_count', array(array(array('is_company', '=', true))));
(Integer)models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "search_count",
asList(asList(
asList("is_company", "=", true)))
));
var counter int64
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "search_count",
[]any{[]any{
[]any{"is_company", "=", true},
}},
}, &counter); err != nil {
log.Fatal(err)
}
Eredmény:
19
Megjegyzés
A search majd search_count (vagy fordítva) hívása nem biztos, hogy koherens eredményeket ad, ha más felhasználók is használják a szervert: a tárolt adatok megváltozhattak a hívások között.
Rekordok olvasása¶
A rekord adatai a read() metóduson keresztül érhetők el, amely egy azonosító listát vesz fel (ahogy a search() visszaadja), és opcionálisan egy mezőlistát, amelyeket le kell kérni. Alapértelmezés szerint az összes mezőt lekéri, amelyet a jelenlegi felhasználó olvashat, ami általában nagy mennyiség.
Example
ids = models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', True]]], {'limit': 1})
[record] = models.execute_kw(db, uid, password, 'res.partner', 'read', [ids])
# count the number of fields fetched by default
len(record)
ids = models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', true]]], {limit: 1})
record = models.execute_kw(db, uid, password, 'res.partner', 'read', [ids]).first
# count the number of fields fetched by default
record.length
$ids = $models->execute_kw($db, $uid, $password, 'res.partner', 'search', array(array(array('is_company', '=', true))), array('limit'=>1));
$records = $models->execute_kw($db, $uid, $password, 'res.partner', 'read', array($ids));
// count the number of fields fetched by default
count($records[0]);
final List ids = asList((Object[])models.execute(
"execute_kw", asList(
db, uid, password,
"res.partner", "search",
asList(asList(
asList("is_company", "=", true))),
new HashMap() {{ put("limit", 1); }})));
final Map record = (Map)((Object[])models.execute(
"execute_kw", asList(
db, uid, password,
"res.partner", "read",
asList(ids)
)
))[0];
// count the number of fields fetched by default
record.size();
var ids []int64
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "search",
[]any{[]any{
[]any{"is_company", "=", true},
}},
map[string]int64{"limit": 1},
}, &ids); err != nil {
log.Fatal(err)
}
var records []any
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "read",
ids,
}, &records); err != nil {
log.Fatal(err)
}
// count the number of fields fetched by default
count := len(records)
Eredmény:
121
Ezzel szemben, csak három érdekesnek ítélt mezőt választunk ki.
models.execute_kw(db, uid, password, 'res.partner', 'read', [ids], {'fields': ['name', 'country_id', 'comment']})
models.execute_kw(db, uid, password, 'res.partner', 'read', [ids], {fields: %w(name country_id comment)})
$models->execute_kw($db, $uid, $password, 'res.partner', 'read', array($ids), array('fields'=>array('name', 'country_id', 'comment')));
asList((Object[])models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "read",
asList(ids),
new HashMap() {{
put("fields", asList("name", "country_id", "comment"));
}}
)));
var recordFields []map[string]any
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "read",
ids,
map[string][]string{
"fields": {"name", "country_id", "comment"},
},
}, &recordFields); err != nil {
log.Fatal(err)
}
Eredmény:
[{"comment": false, "country_id": [21, "Belgium"], "id": 7, "name": "Agrolait"}]
Megjegyzés
Még ha az id mezőt nem is kérjük le, az mindig visszaadásra kerül.
Rekord mezők listája¶
fields_get() használható egy modell mezőinek vizsgálatára és annak ellenőrzésére, hogy melyek tűnnek érdekesnek.
Mivel nagy mennyiségű meta-információt ad vissza (ügyfélprogramok is használják), szűrni kell a nyomtatás előtt. Az emberi felhasználó számára a legérdekesebb elemek a string (a mező címkéje), help (segédszöveg, ha elérhető) és type (hogy tudjuk, milyen értékeket várhatunk, vagy küldhetünk, amikor egy rekordot frissítünk).
Example
models.execute_kw(db, uid, password, 'res.partner', 'fields_get', [], {'attributes': ['string', 'help', 'type']})
models.execute_kw(db, uid, password, 'res.partner', 'fields_get', [], {attributes: %w(string help type)})
$models->execute_kw($db, $uid, $password, 'res.partner', 'fields_get', array(), array('attributes' => array('string', 'help', 'type')));
(Map<String, Map<String, Object>>)models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "fields_get",
emptyList(),
new HashMap() {{
put("attributes", asList("string", "help", "type"));
}}
));
recordFields := map[string]string{}
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "fields_get",
[]any{},
map[string][]string{
"attributes": {"string", "help", "type"},
},
}, &recordFields); err != nil {
log.Fatal(err)
}
Eredmény:
{
"ean13": {
"type": "char",
"help": "BarCode",
"string": "EAN13"
},
"property_account_position_id": {
"type": "many2one",
"help": "The fiscal position will determine taxes and accounts used for the partner.",
"string": "Fiscal Position"
},
"signup_valid": {
"type": "boolean",
"help": "",
"string": "Signup Token is Valid"
},
"date_localization": {
"type": "date",
"help": "",
"string": "Geo Localization Date"
},
"ref_company_ids": {
"type": "one2many",
"help": "",
"string": "Companies that refers to partner"
},
"sale_order_count": {
"type": "integer",
"help": "",
"string": "# of Sales Order"
},
"purchase_order_count": {
"type": "integer",
"help": "",
"string": "# of Purchase Order"
},
Keresés és olvasás¶
Mivel ez egy nagyon gyakori feladat, az Odoo biztosít egy search_read() gyorsbillentyűt, amely, ahogy a neve is sugallja, egyenértékű egy search() követve egy read()-del, de elkerüli, hogy két kérést kelljen végrehajtani és az azonosítókat megőrizni.
Argumentumai hasonlóak a search()-hoz, de egy fields listát is elfogadhat (mint a read(), ha ez a lista nincs megadva, akkor az összes mezőt lekéri a talált rekordokból).
Example
models.execute_kw(db, uid, password, 'res.partner', 'search_read', [[['is_company', '=', True]]], {'fields': ['name', 'country_id', 'comment'], 'limit': 5})
models.execute_kw(db, uid, password, 'res.partner', 'search_read', [[['is_company', '=', true]]], {fields: %w(name country_id comment), limit: 5})
$models->execute_kw($db, $uid, $password, 'res.partner', 'search_read', array(array(array('is_company', '=', true))), array('fields'=>array('name', 'country_id', 'comment'), 'limit'=>5));
asList((Object[])models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "search_read",
asList(asList(
asList("is_company", "=", true))),
new HashMap() {{
put("fields", asList("name", "country_id", "comment"));
put("limit", 5);
}}
)));
var recordFields []map[string]any
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "search_read",
[]any{[]any{
[]any{"is_company", "=", true},
}},
map[string]any{
"fields": []string{"name", "country_id", "comment"},
"limit": 5,
},
}, &recordFields); err != nil {
log.Fatal(err)
}
Eredmény:
[
{
"comment": false,
"country_id": [ 21, "Belgium" ],
"id": 7,
"name": "Agrolait"
},
{
"comment": false,
"country_id": [ 76, "France" ],
"id": 18,
"name": "Axelor"
},
{
"comment": false,
"country_id": [ 233, "United Kingdom" ],
"id": 12,
"name": "Bank Wealthy and sons"
},
{
"comment": false,
"country_id": [ 105, "India" ],
"id": 14,
"name": "Best Designers"
},
{
"comment": false,
"country_id": [ 76, "France" ],
"id": 17,
"name": "Camptocamp"
}
]
Rekordok létrehozása¶
Egy modell rekordjai a create() használatával hozhatók létre. A metódus egyetlen rekordot hoz létre és visszaadja annak adatbázis-azonosítóját.
create() egy mezők és értékek leképezését veszi át, amelyet a rekord inicializálására használnak. Bármely mező esetében, amelynek van alapértelmezett értéke és nincs beállítva a leképezési argumentumon keresztül, az alapértelmezett érték kerül felhasználásra.
Example
id = models.execute_kw(db, uid, password, 'res.partner', 'create', [{'name': "New Partner"}])
id = models.execute_kw(db, uid, password, 'res.partner', 'create', [{name: "New Partner"}])
$id = $models->execute_kw($db, $uid, $password, 'res.partner', 'create', array(array('name'=>"New Partner")));
final Integer id = (Integer)models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "create",
asList(new HashMap() {{ put("name", "New Partner"); }})
));
var id int64
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "create",
[]map[string]string{
{"name": "New Partner"},
},
}, &id); err != nil {
log.Fatal(err)
}
Eredmény:
78
Figyelem
Míg a legtöbb értéktípus az elvárásoknak megfelelő (egész szám a Integer esetében, szöveg a Char vagy Text esetében),
Date,DatetimeésBinarymezők szöveges értékeket használnakOne2manyésMany2manyegy speciális parancsprotokollt használnak, amely részletezve van awrite metódus dokumentációjában.
Rekordok frissítése¶
A rekordok frissíthetők a write() metódussal. Ez egy listát vesz át a frissítendő rekordokról és egy mező-érték párokból álló térképet, hasonlóan a create() metódushoz.
Multiple records can be updated simultaneously, but they will all get the same values for the fields being set. It is not possible to perform „computed” updates (where the value being set depends on an existing value of a record).
Example
models.execute_kw(db, uid, password, 'res.partner', 'write', [[id], {'name': "Newer partner"}])
# get record name after having changed it
models.execute_kw(db, uid, password, 'res.partner', 'read', [[id], ['display_name']])
models.execute_kw(db, uid, password, 'res.partner', 'write', [[id], {name: "Newer partner"}])
# get record name after having changed it
models.execute_kw(db, uid, password, 'res.partner', 'read', [[id], ['display_name']])
$models->execute_kw($db, $uid, $password, 'res.partner', 'write', array(array($id), array('name'=>"Newer partner")));
// get record name after having changed it
$models->execute_kw($db, $uid, $password,
'res.partner', 'read', array(array($id), array('display_name')));
models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "write",
asList(
asList(id),
new HashMap() {{ put("name", "Newer Partner"); }}
)
));
// get record name after having changed it
asList((Object[])models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "read",
asList(asList(id), asList("display_name"))
)));
var result bool
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "write",
[]any{
[]int64{id},
map[string]string{"name": "Newer partner"},
},
}, &result); err != nil {
log.Fatal(err)
}
// get record name after having changed it
var record []any
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "name_get",
[]any{
[]int64{id},
},
}, &record); err != nil {
log.Fatal(err)
}
Eredmény:
[[78, "Newer partner"]]
Rekordok törlése¶
A rekordok tömegesen törölhetők azonosítóik megadásával a unlink() metódusnak.
Example
models.execute_kw(db, uid, password, 'res.partner', 'unlink', [[id]])
# check if the deleted record is still in the database
models.execute_kw(db, uid, password, 'res.partner', 'search', [[['id', '=', id]]])
models.execute_kw(db, uid, password, 'res.partner', 'unlink', [[id]])
# check if the deleted record is still in the database
models.execute_kw(db, uid, password, 'res.partner', 'search', [[['id', '=', id]]])
$models->execute_kw($db, $uid, $password, 'res.partner', 'unlink', array(array($id)));
// check if the deleted record is still in the database
$models->execute_kw(
$db, $uid, $password, 'res.partner', 'search', array(array(array('id', '=', $id)))
);
models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "unlink",
asList(asList(id))));
// check if the deleted record is still in the database
asList((Object[])models.execute("execute_kw", asList(
db, uid, password,
"res.partner", "search",
asList(asList(asList("id", "=", 78)))
)));
var result bool
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "unlink",
[]any{
[]int64{id},
},
}, &result); err != nil {
log.Fatal(err)
}
// check if the deleted record is still in the database
var record []any
if err := models.Call("execute_kw", []any{
db, uid, password,
"res.partner", "search",
[]any{[]any{
[]any{"id", "=", id},
}},
}, &record); err != nil {
log.Fatal(err)
}
Eredmény:
[]
Ellenőrzés és introspekció¶
Míg korábban a fields_get() metódust használtuk egy modell lekérdezésére, és a kezdetektől fogva egy tetszőleges modellt használtunk, az Odoo a legtöbb modell metaadatát néhány meta-modellben tárolja, amelyek lehetővé teszik a rendszer lekérdezését és a modellek és mezők módosítását (bizonyos korlátozásokkal) XML-RPC-n keresztül.
ir.model¶
Információt nyújt az Odoo modellekről különböző mezőin keresztül.
namea modell ember által olvasható leírása
modela rendszerben található minden modell neve
statehogy a modellt Python kódban generálták-e (
base) vagy egyir.modelrekord létrehozásával (manual)field_ida modell mezőinek listája egy
One2manykapcsolaton keresztül a ir.model.fields hivatkozásraview_idsOne2manykapcsolat a modellhez definiált Nézet architektúrák nézetekhezaccess_idsOne2manykapcsolat a modellre beállított Hozzáférési jogok jogosultságokhoz
ir.model használható
Lekérdezheti a rendszert a telepített modellekre vonatkozóan (mint előfeltétel a modell műveleteihez vagy a rendszer tartalmának felfedezéséhez).
Információk lekérése egy adott modellről (általában a hozzá tartozó mezők felsorolásával).
Új modellek dinamikus létrehozása RPC-n keresztül.
Fontos
Egyedi modellneveknek
x_-el kell kezdődniük.A
statemegadása kötelező ésmanual-ra kell állítani, különben a modellt nem töltik be.Nem lehetséges új metódusokat hozzáadni egy egyedi modellhez, csak mezőket.
Example
A custom model will initially contain only the „built-in” fields available on all models:
models.execute_kw(db, uid, password, 'ir.model', 'create', [{
'name': "Custom Model",
'model': "x_custom_model",
'state': 'manual',
}])
models.execute_kw(db, uid, password, 'x_custom_model', 'fields_get', [], {'attributes': ['string', 'help', 'type']})
$models->execute_kw($db, $uid, $password, 'ir.model', 'create', array(array(
'name' => "Custom Model",
'model' => 'x_custom_model',
'state' => 'manual'
)));
$models->execute_kw($db, $uid, $password, 'x_custom_model', 'fields_get', array(), array('attributes' => array('string', 'help', 'type')));
models.execute_kw(db, uid, password, 'ir.model', 'create', [{
name: "Custom Model",
model: 'x_custom_model',
state: 'manual'
}])
fields = models.execute_kw(db, uid, password, 'x_custom_model', 'fields_get', [], {attributes: %w(string help type)})
models.execute(
"execute_kw", asList(
db, uid, password,
"ir.model", "create",
asList(new HashMap<String, Object>() {{
put("name", "Custom Model");
put("model", "x_custom_model");
put("state", "manual");
}})
));
final Object fields = models.execute(
"execute_kw", asList(
db, uid, password,
"x_custom_model", "fields_get",
emptyList(),
new HashMap<String, Object> () {{
put("attributes", asList(
"string",
"help",
"type"));
}}
));
var id int64
if err := models.Call("execute_kw", []any{
db, uid, password,
"ir.model", "create",
[]map[string]string{
{
"name": "Custom Model",
"model": "x_custom_model",
"state": "manual",
},
},
}, &id); err != nil {
log.Fatal(err)
}
recordFields := map[string]string{}
if err := models.Call("execute_kw", []any{
db, uid, password,
"x_custom_model", "fields_get",
[]any{},
map[string][]string{
"attributes": {"string", "help", "type"},
},
}, &recordFields); err != nil {
log.Fatal(err)
}
Eredmény:
{
"create_uid": {
"type": "many2one",
"string": "Created by"
},
"create_date": {
"type": "datetime",
"string": "Created on"
},
"__last_update": {
"type": "datetime",
"string": "Last Modified on"
},
"write_uid": {
"type": "many2one",
"string": "Last Updated by"
},
"write_date": {
"type": "datetime",
"string": "Last Updated on"
},
"display_name": {
"type": "char",
"string": "Display Name"
},
"id": {
"type": "integer",
"string": "Id"
}
}
ir.model.fields¶
Információt nyújt az Odoo modellek mezőiről, és lehetővé teszi egyedi mezők hozzáadását Python kód használata nélkül.
model_idMany2onea ir.model hivatkozásra, amelyhez a mező tartoziknamea mező technikai neve (használva a
readvagywritesorán)field_descriptiona mező felhasználó által olvasható címkéje (pl.
stringafields_get-ben)ttypea létrehozandó mező típusa
statehogy a mezőt Python kóddal (
base) vagyir.model.fields-en keresztül (manual) hozták-e létrerequired,readonly,translateengedélyezi a megfelelő jelzőt a mezőn
csoportokmezőszintű hozzáférés-vezérlés, egy
Many2manyares.groups-hozselection,size,on_delete,relation,relation_field,domaintípus-specifikus tulajdonságok és testreszabások, részletekért lásd a mezők dokumentációját
Fontos
Like custom models, only new fields created with
state="manual"are activated as actual fields on the model.Számított mezők nem adhatók hozzá
ir.model.fields-en keresztül, néhány mező meta-információ (alapértelmezések, onchange) sem állítható be.
Example
id = models.execute_kw(db, uid, password, 'ir.model', 'create', [{
'name': "Custom Model",
'model': "x_custom",
'state': 'manual',
}])
models.execute_kw(db, uid, password, 'ir.model.fields', 'create', [{
'model_id': id,
'name': 'x_name',
'ttype': 'char',
'state': 'manual',
'required': True,
}])
record_id = models.execute_kw(db, uid, password, 'x_custom', 'create', [{'x_name': "test record"}])
models.execute_kw(db, uid, password, 'x_custom', 'read', [[record_id]])
$id = $models->execute_kw($db, $uid, $password, 'ir.model', 'create', array(array(
'name' => "Custom Model",
'model' => 'x_custom',
'state' => 'manual'
)));
$models->execute_kw($db, $uid, $password, 'ir.model.fields', 'create', array(array(
'model_id' => $id,
'name' => 'x_name',
'ttype' => 'char',
'state' => 'manual',
'required' => true
)));
$record_id = $models->execute_kw($db, $uid, $password, 'x_custom', 'create', array(array('x_name' => "test record")));
$models->execute_kw($db, $uid, $password, 'x_custom', 'read', array(array($record_id)));
id = models.execute_kw(db, uid, password, 'ir.model', 'create', [{
name: "Custom Model",
model: "x_custom",
state: 'manual'
}])
models.execute_kw(db, uid, password, 'ir.model.fields', 'create', [{
model_id: id,
name: "x_name",
ttype: "char",
state: "manual",
required: true
}])
record_id = models.execute_kw(db, uid, password, 'x_custom', 'create', [{x_name: "test record"}])
models.execute_kw(db, uid, password, 'x_custom', 'read', [[record_id]])
final Integer id = (Integer)models.execute(
"execute_kw", asList(
db, uid, password,
"ir.model", "create",
asList(new HashMap<String, Object>() {{
put("name", "Custom Model");
put("model", "x_custom");
put("state", "manual");
}})
));
models.execute(
"execute_kw", asList(
db, uid, password,
"ir.model.fields", "create",
asList(new HashMap<String, Object>() {{
put("model_id", id);
put("name", "x_name");
put("ttype", "char");
put("state", "manual");
put("required", true);
}})
));
final Integer record_id = (Integer)models.execute(
"execute_kw", asList(
db, uid, password,
"x_custom", "create",
asList(new HashMap<String, Object>() {{
put("x_name", "test record");
}})
));
client.execute(
"execute_kw", asList(
db, uid, password,
"x_custom", "read",
asList(asList(record_id))
));
var id int64
if err := models.Call("execute_kw", []any{
db, uid, password,
"ir.model", "create",
[]map[string]string{
{
"name": "Custom Model",
"model": "x_custom",
"state": "manual",
},
},
}, &id); err != nil {
log.Fatal(err)
}
var fieldId int64
if err := models.Call("execute_kw", []any{
db, uid, password,
"ir.model.fields", "create",
[]map[string]any{
{
"model_id": id,
"name": "x_name",
"ttype": "char",
"state": "manual",
"required": true,
},
},
}, &fieldId); err != nil {
log.Fatal(err)
}
var recordId int64
if err := models.Call("execute_kw", []any{
db, uid, password,
"x_custom", "create",
[]map[string]string{
{"x_name": "test record"},
},
}, &recordId); err != nil {
log.Fatal(err)
}
var recordFields []map[string]any
if err := models.Call("execute_kw", []any{
db, uid, password,
"x_custom", "read",
[][]int64{{recordId}},
}, recordFields); err != nil {
log.Fatal(err)
}
Eredmény:
[
{
"create_uid": [1, "Administrator"],
"x_name": "test record",
"__last_update": "2014-11-12 16:32:13",
"write_uid": [1, "Administrator"],
"write_date": "2014-11-12 16:32:13",
"create_date": "2014-11-12 16:32:13",
"id": 1,
"display_name": "test record"
}
]