کسٹم Odoo ماڈیولز کیسے بنائیں: OWL، ORM اور وراثت کے لیے ایک ڈویلپر گائیڈ
جب Odoo کے 82 آفیشل ماڈیولز اور 40,000+ کمیونٹی ماڈیولز آپ کی درست کاروباری ضروریات کو پورا نہیں کرتے ہیں، تو حسب ضرورت ماڈیول کی ترقی اس خلا کو پُر کرتی ہے۔ یہ گائیڈ 2026 میں Odoo ماڈیولز کی تعمیر کے بنیادی اصولوں کا احاطہ کرتا ہے، بشمول ماڈیول کا ڈھانچہ، OWL فرنٹ اینڈ فریم ورک، ORM پیٹرن، وراثت کے طریقہ کار، اور OCA (Odoo Community Association) کے رہنما خطوط کے ساتھ منسلک بہترین طرز عمل۔
کسٹم اوڈو ماڈیول کیا ہے؟
A کسٹم Odoo ماڈیول Python بیک اینڈ لاجک، XML ویو ڈیفینس، JavaScript فرنٹ اینڈ اجزاء، اور حفاظتی اصولوں کا ایک خود ساختہ پیکیج ہے جو Odoo کی فعالیت کو بڑھاتا ہے۔ ماڈیول مکمل طور پر نئی خصوصیات شامل کر سکتے ہیں، موجودہ رویے میں ترمیم کر سکتے ہیں، یا Odoo کو بیرونی نظاموں کے ساتھ مربوط کر سکتے ہیں۔ اوڈو کا ہر ٹکڑا بذات خود ایک ماڈیول ہے، جو فن تعمیر کو فطری طور پر قابل توسیع بناتا ہے۔
ماڈیول ڈائرکٹری کا ڈھانچہ
ایک اچھی طرح سے منظم ماڈیول اس معیاری ڈھانچے کی پیروی کرتا ہے:
my_custom_module/
├── __init__.py # Python package init
├── __manifest__.py # Module metadata and dependencies
├── models/
│ ├── __init__.py
│ └── my_model.py # Business logic and data models
├── views/
│ ├── my_model_views.xml # Form, tree, and kanban views
│ └── menu.xml # Menu items and actions
├── security/
│ ├── ir.model.access.csv # Access control list
│ └── security.xml # Record rules and groups
├── data/
│ └── data.xml # Default data records
├── static/
│ └── src/
│ ├── js/ # OWL components
│ ├── css/ # Stylesheets
│ └── xml/ # QWeb templates
├── wizard/ # Transient models for wizards
├── reports/ # QWeb report templates
└── tests/ # Unit tests
مینی فیسٹ فائل
__manifest__.py فائل آپ کے ماڈیول کی شناخت کی وضاحت کرتی ہے:
{
'name': 'My Custom Module',
'version': '18.0.1.0.0',
'category': 'Custom',
'summary': 'Short description of what the module does',
'description': """
Long description with details about
features and configuration.
""",
'author': 'ECOSIRE',
'website': 'https://ecosire.com',
'license': 'LGPL-3',
'depends': ['base', 'sale', 'stock'],
'data': [
'security/ir.model.access.csv',
'views/my_model_views.xml',
'views/menu.xml',
'data/data.xml',
],
'assets': {
'web.assets_backend': [
'my_custom_module/static/src/js/**/*',
'my_custom_module/static/src/css/**/*',
'my_custom_module/static/src/xml/**/*',
],
},
'installable': True,
'application': False,
'auto_install': False,
}
ورژن کنونشن: {odoo_version}.{major}.{minor}.{patch} (مثال کے طور پر، 18.0.1.0.0)۔
ORM کے ساتھ کام کرنا
Odoo's Object-Relational Mapping (ORM) تمام بیک اینڈ ڈیولپمنٹ کی بنیاد ہے۔ ماڈلز ڈیٹا بیس ٹیبلز پر نقشہ بناتے ہیں، اور ORM CRUD آپریشنز، کمپیوٹیڈ فیلڈز، رکاوٹیں، اور ورک فلو مینجمنٹ فراہم کرتا ہے۔
ماڈل کی تعریف
from odoo import models, fields, api
class ProjectTask(models.Model):
_name = 'my_module.task'
_description = 'Project Task'
_order = 'priority desc, create_date desc'
name = fields.Char(string='Task Name', required=True)
description = fields.Html(string='Description')
state = fields.Selection([
('draft', 'Draft'),
('in_progress', 'In Progress'),
('done', 'Done'),
('cancelled', 'Cancelled'),
], default='draft', tracking=True)
assigned_to = fields.Many2one('res.users', string='Assigned To')
deadline = fields.Date(string='Deadline')
priority = fields.Selection([
('0', 'Normal'),
('1', 'Important'),
('2', 'Urgent'),
], default='0')
tag_ids = fields.Many2many('my_module.tag', string='Tags')
progress = fields.Float(compute='_compute_progress', store=True)
فیلڈ کی اقسام کا حوالہ
| فیلڈ کی قسم | ازگر کی قسم | کیس استعمال کریں | |---|---|---| | چار | str | مختصر متن (نام، حوالہ) | | متن | str | طویل سادہ متن | | ایچ ٹی ایم ایل | str | بھرپور متن کا مواد | | عدد | int | پورے نمبر | | فلوٹ | فلوٹ | اعشاریہ نمبر | | بولین | bool | سچے/جھوٹے جھنڈے | | تاریخ | تاریخ | وقت کے بغیر تاریخ | | تاریخ وقت | تاریخ وقت | وقت کے ساتھ تاریخ | | انتخاب | str | ڈراپ ڈاؤن انتخاب | | Many2one | int | ایک ریکارڈ کا لنک | | One2many | فہرست | Many2one کے ریورس | | Many2many | فہرست | متعدد ریکارڈز سے لنک | | بائنری | بائٹس | فائل اٹیچمنٹ |
حسابی فیلڈز اور رکاوٹیں۔
@api.depends('subtask_ids.state')
def _compute_progress(self):
for task in self:
total = len(task.subtask_ids)
done = len(task.subtask_ids.filtered(
lambda t: t.state == 'done'
))
task.progress = (done / total * 100) if total else 0
@api.constrains('deadline')
def _check_deadline(self):
for task in self:
if task.deadline and task.deadline < fields.Date.today():
raise ValidationError(
"Deadline cannot be in the past."
)
وراثت کا طریقہ کار
Odoo تین قسم کی وراثت فراہم کرتا ہے، ہر ایک مختلف مقصد کی خدمت کرتا ہے:
1. کلاس وراثت (توسیع)
فیلڈز یا اوور رائیڈنگ طریقوں کو شامل کرکے موجودہ ماڈل کو بڑھائیں۔ یہ سب سے عام پیٹرن ہے.
class SaleOrderExtend(models.Model):
_inherit = 'sale.order'
custom_reference = fields.Char(string='Custom Ref')
approved_by = fields.Many2one('res.users')
def action_confirm(self):
# Add custom logic before standard confirmation
for order in self:
if order.amount_total > 10000 and not order.approved_by:
raise UserError("Orders over $10,000 require approval.")
return super().action_confirm()
2. پروٹو ٹائپ وراثت
ایک نیا ماڈل بنائیں جو موجودہ ماڈل سے تمام فیلڈز اور طریقوں کو کاپی کرے۔
class CustomPartner(models.Model):
_name = 'my_module.partner'
_inherit = 'res.partner' # Copies structure
_description = 'Custom Partner'
3. وفد کی وراثت
ایک نیا ماڈل بنائیں جو ایک Many2one لنک کے ذریعے موجودہ ماڈل کو پیش کرے۔ پیرنٹ ماڈل کے فیلڈز چائلڈ ماڈل پر شفاف طور پر ظاہر ہوتے ہیں۔
class LibraryMember(models.Model):
_name = 'library.member'
_inherits = {'res.partner': 'partner_id'}
partner_id = fields.Many2one('res.partner', required=True,
ondelete='cascade')
membership_date = fields.Date()
member_number = fields.Char()
OWL فریم ورک (فرنٹ اینڈ)
Odoo 18 اپنے فرنٹ اینڈ فریم ورک کے طور پر OWL (Odoo Web Library) کا استعمال کرتا ہے۔ OWL ایک جزو پر مبنی فریم ورک ہے جو React یا Vue کی طرح ہے لیکن خاص طور پر Odoo کی ضروریات کے لیے ڈیزائن کیا گیا ہے۔
بنیادی OWL جزو
/** @odoo-module */
import { Component, useState } from "@odoo/owl";
import { registry } from "@web/core/registry";
class TaskDashboard extends Component {
static template = "my_module.TaskDashboard";
setup() {
this.state = useState({
tasks: [],
filter: 'all',
});
this.loadTasks();
}
async loadTasks() {
this.state.tasks = await this.env.services.orm.searchRead(
"my_module.task",
[["state", "!=", "cancelled"]],
["name", "state", "assigned_to", "deadline"]
);
}
get filteredTasks() {
if (this.state.filter === 'all') return this.state.tasks;
return this.state.tasks.filter(
t => t.state === this.state.filter
);
}
}
QWeb ٹیمپلیٹ (XML)
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="my_module.TaskDashboard">
<div class="o_task_dashboard">
<div class="task-filters">
<button t-on-click="() => state.filter = 'all'">All</button>
<button t-on-click="() => state.filter = 'in_progress'">
In Progress
</button>
</div>
<div class="task-list">
<t t-foreach="filteredTasks" t-as="task" t-key="task.id">
<div class="task-card">
<span t-esc="task.name"/>
</div>
</t>
</div>
</div>
</t>
</templates>
سیکیورٹی کنفیگریشن
ہر ماڈل کو واضح رسائی کے قواعد کی ضرورت ہوتی ہے۔ ان کے بغیر، کوئی صارف ماڈل کے ڈیٹا تک رسائی حاصل نہیں کر سکتا۔
رسائی کنٹرول لسٹ (ir.model.access.csv)
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_task_user,task.user,model_my_module_task,base.group_user,1,1,1,0
access_task_manager,task.manager,model_my_module_task,my_module.group_manager,1,1,1,1
ریکارڈ کے قواعد (security.xml)
<record id="task_own_rule" model="ir.rule">
<field name="name">Own Tasks Only</field>
<field name="model_id" ref="model_my_module_task"/>
<field name="domain_force">
[('assigned_to', '=', user.id)]
</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
اپنے ماڈیول کی جانچ کرنا
Odoo مخصوص ٹیسٹ کلاسز کے ساتھ unittest فریم ورک کا استعمال کرتے ہوئے Python یونٹ ٹیسٹ کی حمایت کرتا ہے:
from odoo.tests.common import TransactionCase
class TestTask(TransactionCase):
def setUp(self):
super().setUp()
self.task = self.env['my_module.task'].create({
'name': 'Test Task',
'state': 'draft',
})
def test_task_creation(self):
self.assertEqual(self.task.state, 'draft')
self.assertEqual(self.task.progress, 0)
def test_deadline_constraint(self):
with self.assertRaises(ValidationError):
self.task.write({
'deadline': fields.Date.subtract(
fields.Date.today(), days=1
),
})
اس کے ساتھ ٹیسٹ چلائیں: odoo-bin -d test_db --test-enable -i my_custom_module --stop-after-init
اکثر پوچھے گئے سوالات
س: کسٹم اوڈو ماڈیول بنانے میں کتنا وقت لگتا ہے؟ سادہ ماڈیولز (نئے فیلڈز، بنیادی نظارے) میں 1-3 دن لگتے ہیں۔ اعتدال پسند ماڈیولز (نئے ماڈل، ورک فلو، رپورٹس) میں 1-3 ہفتے لگتے ہیں۔ پیچیدہ ماڈیولز (ملٹی ماڈل سسٹمز، بیرونی انضمام، حسب ضرورت OWL اجزاء) میں 4-12 ہفتے لگتے ہیں۔ ایسے کاروباروں کے لیے جنہیں حسب ضرورت ماڈیولز کی ضرورت ہے لیکن اندرون ملک Odoo ڈویلپرز کی کمی ہے، ہماری ٹیم سے ایک تجربہ کار Odoo ڈویلپر کی خدمات حاصل کریں۔
س: کیا مجھے کور اوڈو کوڈ میں ترمیم کرنی چاہیے یا الگ ماڈیول بنانا چاہیے؟ ہمیشہ ایک الگ ماڈیول بنائیں۔ کور کوڈ میں ترمیم کرنے سے اپ گریڈیبلٹی ٹوٹ جاتی ہے اور ورژن اپ ڈیٹس کے دوران انضمام کے تنازعات پیدا ہوتے ہیں۔ اپنے حسب ضرورت ماڈیول سے موجودہ ماڈلز اور آراء کو بڑھانے کے لیے وراثت کا استعمال کریں۔
س: OCA کے رہنما خطوط کیا ہیں؟ Odoo Community Association (OCA) ماڈیول کے معیار کے لیے کوڈنگ کے معیارات شائع کرتی ہے، بشمول نام دینے کے کنونشن، دستاویزات کے تقاضے، ٹیسٹ کوریج کی توقعات، اور کوڈ طرز کے اصول۔ OCA کے رہنما خطوط پر عمل کرنا یقینی بناتا ہے کہ آپ کا ماڈیول برقرار رکھنے کے قابل اور وسیع تر کمیونٹی ایکو سسٹم کے ساتھ مطابقت رکھتا ہے۔
پیشہ ورانہ مدد حاصل کرنا
اپنی مرضی کے مطابق Odoo ماڈیولز بنانے کے لیے Python، JavaScript، PostgreSQL، اور Odoo کے فریم ورک کنونشنز میں مہارت درکار ہوتی ہے۔ چاہے آپ کو ایک سادہ فیلڈ ایکسٹینشن کی ضرورت ہو یا ایک پیچیدہ ملٹی ماڈیول سسٹم کی، ECOSIRE کی Odoo حسب ضرورت خدمات OCA معیارات کے مطابق پروڈکشن کے لیے تیار ماڈیول فراہم کرتی ہے۔
ہم سے رابطہ کریں اپنی مرضی کے ماڈیول کی ضروریات پر بات کرنے اور ترقی کا تخمینہ حاصل کرنے کے لیے۔
تحریر
ECOSIRE Research and Development Team
ECOSIRE میں انٹرپرائز گریڈ ڈیجیٹل مصنوعات بنانا۔ Odoo انٹیگریشنز، ای کامرس آٹومیشن، اور AI سے چلنے والے کاروباری حل پر بصیرت شیئر کرنا۔
متعلقہ مضامین
Amazon.de Odoo Integration: Selling on Germany's Largest Marketplace with Odoo ERP
How to integrate Amazon.de with Odoo ERP for the German market. Covers FBA Germany, Pan-European fulfillment, German VAT, VerpackG compliance, and settlement reconciliation.
Entering the German eCommerce Market with Odoo: Step-by-Step Guide for International Sellers
Complete guide for international sellers entering the German eCommerce market. Covers market analysis, legal requirements, VAT registration, marketplace selection, and Odoo ERP setup for selling to German consumers.
Managing German eCommerce Returns with Odoo: Strategies for High-Return Markets
How to handle Germany's high eCommerce return rates using Odoo ERP. Covers return processing workflows, reason code analytics, restocking automation, and marketplace-specific policies for Zalando, Otto, Amazon.de, and Kaufland.