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.

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 Beállítások ‣ Felhasználók és Cégek ‣ Felhasználók 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)>

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:

../../_images/preferences.png

majd nyissa meg a Fiók biztonsága fület, és kattintson az Új API kulcs gombra:

../../_images/account-security1.png

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:

../../_images/delete-key.png

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']

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()

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, {})

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ám

  • a 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})

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]]])

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})

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]]])

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)

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']})

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']})

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})

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"}])

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 és Binary mezők szöveges értékeket használnak

  • One2many és Many2many egy speciális parancsprotokollt használnak, amely részletezve van a write 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']])

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]]])

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.

name

a modell ember által olvasható leírása

model

a rendszerben található minden modell neve

state

hogy a modellt Python kódban generálták-e (base) vagy egy ir.model rekord létrehozásával (manual)

field_id

a modell mezőinek listája egy One2many kapcsolaton keresztül a ir.model.fields hivatkozásra

view_ids

One2many kapcsolat a modellhez definiált Nézet architektúrák nézetekhez

access_ids

One2many kapcsolat 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 state megadása kötelező és manual-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']})

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_id

Many2one a ir.model hivatkozásra, amelyhez a mező tartozik

name

a mező technikai neve (használva a read vagy write során)

field_description

a mező felhasználó által olvasható címkéje (pl. string a fields_get-ben)

ttype

a létrehozandó mező típusa

state

hogy a mezőt Python kóddal (base) vagy ir.model.fields-en keresztül (manual) hozták-e létre

required, readonly, translate

engedélyezi a megfelelő jelzőt a mezőn

csoportok

mezőszintű hozzáférés-vezérlés, egy Many2many a res.groups-hoz

selection, size, on_delete, relation, relation_field, domain

tí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]])

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"
    }
]