Odoo Developer uchun Odoo Shell (Dasturchi sifatida bilishingiz kerak)
Odoo Shell: backend ichiga toʻgʻridan-toʻgʻri kirib maʼlumotlarni oʻqish, yaratish, oʻzgartirish va metodlarni tekshirish boʻyicha amaliy qoʻllanma.
Odoo bilan jiddiy ishlayotgan dasturchi payt kelib shuni tushunadi:
Odooʻdagi har bir narsani button, server action yoki API orqali tekshirib oʻtirish — sekin va koʻpincha ortiqcha murakkab boʻladi.
Baʼzan sizga backend ichiga toʻgʻridan-toʻgʻri kirib:
“Backendda nima gaplar oʻzi?”
degan savolga tez javob kerak boʻladi.
Ana shu joyda Odoo Shell oʻzini koʻrsatadi.
Odoo Shell nima?
Odoo Shell — bu Odooʻga ulangan oddiy Python interactive muhit.
Farqi shundaki, u sizga:
- real database
- real modellar
- real biznes logika
bilan bevosita ishlash imkonini beradi.
Hech qanday qoʻshimcha kod yozmasdan, Odoo ichidagi deyarli hamma narsani tekshirib koʻrish mumkin.
Amaliyotda Odoo Shell asosan quyidagilar uchun ishlatiladi:
- test qilish
- debug qilish
- maʼlumotlarni tekshirish
- favqulodda holatlarda dataʼni toʻgʻrilash
Odoo Shellʼga kirish
Shellʼga kirish uchun Odooʻni qaysi konfiguratsiya va qaysi database bilan ishlatayotgan boʻlsangiz, shularni koʻrsatish kifoya.
./odoo-bin shell -c ./conf/odoo.conf -d my_databaseAgar database nomi konfiguratsiya faylida koʻrsatilgan boʻlsa, -d flagni yozmasangiz ham boʻladi.
Shell ochilgandan keyin siz oddiy Python konsolini koʻrasiz, lekin u Odooʻga toʻliq ulangan boʻladi.
Shell ochilganda sizga nima beriladi?
Eng muhim obyekt — bu env.
Aslida, Odoo Shellʼni tushunish — bu****envʼni tushunish degani.
env orqali siz:
- istalgan modelga kira olasiz
- hozirgi foydalanuvchini bilasiz
- contextʼni koʻrasiz
- database bilan ishlaysiz
Misollar
Hozirgi foydalanuvchi:
env.userContextʼni koʻrish:
env.contextMaʼlumotlarni oʻqish (READ)
Oddiy misol. Ismi Asilbek boʻlgan barcha partnerlarni topamiz:
partners = env['res.partner'].search([('name', '=', 'Asilbek')])for p in partners: print(p.id, p.email)Agar faqat bitta yozuv kerak boʻlsa:
partner = env['res.partner'].search([], limit=1)partner.nameBu yerda hech qanday SQL yozilmadi, lekin real databaseʼdan real maʼlumot oʻqildi.
Yozuv yaratish (CREATE)
Shellʼning eng kuchli joylaridan biri — yozuvni toʻgʻridan-toʻgʻri yaratish.
partner = env['res.partner'].create({ 'name': 'Asilbek Test', 'email': 'asilbek@test.com', 'is_company': False,})⚠️ Bu yozuv hali tranzaksiya ichida turadi.
Agar shellʼdan chiqib ketsangiz, yoʻqolib ketishi mumkin.
Maʼlumot saqlanishini xohlasangiz:
env.cr.commit()👉 Mana shu joyda koʻpchilik xato qiladi.
Commit qilmasangiz — oʻzgarish vaqtinchalik boʻladi.
Yozuvni oʻzgartirish (WRITE)
Mavjud yozuvni oʻzgartirish ham juda oson:
partner = env['res.partner'].browse(1)partner.write({ 'email': 'new@email.com'})env.cr.commit()⚠️ browse() notoʻgʻri ID olsa, xatolik bermasligi mumkin.
Shuning uchun har doim natijani tekshirish — yaxshi odat.
Yozuvni oʻchirish (UNLINK)
Shellʼda oʻchirish juda xavfli boʻlishi mumkin. Chunki bu real record oʻchirish.
partner = env['res.partner'].browse(10)partner.unlink()env.cr.commit()❗ Productionʼda buni ishlatishdan oldin ikki marta oʻylang.
Model methodlarini chaqirish
Shell faqat CRUD uchun emas. Siz istalgan model methodini ham chaqira olasiz.
Masalan, sale orderʼni tasdiqlash:
order = env['sale.order'].browse(5)order.action_confirm()env.cr.commit()Bu UIʼda bosilgan “Confirm” tugmasi bilan deyarli bir xil natija beradi.
sudo() va foydalanuvchi bilan ishlash
Koʻp muammo access rights sababli chiqadi. Shellʼda buni tekshirish juda qulay.
env['res.partner'].sudo().search([], limit=5)Yoki admin foydalanuvchi bilan ishlash:
admin_env = env(user=env.ref('base.user_admin'))admin_env['res.partner'].search([], limit=5)Bu orqali muammo kodda ekanmi yoki ruxsatlarda ekanini tez tushunish mumkin.
SQL bilan ishlash (env.cr)
Baʼzi hollarda ORM yetarli boʻlmaydi. Shellʼda SQL ham ishlaydi.
env.cr.execute(""" SELECT id, name FROM res_partner WHERE active = true LIMIT 5""")env.cr.fetchall()Agar SQL orqali maʼlumotni oʻzgartirsangiz:
env.cr.commit()Model strukturasi va fieldlar
Model qanday fieldlardan iboratligini tez koʻrish mumkin:
env['res.partner'].fields_get().keys()Bitta field haqida batafsil maʼlumot:
env['res.partner'].fields_get(['email'])Bu ayniqsa yangi modul yoki begona model bilan ishlaganda juda foydali.
Context bilan ishlash
Context koʻp narsani oʻzgartiradi:
- til
- timezone
- active_id va boshqalar
Tilni tekshirish:
env.context.get('lang')Boshqa til bilan ishlash:
new_env = env(context=dict(env.context, lang='uz_UZ'))Debug uchun foydali tekshiruvlar
Model mavjudmi?
env['ir.model'].search([('model', '=', 'res.partner')])Tizimdagi barcha modellar:
env.registry.models.keys()Viewʼlarni tekshirish:
env['ir.ui.view'].search([('model', '=', 'res.partner')])env.cr.commit() haqida muhim haqiqat
Shell ichida create, write, unlink qilsangiz,
lekin****env.cr.commit() chaqirmasangiz — oʻzgarishlar vaqtinchalik boʻladi.
Shell yopilganda ular bekor qilinadi.
Lekin commit qilish ham har doim toʻgʻri emas. Chunki commit — bu qaytmas qaror. Ayniqsa production muhitda.
Asosiy qoida
Nima qilayotganingizni aniq tushunmasangiz — commit qilmang.
Kamina kamtarin,
Bahrom Najmiddinov