• Tidak ada hasil yang ditemukan

XML-RPC dan Python

Dalam dokumen DASAR DASAR OPENERP SISI TEKNIKAL DAN CO (Halaman 149-158)

9. Web Service dengan XML-RPC

9.3 XML-RPC dan Python

Terdapat beberapa protokol web service yang disediakan oleh OpenERP, namun bab ini hanya akan membahas XML-RPC. Protokol ini memungkinkan Remote Procedure Call (RPC) yang:

• menggunakan XML untuk mengencode pemanggilan • menggunakan HTTP sebagai mekanisme transport

Protokol ini dikembangkan pada tahun 1998. Pustaka untuk berbagai bahasa pemrograman juga mudah ditemukan.

Khusus untuk Python, pustaka untuk bekerja dengan XML-RPC (client ataupun server) telah disertakan dalam standard library sejak Python versi 2.2. Dalam tulisan ini, kita hanya akan menggunakan pustaka client yaitu xmlrpclib pada Python 2.x.

Terdapat sejumlah fungsi yang disediakan oleh OpenERP. Kita akan membahas sebagian dari fungsi- fungsi tersebut dari perspektif Python, baik dengan memanfaatkan pustaka bantu ataupun langsung menggunakan xmlrpclib.

Untuk contoh XML-RPC dan OpenERP dengan beberapa bahasa pemrograman lain, Anda dapat membacanya dari dokumentasi resmi OpenERP.

9.4 Pustaka oerpapi

Pada dasarnya, kita cukup menggunakan xmlrpclib untuk berbicara dengan server OpenERP. Namun, beberapa pustaka bantu membuatnya lebih mudah dan nyaman. Salah satu pustaka yang dapat digunakan adalah oerpapi.

Pustaka ini dikembangkan oleh Noprianto, salah satu anggota tim penulis buku ini, dan dapat didownload dari https://github.com/nopri/oerpapi. Lisensi yang dipergunakan adalah LGPL, sehingga aplikasi yang menggunakan pustaka ini tidak harus disediakan source codenya. Sebagai catatan, pustaka oerpapi pada saat tulisan ini dibuat masih relatif baru dan berada pada versi 0.03.

Semua class ataupun fungsi akan selalu tersedia dalam satu file tunggal oerpapi.py. File ini dapat dikopikan pada (salah satu):

• Direktori pustaka Python yang terdaftar (system-wide)

• Direktori lain, dimana Anda perlu mengatur environment variabel PYTHONPATH • Direktori program Anda (atau subdirektori di dalamnya)

Untuk menggunakan pustaka ini, kita dapat melakukan import seperti contoh berikut: import oerpapi

Beberapa class telah disediakan untuk bekerja dengan OpenERP. Kita akan membahas beberapa contoh di sini. Pembahasan lain dapat pula ditemukan pada contoh-contoh program. Sementara, untuk informasi selengkapnya tentang module ini, rujuklah pada source code oerpapi.py.

OErpClient

Kita umumnya selalu mulai dari menginstansiasi class ini. Contoh: >>> client = oerpapi.OErpClient('localhost')

>>> client

<oerpapi.OErpClient instance at 0xb726ec8c>

Untuk terhubung ke server, kita menggunakan method connect(). Contoh: >>> client.connect()

Setelah terhubung, kita bisa mendapatkan beberapa informasi dari server seperti contoh berikut: >>> client.version()

{'server_version_info': [7, 0, 0, 'final', 0], 'server_serie': '7.0', 'server_version': '7.0-20140724-231255', 'protocol_version': 1}

System : Linux-3.13.0-24-generic-i686-with-Ubuntu-14.04-trusty OS Name : posix

Distributor ID: Ubuntu

Description: Ubuntu 14.04 LTS Release: 14.04

Codename: trusty

Operating System Release : 3.13.0-24-generic

Operating System Version : #46-Ubuntu SMP Thu Apr 10 19:08:14 UTC 2014 Operating System Architecture : 32bit

Operating System Locale : en_US.UTF-8 Python Version : 2.7.6

OpenERP-Server Version : 7.0-20140724-231255

Sebelum bekerja dengan database, kita perlu melakukan login terlebih dahulu: >>> client.login('test1', 'demo', 'demo')

>>> client.uid 3

Informasi class

class OErpClient

| __init__(self, host, port=8069, data=None) | | check_connectivity(self) | | connect(self, **args) | | create_url(self, resource) | | get_db(self) | | get_model(self, model) |

| get_report(self, model, ids, datas=False, context=False) |

| login(self, database, user, password) |

| server_environment(self) |

| version(self)

OErpModel

Melanjutkan dari contoh sebelumnya, ketika telah terhubung dan login, kita bisa bekerja dengan model OpenERP, sebagai contoh adalah res.partner:

>>> partner = client.get_model('res.partner') >>> partner

<oerpapi.OErpModel instance at 0xb710e62c> Terdapat beberapa method yang telah disediakan seperti:

• create: membuat. Catatan: pastikan semua field yang required telah diisikan. • write: update

• read: membaca. Catatan: gunakan list kosong sebagai field untuk mendapatkan semua field.

• search: mencari. Catatan: untuk kriteria lebih dari satu, pencarian dilakukan dengan Polish Notation, dimana operator seperti '|' dan '&' ditempatkan di depan.

• unlink: menghapus Contoh:

>>> partner_id = partner.create({'name': 'test'}) >>> partner_id

122

>>> partner.write(partner_id, {'name': 'test baru'}) True

>>> partner_search = partner.search([('name', 'ilike', 'test')]) >>> print partner_search

[119, 121, 122]

>>> partner.read(partner_search, ['name'])

[{'name': 'Test 123', 'id': 119}, {'name': 'test 1234', 'id': 121}, {'name': 'test baru', 'id': 122}]

>>> partner.unlink(partner_id) True

Informasi class class OErpModel

| __init__(self, client, model) | | check_context(self, context) | | check_fields(self, fields) | | check_ids(self, ids) |

| check_none(self, val, default=False) |

| create(self, values, context=None) |

| read(self, ids, fields=None, context=None) |

| search(self, domain, offset=0, limit=None, order=None, context=None, count=False)

|

| unlink(self, ids, context=None) |

Dari instance OErpClient, kita bisa pula bekerja dengan database: >>> db = client.get_db()

>>> db

<oerpapi.OErpDb instance at 0xb710e46c> Terdapat beberapa method yang telah disediakan seperti: • list: mendapatkan daftar database yang tersedia • list_lang: mendapatkan daftar bahasa

• exist: memeriksa apakah suatu database telah ditemukan

• create: membuat database baru. Bahasa yang dipergunakan bisa diatur, namun tidak semua terjemahan telah lengkap. Password yang dilewatkan pada fungsi ini akan menjadi password admin untuk database yang dibuat.

• drop: menghapus database

• rename: mengganti nama database

• dump: melakukan dump/backup database ke file. Perhatikanlah bahwa nilai yang dikembalikan adalah dalam encoding base64.

• restore: melakukan restore dari file ke database baru. Sebagaimana halnya pada dump, kita perlu melewatkan dalam encoding base64.

• duplicate: membuat database baru berdasarkan database yang ada

• change_admin_password: mengganti password admin. Apa yang kita ganti di sini akan ditulis ulang pada file konfigurasi server (bukan hanya berlaku sementara).

Contoh:

>>> db.list()

['test1', 'test1_copy', 'test2', 'test3', 'test3_new', 'test_baru', 'test_baru2'] >>> db.exist('database_tidak_ditemukan')

False

>>> db.exist('test1') True

Untuk tugas-tugas administratif, kita perlu menyediakan password admin, seperti yang ditentukan pada konfigurasi server OpenERP:

>>> db.admin_password = 'myadminpassword'

Contoh tugas-tugas administratif:

>>> db.create('test_create', False, 'en_US', 'mypassword') True

>>> db.rename('test_create', 'test_create_rename') True >>> db.duplicate('test_create_rename', 'test_duplicate') True >>> db.drop('test_create') False >>> db.drop('test_create_rename') True >>> db.drop('test_duplicate') True

Perhatikanlah bahwa apabila password admin tidak diberikan, maka exception akan terjadi: >>> db.admin_password = ''

>>> db.create('test_create', False, 'en_US', 'mypassword') Traceback (most recent call last):

File "<stdin>", line 1, in <module> …

… …

raise Fault(**self._stack[0])

xmlrpclib.Fault: <Fault AccessDenied: 'Access denied.'>

Informasi class class OErpDb | __init__(self, client) | | change_admin_password(self, new_password) |

| create(self, name, demo, lang, password) |

| drop(self, name) |

| dump(self, name) |

| duplicate(self, name, target_name) | | exist(self, name) | | list(self, arg=False) | | list_lang(self) |

| rename(self, name, new_name) |

