Skip to content

Instantly share code, notes, and snippets.

@akhdaniel
Last active May 20, 2022 03:28
Show Gist options
  • Save akhdaniel/0e55af77e2db4babf9f7d73014c527b7 to your computer and use it in GitHub Desktop.
Save akhdaniel/0e55af77e2db4babf9f7d73014c527b7 to your computer and use it in GitHub Desktop.

Odoo Webservice API Context

Pada pembuatan aplikasi mobile yang terkoneksi ke Odoo dengan JSONRPC/XMLRPC seringkali kita perlu mendapatkan informasi stock dan harga per lokasi gudang atau harga barang per company jika Odoo nya sudah dibuat multi-company.

Artikel ini membahas bagaimana secara API jsonrpc/xmlrpc kita bisa untuk:

  • mendapatkan data quantity produk sesuai gudang, lokasi, atau company
  • mendapatkan harga produk sesuai price list

Sebelum mulai, artikel ini disponsori oleh RoyalQ, robot trading crypto-currency otomatis yang bisa menghasilkan profit konsisten 10-30% per bulan sambil anda ngoding ataupun tidur!

Informasi dan PENDAFTARAN : https://royalq.info/s/daftar_sekarang

Register Account Binance: https://accounts.binance.com/en/register?ref=35436636

Berikut ini kode client xmlrpc menggunakan python xmlrpc.client yang dapat dengan mudah anda translate menjadi bahasa program apapun asalkan bisa koneksi secara xml/json rpc.

Yang penting diperhatikan adalah struktur data parameter yang dikirimkan ke method remote yang ada di Odoo.

Misalnya untuk mendapatkan data produk dan stock keseluruhan gudang:

import xmlrpc.client
url = 'https://odoo.xxxxx.com'
username='admin'
password='pass!'
db='odoo'
common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})
print(uid)

models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))
product = models.execute_kw(db, uid, password,
    'product.product', 'search_read',
        [[['name', 'ilike', 'beras'], ['is_published', '=', True]]],
        {
                'limit': 80 ,
                'fields': ['name', 'qty_available', 'price'],
        }
    )
print(product)

Hasilnya ada data produk dengan field name, qty_available, dan price pada semua lokasi dan gudang pada seluruh company yang ada di Odoo, dibatasi sebanyak 80 record saja (limit). Perhatikan parameter yang dikasi pada pemanggilan method search_read pada object product.product.

Untuk mendapatkan data produk dan stock pada suatu gudang tertentu:

import xmlrpc.client
url = 'https://odoo.xxxxx.com'
username='admin'
password='pass!'
db='odoo'
common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})
print(uid)

models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))
product = models.execute_kw(db, uid, password,
    'product.product', 'search_read',
        [[['name', 'ilike', 'beras'], ['is_published', '=', True]]],
        {
                'limit': 20 ,
                'fields': ['name', 'qty_available', 'price'],
                'context': {'warehouse':3343,}
                'offset': 10,
        }
    )
print(product)

Hasilnya ada data produk dengan field name, qty_available, dan price, namun kali ini quantity barang adalah total yang ada pada gudang (warehouse) dengan ID 3343, dibatasi sebanyak 20 record saja (limit). Disini kita tambahkan parameter context yang berupa object dictionary (sama spt object pada json), yang berisi ID warehouse dimana produk berada.

Dan ada tambahan parameter optional offset yang gunanya untuk menampilkan hasil dimulai dari record ke 10. Perhatikan parameter yang dikasi pada pemanggilan method search_read pada object product.product.

Untuk mendapatkan data stock produk pada location saja:

import xmlrpc.client
url = 'https://odoo.xxxxx.com'
username='admin'
password='pass!'
db='odoo'
common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})
print(uid)

models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))
product = models.execute_kw(db, uid, password,
    'product.product', 'search_read',
        [[['name', 'ilike', 'beras'], ['is_published', '=', True]]],
        {
                'limit': 20 ,
                'fields': ['name', 'qty_available', 'price'],
                'context': {'location':333,}
        }
    )
print(product)

Hasilnya ada data produk dengan field name, qty_available, dan price, namun kali ini quantity barang adalah total yang ada pada lokasi (stock.location) dengan ID 333, dibatasi sebanyak 20 record saja (limit). Disini kita tambahkan parameter context yang berupa object dictionary (sama spt object pada json), yang berisi ID stock.location dimana produk berada.

Untuk mendapatkan data produk dan harga nya sesuai pricelist tertentu:

import xmlrpc.client
url = 'https://odoo.xxxxx.com'
username='admin'
password='pass!'
db='odoo'
common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})
print(uid)

models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))
product = models.execute_kw(db, uid, password,
    'product.product', 'search_read',
        [[['name', 'ilike', 'beras'], ['is_published', '=', True]]],
        {
                'fields': ['name', 'qty_available', 'price'],
                'context': {'pricelist':43,}
        }
    )
print(product)

Hasilnya ada data produk dengan field name, qty_available, dan price, namun kali ini harga barang adalah harga sesuai dengan price list yang dikirim melalui context yang berupa object dictionary (sama spt object pada json), yang berisi ID pricelist.

Variable context yang lain:

  • warehouse
  • company
  • location
  • pricelist, note field price is calculated on given pricelist context
  • tz, timezone user
  • lang, bahasa yang mau digunakan

Kalau ditelusuri lebih lanjut, struktud data format parameter method JSON RPC secara lengkapnya sbb:

{
    "jsonrpc": "2.0",
    "method": "call",
    "params": {
        "service": "object",
        "method": "execute_kw",
        "args": [
            "<database-name>",
            <user_id>,
            "<user_password>",
            "product.product",
            "search_read",
            [
                [
                   ["type", "=", "product"]
                ]
            ],
            {
                "fields": ["id", "name", "display_name"],
                "context": {
                    "lang": "fr_FR"
                },
                "limit": 5
            }
        ]
    },
    "id": <idRequest>
}

Done!


Profit per Hari

Artikel ini disponsori oleh RoyalQ, robot trading crypto-currency otomatis yang bisa menghasilkan profit konsisten 10-30% per bulan sambil anda tidur!

Informasi dan PENDAFTARAN : https://royalq.info/s/daftar_sekarang

Register Account Binance: https://accounts.binance.com/en/register?ref=35436636


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment