مقدمة
في نظام Odoo، تُمثّل النماذج طريقة تنظيم وتخزين البيانات داخل قاعدة البيانات. كل معلومة تجارية تتعامل معها—من فواتير ومبيعات إلى جهات اتصال—تُخزّن ضمن نموذج محدّد.
فهم بنية النماذج في Odoo مهم لمطوّري النظام والاستشاريين الوظيفيين على حد سواء، لأن النماذج تشكل العمود الفقري لهيكل بيانات Odoo: فهي تُحدّد الحقول والعلاقات والسلوك التجاري.
أين يحفظ Odoo معلومات كل نموذج؟ الإجابة هي ir.model: سجلّ مركزي يحتفظ ببيانات وصفية عن كل نموذج في النظام. سواء كنت تطوّر وحدة مخصصة أو تفحص واجهة برمجة التطبيقات أو تصلّح أخطاء، ستصادف ir.model.
ما هو نموذج ir.model
ir.model هو السجل الوصفي (metadata registry) لكل نماذج Odoo. لكل نموذج في النظام يوجد سجل واحد في هذه الوحدة. عند تعريف نموذج جديد ببايثون أو إنشائه عبر Odoo Studio، يُنشأ أو يُحدّث سجل في ir.model تلقائيًا.
هذا النموذج جزء من الوحدة الأساسية (base module) في Odoo. فهو جزء من إطار العمل الأساسي، وكل نموذج—عادي، مجرد (abstract)، أو مؤقت (transient)—له مدخل مطابق داخل ir.model.
ir.model مُعرّف ضمن الوحدة الأساسية ويرتبط ارتباطًا وثيقًا بـ ir.model.fields الذي يَصِف الحقول على كل نموذج. معًا تكون هاتان الوحدتان العمود الذي يسمح لـ Odoo بفحص نماذجه ديناميكيًا.
المطورون يعتمدون على ir.model عندما يحتاجون لقائمة بالنماذج المتاحة، أو لمراجعة وراثة النماذج، أو لبناء أدوات عامة تعمل عبر نماذج متعددة. كما يكشف API في Odoo عن ir.model عبر XML-RPC و JSON-RPC.
الحقول الأساسية في النموذج
فيما يلي الحقول الأكثر أهمية في ir.model. معرفتك بها تُسهّل العمل مع سجل النماذج وتساعد على فهم بنية النظام.
1. name
النوع: نص قصير (Char). العنوان الوصفي للنموذج كما يظهر في واجهة الإدارة والأدوات المطورين. قابل للترجمة ويُستخدم كالتسمية عند استعراض النماذج.
2. model
النوع: نص قصير (Char). الاسم التقني للنموذج الذي تستخدمه في الكود، مثل res.partner أو sale.order. هذا الحقل مطلوب ومؤشّر للبحث السريع.
3. info
النوع: نص طويل (Text). ملاحظات إضافية أو توضيحات عن الهدف من النموذج. يُستخدم كتوثيق داخلي وغالبًا يكون فارغًا لبعض النماذج.
4. state
النوع: اختيار (Selection). يبيّن ما إذا كان النموذج جزءًا من قاعدة Odoo (base) أو نموذجًا مضافًا يدويًا (manual) عبر Studio أو تخصيص. نماذج base محمية أكثر من النماذج اليدوية.
5. transient
النوع: منطقي (Boolean). إن كان True فالنموذج مؤقت—يُستخدم لنوافذ الحوار والسير المؤقتة وتتم إزالة سجلاته تلقائيًا.
6. field_id
النوع: One2many (ir.model.fields). قائمة الحقول المعرفة على هذا النموذج؛ كل سجل في ir.model.fields يصف حقلًا واحدًا وخصائصه.
7. access_ids
النوع: One2many (ir.model.access). سياسات الوصول المرتبطة بالنموذج؛ كل سجل يحدد أي المجموعات قادرة على إنشاء أو قراءة أو تعديل أو حذف السجلات.
8. rule_ids
النوع: One2many (ir.rule). قواعد السجلات (record rules) التي تقيد أي السجلات يمكن للمستخدمين رؤيتها—تُستخدم لتحقيق أمان مستوى الصفوف.
9. inherited_model_ids
النوع: Many2many (ir.model). نماذج الأبوّة عند استخدام وراثة النماذج. عندما ترث نموذجًا، تُسجّل العلاقة هنا لتوضيح سلسلة الوراثة.
10. modules
النوع: نص (Char) محسوب. يعرض الوحدات (modules) التي تعرّف أو توسّع هذا النموذج، مفيد لمعرفة الاعتمادات ومصدر التعريف.
11. sort
النوع: عدد صحيح (Integer). ترتيب العرض داخل قوائم الإعدادات الفنية؛ القيم الأقل تظهر أولًا لمساعدة تنظيم القوائم.
12. constrains
النوع: نص (Text). تعريفات قيود بايثون (@api.constrains) المضافة على مستوى النموذج للتحقق من سلامة البيانات.
13. post_constrains
النوع: نص (Text). قيود أو تحقق يُنفّذ بعد القيود الاعتيادية—تُستخدم في حالات تحقق متقدمة.
14. sql_constraints
النوع: نص (Text). قيود على مستوى قاعدة البيانات مثل قيود الفريدة (unique) لضمان تكامل البيانات مهما كان مصدر الإدخال.
15. view_ids
النوع: One2many (ir.ui.view) محسوب. يَظهر القوالب والعروض المرتبطة بالنموذج، مفيد لاستكشاف واجهات المستخدم وإدارتها.
16. record_count
النوع: عدد صحيح محسوب. عدد السجلات الموجودة في هذا النموذج، قيمة مفيدة للتقارير ولمعرفة حجم البيانات.
17. display_name
النوع: نص محسوب. طريقة العرض الودية للسجل عند الربط أو العرض في القوائم—عادة مزيج من الاسم والوصف.
18. create_date
النوع: تاريخ/وقت. تاريخ ووقت إنشاء سجل ir.model، تُديره Odoo تلقائيًا.
19. create_uid
النوع: Many2one (res.users). المستخدم الذي أنشأ السجل، ويُستخدم لأغراض التدقيق والمتابعة.
20. write_date
النوع: تاريخ/وقت. تاريخ ووقت آخر تعديل، يديره النظام تلقائيًا.
21. write_uid
النوع: Many2one (res.users). المستخدم الذي عدّل السجل آخر مرة—جزء من آليات التدقيق.
22. active
النوع: منطقي (Boolean). علم الأرشفة الناعمة؛ عند جعله False يُعتبر النموذج متوقفًا أو مهجورًا دون حذف من قاعدة البيانات.
23. id
النوع: عدد صحيح. المعرف الفريد في قاعدة البيانات لكل سجل ir.model، يُستخدم في استدعاءات الواجهة البرمجية والربط.
24. restrict_functionality
النوع: منطقي (Boolean). يبيّن إذا كان هناك قيود وظيفية لهذا النموذج في إصدارات Odoo مختلفة—مفيد للتمييز بين ميزات المجتمع والمؤسسة.
25. is_mail_thread
النوع: منطقي (Boolean). هل يدعم النموذج محادثات وChatter؟ إن كان True فله رسائل ومتابعون.
26. is_mail_activity
النوع: منطقي (Boolean). إن كان النموذج يدعم نشاطات ومخطط النشاط لتتبع الأعمال التالية، يُحدد هنا.
كيف يُستخدَم هذا النموذج في سير العمل التجاري
1. الإعدادات الفنية والتكوين
يتصفّح المسؤولون قائمة النماذج عبر قائمة الإعدادات الفنية، والسجلات في ir.model هي ما يُعرض هناك—مسمّى النموذج، الوصف، وعدد الحقول كلها تظهر لمساعدة الصيانة.
2. إدارة صلاحيات الوصول
عند ضبط الأمان يمنح المسؤولون مجموعات صلاحيات على النماذج؛ access_ids في ir.model تحدد من يستطيع القيام بعمليات CRUD على كل نموذج.
3. تخصيص عبر Odoo Studio
عند إنشاء نماذج مخصصة عبر Odoo Studio يُنشأ سجل ir.model جديد بحالة manual، ويُضاف إليه الحقول المخصصة تلقائيًا في field_id.
4. اكتشاف عبر API والتكاملات
تتكامل الأنظمة الخارجية مع Odoo عبر XML-RPC أو JSON-RPC؛ يمكنها استعلام ir.model لاكتشاف النماذج المتاحة وبنيتها بدل الاعتماد على أسماء صلبة مسبقة.
5. تطوير الوحدات وتصحيح الأخطاء
المطورون يستعينون بـ ir.model لفهم سلاسل الوراثة عبر inherited_model_ids ولمعرفة الحقول عبر field_id عند بناء وحدات أو تتبّع الأخطاء.
كيف يوسع المطورون هذا النموذج
نادراً ما يقوم المطورون بتعديل ir.model نفسه؛ فالقاعدة تُحدّث السجل تلقائيًا عند تحميل وحدة جديدة، وبالتالي العمل المباشر على ir.model غير شائع.
وراثة النماذج
عند استخدامك للوراثة في بايثون (مثل _inherit = 'res.partner') يقوم Odoo بتحديث مدخل ir.model الخاص بالنموذج الأب وإضافة روابط الوراثة في inherited_model_ids لتوضيح العلاقة بين الأب والابن.
إضافة الحقول
إضافة حقل جديد إلى نموذج تُولّد سجلًا جديدًا في ir.model.fields يرتبط عبر model_id بسجل ir.model المعني؛ عادة لا تُغيّر السجلات الأساسية في ir.model نفسها.
توسعات بايثون
من غير الشائع تجاوز أو إعادة تعريف وظائف ir.model — إن احتجت لتعديل سلوك، فعادةً تُعدّل النموذج نفسه الذي يصفه ir.model لا ir.model ذاته.
Odoo Studio
عند بناء نماذج في Studio يُنشأ كل من ir.model و ir.model.fields بدون كود؛ علم transient يفصل النماذج المؤقتة، أما النماذج المجردة فغالبًا لا تملك مدخلاً لأنها لا تُنشئ جدولًا في قاعدة البيانات.
ممارسات موصى بها
- نصيحة عملية: استخدم ir.model للاكتشاف بدلاً من كتابة أسماء نماذج ثابتة. استعلام السجل يوفّر قائمة محدثة من النماذج المتاحة.
- اعتمد على حقل model للبحث. هو مُؤشّر ومناسب لعمليات البحث عندما تحتاج بيانات وصفية لنموذج محدد.
- راجع inherited_model_ids قبل التوسيع. افهم سلسلة الوراثة لتجنب تعارض التعريفات عند إضافة حقول أو سلوك.
- اقرأ ir.model عبر واجهة API (XML-RPC/JSON-RPC) بدلاً من تعديل السجل مباشرةً—التعديل يقتصر عادة على أدوات شبيهة بـ Studio.
- استخدم ir.model.fields للاستقصاء عن الحقول. علاقة field_id تمنحك قائمة بكل الحقول المتاحة على النموذج.
أخطاء شائعة
- لا تغير سجلات ir.model مباشرةً في قاعدة البيانات. السجل يُدار تلقائيًا ويمكن أن تُكسر التوافقية أو تُستبدَل التغييرات أثناء الترقية.
- لا تخلط بين ir.model وفئة البايثون نفسها. ir.model هو سجل واصف في قاعدة البيانات، بينما كلاس البايثون هو الشيفرة الفعلية التي تنفّذ منطق النموذج.
- لا تفترض أن كل فئة لها سجل في ir.model. النماذج المجردة (abstract) قد لا تُنشئ جدولًا ولا سجلًا في ir.model.
- لا تنسَ أن النماذج المؤقتة تتنقّى تلقائيًا. الحقل transient يعني أن البيانات ليست دائمة ولا ينبغي استخدامها لتخزين معلومات مطلوبة على المدى الطويل.
- لا تستعلم عن ir.model بدون فلاتر. لدى نظام Odoo نموذجات كثيرة؛ اجعل عمليات البحث محددة بالاسم أو دومينات لتفادي نتائج ضخمة.
خاتمة
ir.model هو سجل النماذج في Odoo: مخزن للبيانات الوصفية عن كل نموذج في النظام. فهم الحقول وعلاقتها بـ ir.model.fields يسهل التنقّل وفهم بنية البيانات داخل Odoo.
بغض النظر عن دورك—مستشار وظيفي يستكشف الإعدادات الفنية أو مطوّر يبني تكاملات API—إتقان ir.model يقلّل الوقت ويمنع أخطاء شائعة.
تحتاج مساعدة في تنفيذ Odoo؟
شركة Dasolo تدعم الشركات في تنفيذ وتخصيص وتحسين Odoo، مع خبرة متعمقة في تطوير الوحدات ودمج الواجهات البرمجية وبنية بيانات Odoo مثل ir.model.
إذا كنتم بحاجة لدعم في تنفيذ Odoo أو تطوير وحدات مخصصة أو بناء تكاملات، فريقنا جاهز لمساعدتكم. احجز عرضًا تجريبيًا لمناقشة مشروعك.