Melanjutkan dari contoh sebelumnya, ketika telah terhubung dan login, kita bisa bekerja dengan report OpenERP. Sebagai contoh, kita bekerja dengan model res.partner:

>>> client.login('test1', 'demo', 'demo') >>> partner = client.get_model('res.partner')

>>> partner_search = partner.search([('name', 'ilike', 'test')]) >>> report = client.get_report('res.partner', partner_search) >>> report

<oerpapi.OErpReport instance at 0xb705deec>

Report dalam format PDF bisa didapatkan dengan cara memanggil method get. Sebagai contoh: >>> report_output = report.get()

Apa yang dihasilkan adalah isi file report dalam encoding base64. Kita dapat menulisnya ke file: >>> import base64 >>> if report_output: ... f = open('/tmp/report.pdf', 'wb') ... f.write(base64.decodestring(report_output)) ... f.close() ...

Menggunakan program 'file', kita bisa memastikan bahwa file yang dihasilkan adalah dalam format PDF:

$ file report.pdf

report.pdf: PDF document, version 1.4

Untuk pengaturan report lebih lanjut, kita bisa melewatkan datas dan context sebagai argumen ketiga dan keempat pada get_report(). Untuk informasi lebih lanjut tentang report, bacalah juga Bab 7 Laporan.

Penundaan dilakukan selama beberapa waktu tertentu sampai report berhasil dibuat. Rujuklah ke source code untuk OErpReport untuk delay_1, delay_2 dan number_of_tries. Kita akan membahas ini juga pada contoh program laporan (11.8).

Informasi class

class OErpReport

| __init__(self, client, model, ids, datas=False, context=False) |

| check_datas(self) |

Exception

Modul ini tidak melakukan try/except untuk exception yang mungkin terjadi. Sebagai contoh, ketika kita tidak melakukan koneksi terlebih dahulu dan ingin login:

>>> client = oerpapi.OErpClient('localhost')>>> client.login('test1', 'demo', 'demo')

Traceback (most recent call last): File "<stdin>", line 1, in <module> …

… …

self.uid = self.sock_common.login(self.database, self.user, AttributeError: 'bool' object has no attribute 'login'

Atau, ketika kita sudah terhubung, namun belum melakukan login dan ingin melakukan pencarian: >>> client = oerpapi.OErpClient('localhost')

>>> client.connect() >>>

>>> partner = client.get_model('res.partner')

>>> partner_search = partner.search([('name', 'ilike', 'test')]) Traceback (most recent call last):

File "<stdin>", line 1, in <module> …

… …

raise Fault(**self._stack[0])

xmlrpclib.Fault: <Fault FATAL: database "False" does not exist …

Oleh karena itu, sangat disarankan dalam program untuk memeriksa adanya exception. Contoh sederhana ketika login dengan password yang salah:

>>> import xmlrpclib >>> client = oerpapi.OErpClient('localhost') >>> client.connect() >>> >>> client.login('test1', 'demo', '') >>> partner = client.get_model('res.partner') >>> >>> try:

... partner_search = partner.search([('name', 'ilike', 'test')]) ... except xmlrpclib.Fault, e:

... partner_search = []

... print 'Terjadi kesalahan: %s' %(e) ...

Terjadi kesalahan: <Fault AccessDenied: 'Access denied.'> >>>

Memeriksa hasil login

Perhatikanlah bahwa method login() tidak mengembalikan nilai sukses atau gagal. Mari kita contohkan login dengan password yang salah:

>>> client = oerpapi.OErpClient('localhost') >>> client.connect()

>>>

>>> result = client.login('test1', 'demo', '') >>> result

>>> type(result) <type 'NoneType'> >>>

Untuk memeriksa apakah login gagal atau sukses, akseslah property uid. Sebagai contoh, pada login yang gagal:

>>> client.uid False

Dan, contoh untuk login yang berhasil (uid akan berisikan nilai User ID OpenERP): >>> client.login('test1', 'demo', 'demo')

>>> client.uid 3

Pemeriksaan berikut bisa pula digunakan: >>> client.login('test1', 'demo', '') >>> if client.uid:

... print 'Login berhasil' ... else:

... print 'Login gagal' ...

Login gagal

>>> client.login('test1', 'demo', 'demo') >>> if client.uid:

... print 'Login berhasil' ... else:

... print 'Login gagal' ...

Dalam dokumen DASAR DASAR OPENERP SISI TEKNIKAL DAN CO (Halaman 149-158)

Dokumen terkait