OpenERP: Hak Akses pada Record

Foto os

Perusahaan Anda memiliki beberapa departemen, yaitu IT, Keuangan, dan Pemasaran. Untuk Departemen IT terbagi lagi menjadi 2 divisi yaitu Divisi Software dan Divisi Hardware. Masing-masing departemen diizinkan mengelola data karyawannya. Praktis setidaknya ada tiga user OpenERP untuk tiga departemen tersebut. Sistem menggunakan database tunggal. Dengan demikian Anda membutuhkan hak akses terhadap record karyawan untuk ketiga user tersebut dengan definisi: "user hanya diperkenankan mengubah data karyawan yang berada di departemen yang sama dengannya". Pada OpenERP topik ini disebut sebagai Record Rules.

Berikut tahapannya:

  1. Pasang modul hr.
  2. Daftarkan departemen.
  3. Daftarkan user dan tetapkan departemen yang akan ditanganinya.
  4. Buat user group Admin Karyawan dan daftarkan ketiga user tersebut sebagai anggotanya.
  5. Buat record rules Departemen Terkait dan tetapkan user group Admin Karyawan sebagai group yang akan mendapatkan aturan ini.
  6. Daftarkan karyawan dan tetapkan departemen atau divisinya.
  7. Uji hak akses dengan login sebagai user tersebut. Lalu masuk ke menu Karyawan dan pastikan ia tidak dapat melihat data karyawan departemen lain.

Sekarang pasanglah modul hr dan buatlah ketiga departemen tersebut pada menu Sumber Daya Manusia, Konfigurasi, Sumber Daya Manusia, Karyawan, Departemen. Pendaftaran divisi juga termasuk di sini, bedanya field parent diisi departemennya.

Selanjutnya membuat tiga user untuk masing-masing departemen tersebut melalui menu Administration, Users, Users. Isilah User Name (nama lengkap), Login (username untuk login), dan Change password. Lalu dibawahnya tentukan Departemen.

Buat user group melalui menu Administration, Users, Groups. Daftarkan group dengan nama Admin Karyawan dengan anggota ketiga user tersebut.

Kini saatnya menetapkan aturan record mana saja yang boleh diakses oleh user group Admin Karyawan, yaitu melalui menu Administration, Security, Record Rules. Buatlah aturan baru bernama Departemen Terkait. Pada bagian Object masukkan karyawan atau employee. Sedangkan pada bagian Domain isi dengan:

[('department_id', 'in', user.my_departments())]

Lalu di bawahnya pada bagian Access Groups tambahkan group Admin Karyawan, dan akhiri dengan klik Simpan.

Kini perhatikan pernyataan pada Domain di atas, dimana penerjemahan secara Python pseudo code begini:

hr_employee.department_id in user.my_departments()

user boleh dikatakan sebagai global variable yang merupakan objek user yang sedang login. Class-nya bisa diperoleh di file addons/base/res/res_user.py class users. Dilihat dari source code-nya, class users ini tidak memiliki fungsi my_departments(). Ya, memang tidak ada. Oleh karena itu kita perlu menambahkannya tanpa harus mengubah file aslinya, yaitu dengan membuat modul hr_user dimana didalamnya ada class hr_user yang - secara OpenERP - merupakan turunan dari res.users.

Sekarang buatlah direktorinya:

$ mkdir addons/hr_user

Lalu buat file addons/hr_user/hr_user.py yang berisi:

from osv import osv
 
 
def _get_department_childs(department_id):
    r = department_id.child_ids or []
    for child in r:
        r += _get_department_childs(child)
    return r
 
def get_department_childs(department_id):
    r = [department_id.id]
    childs = _get_department_childs(department_id)
    r += map(lambda x: x.id, childs)
    return r
 
 
class hr_user(osv.osv):
    _inherit = 'res.users'
    _description = "User's departments"
 
    def my_departments(self, cr, uid, ids):
        my_uid = ids[0]
        obj = self.pool.get('res.users')
        user = obj.browse(cr, uid, my_uid)
        return get_department_childs(user.context_department_id)
 
hr_user()

Buat juga addons/hr_user/__init__.py:

import hr_user

dan addons/hr_user/__openerp__.py:

{
    'name' : 'Admin Karyawan',
    'depends' : ['hr'],
}

Selanjutnya modul hr_user ini perlu diperkenalkan terlebih dahulu agar tampil di daftar modul yang bisa dipasang, yaitu melalui menu Administration, Modules, Update Modules List. Setelah selesai pasanglah modul ini.

Konfigurasi telah selesai. Kini saatnya mencoba. Daftarkan beberapa karyawan melalui menu Sumber Daya Manusia, Karyawan. Isilah Nama dan Departemen.

Setelah selesai, logout, dan login-lah kembali sebagai user yang terdaftar sebagai group Admin Karyawan tadi. Masuklah ke menu Sumber Daya Manusia, Karyawan untuk menampilkan daftar karyawan. Secara default, filter Departemen akan berisi departemen yang melekat pada user yang sedang login. Kosongkanlah filter ini, pilihannya ada di paling bawah, lalu klik Search. Seharusnya tidak ada karyawan lain yang tampil selain karyawan yang sesuai dengan departemen si user yang sedang login.

Otomatisasi
Pembuatan record rules di atas selalu dilakukan setelah pembuatan database baru. Ini cukup merepotkan. Untuk itu kita perlu membuat script XML yang akan melakukan:

  1. Pembuatan user group Admin Karyawan.
  2. Pembuatan record rule Departemen Terkait yang akan diterapkan ke user group tersebut.

Buatlah file addons/hr_user/security.xml:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data noupdate="1">
 
        <!-- User Group -->
 
        <record id="group_employee_admin" model="res.groups">
            <field name="name">Admin Karyawan</field>
        </record>    
 
        <!-- Record Rules -->
 
        <record id="record_rule_related_department" model="ir.rule">
            <field name="name">Departemen Terkait</field>
            <field name="model_id" ref="hr.model_hr_employee"/>
            <field name="domain_force">[('department_id','in', user.my_departments())]</field>
            <field name="groups" eval="[(4, ref('group_employee_admin'))]"/>
        </record>
 
    </data>
</openerp>

Daftarkan di addons/hr_user/__openerp__.py sehingga menjadi:

{
    'name' : 'Admin Karyawan',
    'depends' : ['hr'],
    'update_xml': ['security.xml'],
}

Restart openerp-server, lalu ujilah dengan membuat database baru.

Perhatikan baris

            <field name="model_id" ref="hr.model_hr_employee"/>

khususnya pada atribut ref, dimana awalan hr. mengacu pada file addons/hr/hr.py. Sedangkan akhiran model_hr_employee mengacu pada nama class hr_employee yang ada di file tersebut. Penambahan kata model_ adalah wajib.

Lalu perhatikan baris:

            <field name="groups" eval="[(4, ref('group_employee_admin'))]"/>

Angkat 4 adalah wajib, sedangkan group_employee_admin mengacu pada id user group yang baru saja dibuat:

        <record id="group_employee_admin" model="res.groups">
            <field name="name">Admin Karyawan</field>
        </record>

Selamat mencoba.

Referensi: