Memasang Odooo pada windows 10 seperti layaknya Memakai odoo di ubuntu

Memasang Odooo pada windows 10 seperti layaknya Memakai odoo di ubuntu

Download materialnya

odoo = git clone https://github.com/odoo/odoo --dep 13(versionya) 

postgresql = https://www.postgresql.org/download/

python 3.8 = https://www.python.org/downloads/release/python-380/


setelah semua terbuat buatlah virtual environment pythonya sembari membuat install postgresql nya

cek dulu pemanggilan python menggunakan apa,



install environmentnya di folder yg anda inginkan misalnya Document lalu odoo

pasang pip nya 

py -m pip install --upgrade pip
lihat versionya
py -m pip --version
seharusnya seperti ini tampilanya (sesuai versi)
pip 21.1.3 from c:\python39\lib\site-packages (Python 3.9.4)
lalu install virtualenv nya

py -m pip install --user virtualenv

setelah terinstall maka pasang env nya

py -m venv env

env dibelakang boleh diganti sesuai selera / penamaan env kalian

aktifkan env kalian dengan cara

masuk ke venv kalian lalu ke Script lalu ketik activate.bat

atau

.\env\Scripts\activate
dan untuk nonaktifkanya 
ketik deactivate saja

setelah selesai dengan urusan environment kalian bisa ke environment dari windows

dengan cara

Enter





Double klik lalu klik new

lalu tambahkan kesitu path dari postgresql nya dan path pythonya

Cara cari path postgresqlnya adalah saat menginstall biasanya ada tulisan foldernya

atau defaultnya akan kesini

C:\Program Files\PostgreSQL\13\bin

paste itu di path

lalu cari file pythonya jika kalian gatau maka ketik apps saja



lalu cari python3nya klik modify -> yes -> modify




klik yang pip next lalu 


Kalau tidak bisa di copy maka menuju kesana melalui libraries/File Exploler windows

pastekan lagi di path tadi sehingga menjadi 


Lalu klik ok ok

setelah selesai pasang config di instalasi odoo kalian agar tidak usah keluar path

dengan dalam conf seperti berikut


[options]

addons_path = c:\users\isd\documents\odoo\odoo13\addons,c:\users\isd\documents\odoo\odoo13\odoo\addons

;admin_passwd = $pbkdf2-sha512$25000$ZGzNmTMG4HxvDSHk/P8/Rw$Y/UQy1hgB7XjbhvFY6i2nh92x3b2gT6StnipR/V/UvR5HJpxczsIcnQ0P4MsbwH2mEKsS66T9CxlYTHUOiCoWw

csv_internal_sep = ,

data_dir = c:\users\isd\appdata\local\openerp s.a\odoo

db_host = False

db_maxconn = 64

db_name = False

db_password = 

db_port = 5432

db_sslmode = prefer

db_template = template0

db_user = syaiful

dbfilter = 

demo = {}

email_from = False

from_filter = False

geoip_database = c:\usr\share\geoip\geolite2-city.mmdb

gevent_port = 8072

http_enable = True

http_interface = 

http_port = 8030

import_partial = 

limit_memory_hard = None

limit_memory_soft = None

limit_request = None

limit_time_cpu = None

limit_time_real = None

limit_time_real_cron = None

list_db = True

log_db = False

log_db_level = warning

log_handler = :INFO

log_level = info

logfile = 

max_cron_threads = 2

osv_memory_age_limit = False

osv_memory_count_limit = 0

pg_path = 

pidfile = 

proxy_mode = False

reportgz = False

screencasts = 

screenshots = c:\users\isd\appdata\local\temp\odoo_tests

server_wide_modules = base,web

smtp_password = False

smtp_port = 25

smtp_server = localhost

smtp_ssl = False

smtp_ssl_certificate_filename = False

smtp_ssl_private_key_filename = False

smtp_user = False

syslog = False

test_enable = False

test_file = 

test_tags = None

transient_age_limit = 1.0

translate_modules = ['all']

unaccent = False

upgrade_path = 

websocket_keep_alive_timeout = 3600

websocket_rate_limit_burst = 10

websocket_rate_limit_delay = 0.2

without_demo = False

workers = None

x_sendfile = False


untuk db_password adalah pasword postgresql kalian

dan untuk db_port biasanya port default postgresql kalian yaitu 5432

atau kalian bisa buka pgadmin kalian dan masukan pasword postgres kalian


untuk path odoo kalian harus ke FILE INSTALASI GITHUB ODOO nya dan harus ada 2 addons yg terpasang di pathnya yg pertama mengarah kesini



yg kedua mengarah kesini


PERHATIKAN baik baik 2 path berbeda teliti lagi dan masukan ke path dari confnya

addons_path = c:\users\isd\documents\odoo\odoo13\addons,c:\users\isd\documents\odoo\odoo13\odoo\addons

ada 2 dipisahkan dengan KOMA

Setelah semuanya siap maka install requirementsnya (env harus sudah aktif)

ke odoo nya lalu ketik

Harus menuju ke folder instalasi github
setelah selesai terinstall maka jalankan dengan cara


Jika sudah ada nama portnya maka tiggal ke browser ketik localhost:8030
maka odoo anda berhasil berjalan....


Membuat Button invisible and non invisible ketika boolean pada tree view default odoo di klik (Odoo-JS)

Membuat Button invisible and non invisible ketika boolean pada tree view default odoo di klik (Odoo-JS)

 Jadi saya ingin menambahkan action button yang bisa hide dan non hide seperti action

semula seperti ini


menjadi mengikuti ini saat di centang


Pertama buat button pemanggilnya dahulu dengan xml

dengan membuat folder baru didalam model yg kita punya dengan susunan

static/src/xml/(namafile).xml dan berisikan code sebagai berikut :

dengan code :

<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">

    <t t-extend="ListView.buttons">
        <t t-jquery="div.o_list_buttons" t-operation="append">


            <t t-if = "widget.modelName == 'fjb.spk.transfer'">
                <button type="button" class="btn-primary o_finger_consume_spk_generate">
                    CONSUME PALLETS
                </button>
            </t>
        </t>
    </t>

</templates>

dengan pembacaan tambahkan button dan t-if berfungsi sebagai
jika model tersebut bernama fjb.spk.transfer maka munculkan buttonya

setelah itu pada view tambahkan/ panggil file yang ada di static di manifest dengan memanggil qweb
sebagai berikut
'qweb': ['static/src/xml/consume_button.xml'],

setelah itu terjadi maka button akan muncul namun belum dengan kondisi seperti action


Lalu kita buat file JavaScript nya

pada folder static/src tambahkan folder js sepert pada gambar diatas dan tambahkan 
(nama_file).js
lalu masukan code :
odoo.define('sas_finger_joint.condition_button', function (require) {
    "use strict";

});

Ini adalah code pemanggilan default yang harus dilakukan pada framework odoo
dengan pembacaan setelah define adalah ('nama_model.namafile(tanpa .js))
lalu masukan code default didalam odoo define
menjadi seperti berikut :
odoo.define('sas_finger_joint.condition_button', function (require) {
    "use strict";

    var core = require('web.core');
    var ListController = require("web.ListController");
    var ListRenderer = require('web.ListRenderer');
    var _lt = core._lt;

    ListController.include({
        renderButtons: function () {
            this._super.apply(this, arguments);
            // this.onCheckboxChange();
            console.log("Kita akan melakukan eksekusi")
        },

       
    });
});
console.log adalah cara kita melihat apakah file js yang kita inputkan berhasil

setelah terbuat maka tambahkan / panggil file JS kita pada menu xml pada views disini saya menggunakan menu delete karena agar tidak kebanyakan file xml
tambahkan code berikut :
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <data>
        <!-- button consume JS calling -->
        <template id="assets_backend_inherit_consume_fj" inherit_id="web.assets_backend" name="mrp_execution_listview_button">
            <xpath expr="script[last()]" position="after">
                <script type="text/javascript" src="/sas_finger_joint/static/src/js/condition_button.js"></script>
            </xpath>
        </template>

    </data>
</odoo>

jalan lupa panggil di xmlnya untuk pada views nya

setelah terbuat lakukan restart server dan reload page nya
dan buka inspect element pada browser kesayangan kalian

dan pada bagian console maka akan muncul pemanggilan console.log yang tadi terbuat
Jika seperti itu tandanya file JS yang dibuat kita berhasil ditambahkan kedalam odoo selanjutnya tinggal kita lakukan eksekusi apa didalam file.js yg dibuat

Langsung kita eksekusi untuk tujuan utama kita yaitu membuat file consume pallets tersebut menjadi tidak muncul dan muncul
sebelumnya kita tambahkan kelas o_hidden (kelas default) untuk hide odoo pada xml buttonya menjadi seperti ini

Sehingga secara default tombol kita akan tersembunyi terlebih dahulu
lakukan restart dan reload maka tombol consumes akan menghilang
Jika sudah seperti berikut maka selanjutnya kita akan bermain di JS nya
disini saya akan menambahkan 1 function dan melihat apakah fungsi yang saya buat masuk bernama cekSelector sehingga menjadi seperti ini pada file JS nya

odoo.define('sas_finger_joint.condition_button', function (require) {
    "use strict";

    var core = require('web.core');
    var ListController = require("web.ListController");
    var ListRenderer = require('web.ListRenderer');
    var _lt = core._lt;

    ListController.include({
        renderButtons: function () {
            this._super.apply(this, arguments);
            // this.onCheckboxChange();
            console.log("Kita akan melakukan eksekusi")
            this.cekSelectorChange();
        },

        cekSelectorChange: function() {
            console.log("Fungsi Cek Selector Change berhasil terbuat")
        },

       
    });
});

seperti biasa lakukan reload(restart dan load page)



Fungsi berhasil masuk selanjutnya kita mainkan fungsi yang sudah terbuat tersebut,
disini kita menggunakan library jquery by odoo nya,. 
karena saya ingin tombol tersebut hide dan unhide ketika terchecklist maka kita harus lihat dulu elemen apakah yang terlibat kedalam checkbox tersebut dengan cara lihat elements nya

Disini saya menemukan elemen tersebut dengan nama dikedua elemen tersebut dengan nama class o_list_record_selector selanjutnya tinggal kita panggil elemen tersebut di JS kita lakukan alert atau debug console.log bebas sesuka hati kalian agar melihat apakah condition yang dibuat berjalan atau tidak

Back To File JS nya maka kita panggil file jquery dengan cara
cekSelectorChange: function() {
            $(document).ready(function() {
               
                $(".o_list_record_selector input[type='checkbox']").on('change', onCheckboxChange);
            });
        },
dengan pembacaan jquery document tolong panggilkan saya elemen dengan kelas o_list_record_selector ketika dia input bertype checkbox saat melakukan on change / perubahan maka jalankan fungsi onCheckboxChange

kita buat fungsi tersebut didalam functionnya atau diatasnya dengan coding
cekSelectorChange: function() {
            $(document).ready(function() {
                function onCheckboxChange(ev) {
                    if (ev.target.checked) {
                        console.log("Terceklis")
                        alert("Kondisi ini terceklis")
                    } else {
                        console.log("Kondisi tidak terceklis")
                        alert("Kondisi ini tidak terceklis gays")
                    }
                }
                $(".o_list_record_selector input[type='checkbox']").on('change', onCheckboxChange);
            });
        },

dengan menggunakan e prevent default dengan pembacaan
jika button tersebut mempunyai target tercek maka keluarkan debug dan alert Terceklis / kondisi ini terceklis jika tidak maka tidak terceklis

reload lagi lalu lakukan testing

Jika kita Ok maka
Maka kondisi akan terceklis begitupun ketika kita uncheck
Maka kondisi tidak terceklis jika di ok
Nah seperti itu artinya kondisi yang kita inginkan sudah terpenuhi tinggal kita lakukan eksekusi / penerapan pada buttonya pada file JS tambahkan atau ganti menjadi seperti ini:
cekSelectorChange: function() {
            $(document).ready(function() {
                function onCheckboxChange(ev) {
                    if (ev.target.checked) {
                        var $consumeButton = $('.o_finger_consume_generate');
                        if ($consumeButton) {
                            $consumeButton.removeClass('o_hidden');
                        }
                    } else {
                        var $consumeButton = $('.o_finger_consume_generate');
                        if ($consumeButton) {
                            $consumeButton.addClass('o_hidden');
                        }
                    }
                }
                $(".o_list_record_selector input[type='checkbox']").on('change', onCheckboxChange);
            });
        },

Dengan artian didalam kondisi adalah sebagai berikut
karena kita tadi punya kelas o_hidden
code pertama dibaca
var $consumeButton = $('.o_finger_consume_generate');
jquery tolong carikan saya kelas .o_finger_consume_generate dan simpan pada variabel $consumeButton
lalu lakukan kondisi 
if ($consumeButton) {
                            $consumeButton.removeClass('o_hidden');
                        }
Jika ketemu maka pada variabel yang tersimpan dengan kelas tersebut lakukan remove/hapus kelas o_hiddenya

lakukan reload maka hasilnya akan

dan jika kita uncheck maka

Nah jadi itu sudah berhasil ya temen temen semuanya. selanjutnya lakukan fungsi untk tombol kalian ketika di klik akan diapakan.
sampai bertemu kembali
tidak usah skip iklan karena bukan yutub..
Like jika kalian suka dislike jika tidak suka 
komen jika ada pertanyaan 
Sekian dan Salam Sekilas Tutorial

Error Request no attribute 'app'

Error Request no attribute 'app'

 Eror dari template module tambahan saat load modul awalan


saat mengalami eror ini adalah si odoo tidak bisa load template dari module tambahan restore db yang diberikan
kita hanya mengubah file conf ataupun menambah path ke odoo aslinya untuk bisa membaca load dari module yang sudah dibuat

dengan cara buka file config dari odoo yang kita jalankan lalu,


Tambahkan path tujuan odoo awal load + module tambahanya untuk bisa membaca controler dari template module tambahan yang di restore db nya.

ubah juga db template menjadi

db_template = template0

lalu save dan jalankan odoo kembali seperti biasanya menjalankan odoo

maka hasilnya odoo sudah bisa masuk kembali dan bisa membaca module tambahan yang sudah ditambahkan juga membaca restore db nya...


 

 





Mengambil submenu di menu item lain dan menghilangkan menu item yg diambil (By Pak Tio.)

Mengambil submenu di menu item lain dan menghilangkan menu item yg diambil (By Pak Tio.)

Memindahkan menuitemlain ke menu item pilihan

Misalnya menu job order akan dimasukan kedalam sub menu didalam maintenance


Dilakukan dengan mengubah didalam UI terlebih dahulu

dengan cara ke menu setting > menu item

lalu dalam pencarian cari kata kunci atau menu yg ingin dituju misal maintenance


Lalu coba duplicate, klik salah satu dati maintenance/request (misal) karena saya ingin taruh dibawah request


Lalu ubah nama menu dan action nya bagian kanan dengan keterangan carilah String pada field yg mau diambil

misal Job Order yg mau diambil maka Job order yg dipilih



contoh String nama di pojok kiri atas


Lalu jika sudah maka buka atau refresh kembali ke maintenance maka akan bertambah sub menu seperti ini


dan apabila di klik maka sub menu yg ada di menuitem job order akan terpanggil menjadi seperti ini


Namun ini jika online masih belum benar karena ini hanya di local saja untuk mengubahnya
untuk online maka pada codingan harus diubah, dengan mencari id ataupun string dari model yg Job order tsb lalu cari menu rootnya atau parent aslinya, jika sudah ketemu maka tambah dengan cara

<menuitem id="custome_job_orders_menu_maintenance"
sequence="1" parent="maintenance.menu_m_request"
name="Job Orders" action='custom_wo_action_website_job_workorder_request'/>

dengan ketentuan id nya membuat sendiri dan sequecenya adalah urutan dari submenunya apabila kita clone dari request tadi maka sequence 1 adalah dibawah dari request dan name nya adalah string yg diatas lalu actionnya adalah menu untuk tujuan action ke job string tadi lalu parent nya ke menu maintenance tadi

dan tambahkan juga depends di manifestnya ke maintenance menjadi


maka pada xml menjadi seperti berikut


Lalu restart server dan upgrade module
maka akan menjadi


Maka sudah terinclude di setelah Job Order yaitu Job Orders Sesuai string dari codinganya.

Menghapus MenuItemnya

Menu item ini

Hilangkan dengan cara memberikan comand sehingga menjadi tidak terpanggil menu items yg ada di apps
dengan cara

lakukan restart server dan upgrade dan maka menu items Job Order tidak akan terlihat lagi di bar apps.



<Tutorial ini telah disetujui untuk dipublish, oleh Bp yudisthio ()>
Membuat bagian Suplier

Membuat bagian Suplier


Sama seperti membuat models diawal pada odoo bagi yang belum lihat bisa lihat lagi

Atau bisa kita ulang kembali membuat models baru di odoo (test) tutor ini tidak lengkap sehingga bisa memunculkan atau mengulang kembali yg telah dipelajari.

 Buat folder suplier.py didalam models dan tambahkan di init

buat oomodel
class model.technical.name(models.Model):
_name = 'model.technical.name'
_description = 'model.technical.name'
yang nantinya akan diisi dengan
class suplier(models.Model):
_name = 'stylerent.suplier'
_description = 'Data Suplier'

Mengingat kembali bahwa bagian _name ini penting karena nanti berkaitan untuk ke xml dan lainya jadi mudahkan namanya
lalu tambahkan field field yang akan muncul nantinya oofield
sehingga menjadi
name = fields.Char(string='Nama Suplier')
cp = fields.Char(string='Contact Person')
alamat = fields.Char(string='Alamat Suplier')
telp = fields.Char(string='No telefon')
atau kalian bisa tambahkan lainya jika menginginkanya
lalu tambahkan dipaling atas
from odoo import api, fields, models
untuk bisa membaca fields fields dan models nya jangan lupa tambahkan ke __init__.py di models dengan nama suplier.py

Buat xml nya dengan stylerent_pembelian.xml (bebas)

Dalam xml ini maka kita perlu isi apa saja yang ada didalam webnya saat diakses nantinya dengan struktur yang ada didalam odoo dan didalam data
  • Tree View (ootree) = saat ditampilan luar
  • Form View (oform) = saat diklik dan muncul form
  • Action (oact) = untuk menjalankan singkronasi py dan database
  • menuitem (menuitem) = untuk membuat menu atau icon di dalam model
Penjelasan tiap struktur
    1. dengan ootree atau bisa dengan code
<!-- suplier tree view -->
<record id="model_stylerent_suplier_view_tree" model="ir.ui.view">
<field name="name">stylerent.suplier.view.tree</field>
<field name="model">stylerent.suplier</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="alamat"/>
</tree>
</field>
</record>
dimana record id akan merekam dan _name_ ubah dengan _name yg ada di py tujuan
field name dan field model juga harus sesuai dengan yg nantinya akan di ir.acces untuk field name sesuaikan dengan name.view.tree 
lalu untuk field fieldnya bisa ditulis atau dipanggil field yg sudah dibuat di suplier.py

    2. dengan ooform atau bisa dengan source
<!-- suplier form view -->
<record id="model_stylerent_suplier_view_form" model="ir.ui.view">
<field name="name">stylerent.suplier.view.form</field>
<field name="model">stylerent.suplier</field>
<field name="arch" type="xml">
<form string="Form Suplier">
<sheet>
<group>
<group colspan='4'>
<group colspan='2'>
<separator string="Data Suplier"/>
<field name="name"/>
<field name="cp"/>
</group>
</group>
</group>
</sheet>
</form>
</field>
</record>
dimana penjelasanya sama dengan diatas  dan groupnya memiliki 2 atau 3 dengan lebar yang berbeda beda sehingga bisa merapihkan dari form yang nantinya akan dibuat dan separator berfungsi untuk Batas judul sebelum fieldpython ditaruh

    3. dengan oact atau bisa dengan source code
<!-- suplier action window -->
<record id="model_stylerent_suplier_action" model="ir.actions.act_window">
<field name="name">Suplier</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">stylerent.suplier</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
diisi
</p><p>
<!-- More details about what a user can do with this object will be OK -->
</p>
</field>
</record>

dimana penjelasanya adalah model_name(sama dengan nanti yg akan ada di ir.acces)
name adalah nama dari actionya 
res_model adalah sama dengan ir.acces dan form yg ada di tree,form itu dihapus saja karena sudah ada form diatas sebelum act
content_create (diisi) itu untuk pemberitahuan apabila form masih kosong

    4. menuitem source code
<menuitem id="stylerent_pembelian_menu_act"
name="Suplier"
parent="stylerent_pembelian_menu_categ"
action="model_stylerent_suplier_action"
sequence="13"/>
dengan penjelasan menuitem id adalah hanya untuk pemberitahuan id dari menuitem
name= adalah untuk penamaan di menu web nantinya
parent adalah orangtua atau tujuan dari action ini 
akan ikut yg mana? atau bisa diikutin ke parent logo jadi nanti akan disebelah dari logo 
actionya ini harus sama dengan record id yg ada di menuact sequence nya bebas

Tambahkan di menu.xml apabila parent tidak ikut ke sebelah logo

buat menuitem dipaling bawah (masih dalam odoo dan data)
<menuitem id="stylerent_pembelian_menu_categ"
name="Pembelian"
parent="stylerent_menu_root"
sequence="40"/>
dengan penjelasan id ini adalah yg nantinya akan menjadi parent dari form xml yg dibuat diatas
dan name adalah menu yg ditunjukan nantinya
parent adalah icon pengikut dari icon yg nantinya akan dibuat parent ini biasanya diikutkan di logo, sequence biasanya bersifat urutan menu yg akan ditampilkan makin besar angkanya maka akan semakin kanan

Tambahkan acces di security

Seperti dipenjelasan membuat model maka jika ada form baru atau menu baru maka diharuskan memberikan acces untuk ke database dan juga acces untuk admin maka dari itu bisa ditambahkan

access_stylerent_suplier,access.stylerent.suplier,model_stylerent_suplier,,1,1,1,1

dengan mode yg harus sama name yg ada di py dan name yg sudah dijelaskan diatas

Tambahkan xml yg ada di manifest.py

untuk file stylerent_pembelian.xml agar muncul maka harus di kasih tau di manifest atau didaftarkan
dengan menambah
'views/stylerent_pembelian.xml'
pada data di manifest

Restart server dan upgrade apabila berhasil maka akan menjadi
tree : yg diatas adalah menuitem yg sudah dijelaskan

Oform :

menu pembelian berhubungan dengan alat yg disediakan suplier untuk dibeli maka dari itu untuk alat atau bahan yg dibeli bisa dibuat sendiri