Cara Membuat Recods / Data  Odoo Menjadi Data JSON (REST APIs)

Bismillah.., Segala puji milik Allah. Yang mana kita patut memuji-Nya, yang mana kita harapkan pertolongan-Nya dan kita harapkan ampunan-Nya. Serta sepatutnya kita berlindung diri kepada-Nya dari segala keburukan diri dan kejelekan perbuatan yang ada pada diri kita. Siapa yang diberi hidayah oleh Allah maka tidak ada yang mampu menyesatkannya dan siapa yang disesatkan oleh Allah maka tidak akan ada yang dapat memberikan hidayah. Sebelumnya Saya juga bersaksi bahwa tidak ada tuhan (yang berhak disembah) selain Allah semata yang tidak ada sekutu bagi-Nya dan saya bersaksi bahwa Nabi Muhammad Shalallahu'alaihi wa sallam adalah hamba dan utusan-Nya.

Selanjutnya saya ucapkan Ahlan wa sahlan wa Baarokallohu fiikum jamii'an bagi para pembaca blog ini dan tidak lupa juga saya berdo'a semoga seluruh kaum muslimin yang sedang sakit diberikan kesehatan dan yang sehat selalu dijaga oleh Allah azza wa jalla dan selalu diberikan hidayah islam dan diatas sunnah Nabi kita (Muhammad). Aamiin..!. Untuk kali ini saya masih akan membahas dari bahasan explore yang saya dapatkan sebelumnya mengenai ODOO, tetapi untuk pembahasan kali ini merupakan pembahasan dari kebalikannya. Jika sebelumnya saya membahas cara pengambilan data JSON, maka kali ini saya akan membuat endpoint dan data JSON agar bisa cosume secara public maupun private, Hal ini tergantung dari kebuuhan anda masing-masing.

Sebelumnya ada, anda harus menyiapkan dan memastikan aplikasi Postman sudah anda install sebagai uji coba kita, untuk mengetahui dan memastikan kita berhasil membuat endpoint dan data JSON. Dan selanjutnya saya akan mencoba membuat Data JSON dari object product.product untuk di consume secara public. Adapun caranya, anda bisa mengikuti langkah-langkah berikut ini:

1. Untuk langkah pertama pada Folder Controllers pada file python (.py) tambahkan beberapa library tambahan

from odoo import models, fields, api
from odoo import http, _
from odoo.http import request, route
importrequests
from math import sin, cos, sqrt, atan2, radians


2. Buat Sebuah @route pada Class Controller untuk membuat endpointnya

class GetProductProduct(http.Controller):
@route(route=['/get_product_product'], methods=['POST'], type='json'auth='public'
csrf=False)
def get_product_product(self, **kwargs):
result = {}
params = request.httprequest.args
body = request.jsonrequest

page = int(params.get('page'1))
limit = int(params.get('limit'100))
offset = (page - 1) * limit if limit else 0
order = 'id asc'
domain = []

product_id = body.get('id'False)
if product_id:
            domain += [('id''in'product_id)]
product = count = False
productcount = request.env['product.product'].sudo().get_product_product(
domain=domainlimit=limitoffset=offsetorder=order)
result = {}
meta = {
'total_item'count,
'total_page'math.ceil(count / limitif limit else 1
  }
result['result'] = product
result['meta'] = meta
return result

Ket:
- Pada @route:

  • route=['/get_product_product'], ini digunakan untuk endpoint yang nantinya kita panggil melalui postman untuk ujicoba.

  • methods=['POST'], ini bisa diganti dengan GET/POST sesuai dengan kebutuhannya. Saya disini menggunakan POST karena nantinya saya bikin params untuk filter data yg didapat.

  • type='json', ini merupakan tipe data hasil respon yang nantinya akan ditampilkan.

  • auth='public', ini bisa diganti dengan user/public. public digunakan untuk jika data ingin di consume secara public, dan user digunakan jika data ingin di consume secara private.

- product_id = body.get('id', False), digunakan untuk pembuatan params yang nantinya sebagai variabel dalam memfilter data yang

  didapatkan


3. Kemudian buatlah sebuah Method get_product_product() Pada Class Product yang meng-inherit ke object 'product.product'

class ProductProduct(models.Model):
_inherit = 'product.product'

def get_product_product(selfdomain=Falselimit=Falseoffset=Falseorder=False):
read_list = [
  'id',
  'name',
  'sale_ok',
            'purchse_ok',
            'type',
            'categ_id',
            'lst_price',
            'standard_price',
            'uom_id',
            'uom_po_id',
  ]
search_list = domain
product_id = self.search(
search_listlimit=limitoffset=offsetorder=order)
result_count = self.search_count(search_list)
result = product_id.read(read_listload=False)

for rec in result:
for key in rec:
if isinstance(self._fields[key], fields.Many2one):
if isinstance(rec[key], int):
comodel_name = self._fields[key].comodel_name
rec[key] = self.env[comodel_name].browse(
rec[key]).read(['id''name'])
return resultresult_count

Ket:
- Variabel read_list=['.......'], merupakan fields yang ada pada obejct 'product.product' yang nantinya kita tampilkan. dan nantinya kita panggil

  dengan ORM odoo dengan method read().


Untuk Selanjut kita loop data dengan memberika kondisi jika ada fields Many2one, maka kita akan menampilkan nilai dari id dan name. Dan silahkan uji coba dengan menggunakan postman sebelumnya kita install. Dan maka hasilnya:

 

Dan ini hasil jika kita memfilter dengan memasukkan id = [1,2]:

 

Dan sekian untuk sharing saya kali ini, semoga bermanfaat dan jika ada yang kurang jelas mengenai pembahasan saya, silahkan di coment di blog ini.

Jazakakumullahu khoiron katsiron..
Cara Memasukkan Data JSON (REST APIs)
ke Odoo Dengan Button