تطوير أودو

إهمال attrs في أودو: الانتقال إلى invisible وreadonly وrequired في أودو 16–19

تم إهمال قاموس attrs في أودو 16 وحذفه في أودو 17. يحدد هذا الدليل كل نمط attrs ومقابله من السمات المباشرة — مع كود قبل/بعد لحالات الاستخدام الأكثر شيوعًا. موثق لأودو 18 و19.

iWesabe Editorial Team١ مايو ٢٠٢٢6 دقائق للقراءة

في أودو 15 وما سبقه، كانت السيطرة على ظهور حقل نموذج أو قراءته فقط أو إلزاميته بناءً على قيم حقول أخرى تستلزم قاموس `attrs` — سمة تشبه JSON تجمع شروطًا متعددة في مكان واحد. قدّم أودو 16 نهجًا أكثر نظافة: سمات `invisible` و`readonly` و`required` و`column_invisible` مباشرة تقبل تعبيرات تشبه Python. يغطي هذا الدليل ما الذي تغيّر ولماذا وكيفية ترحيل كل نمط شائع من `attrs`.

ما كانت سمة attrs؟

كانت `attrs` سمة XML مقبولة على عناصر الحقل والزر والمجموعة في عروض نماذج أودو والقوائم والبحث. كانت تأخذ قاموس Python (مكتوبًا كسلسلة JSON) يربط ثلاثة مفاتيح سلوك — `invisible` و`readonly` و`required` — بتعبيرات نطاق أودو تُقيَّم وفق قيم حقول السجل الحالي.

xml
<!-- Odoo 15 and earlier — attrs syntax (DO NOT USE in Odoo 16+) -->
<field name="amount_total"
       attrs="{
           'invisible': [('state', '=', 'draft')],
           'readonly':  [('state', 'in', ['done', 'cancel'])],
           'required':  [('invoice_type', '=', 'out_invoice')]
       }"/>

جدول زمني للإهمال

جدول إهمال وحذف attrs عبر إصدارات أودو
إصدار أودوحالة attrsالإجراء المطلوب
أودو 15 (وما سبقه)مدعوم — الصيغة الأساسيةلا شيء. attrs هو النهج القياسي.
أودو 16مهمل — يُسجّل تحذير ترحيل. لا يزال يعمل.ابدأ الترحيل: السمات المباشرة الجديدة تعمل بالتوازي.
أودو 17محذوف — يُثير خطأ تحليل عرض XML.الترحيل إلزامي قبل الترقية إلى أودو 17.
أودو 18 و19محذوف — نفس خطأ أودو 17.استخدم سمات invisible وreadonly وrequired وcolumn_invisible المباشرة فقط.

الصيغة الجديدة — السمات المباشرة

من أودو 16 فصاعدًا، كل سلوك هو سمة XML منفصلة تقبل سلسلة تعبير Python. يُقيَّم التعبير في سياق السجل الحالي — جميع قيم الحقول في السجل متاحة كمتغيرات Python.

مرجع السمات المباشرة لأودو 16–19
السمةتنطبق علىسياق التعبيرملاحظات
invisiblefield وbutton وgroup وdiv وpage وnotebookقيم حقول السجل الحالييُخفي العنصر. لا يُرسل القيمة إلى الخادم عند الإخفاء.
readonlyfield وgroupقيم حقول السجل الحالييعرض الحقل غير قابل للتحرير. تُرسَل القيمة مع ذلك.
requiredfieldقيم حقول السجل الحالييُضيف التحقق من جهة العميل. يُوصى بالقيد من جهة الخادم أيضًا.
column_invisiblefield داخل عرض tree/listparent.field (استخدم بادئة parent. لحقول مستوى الرأس)يُخفي العمود بالكامل. استخدمه بدلًا من invisible لأعمدة عرض القائمة.

مرجع الترحيل — أنماط attrs إلى السمات الجديدة

أنماط attrs الشائعة ومكافئاتها في أودو 16–19
نمط attrs (أودو 15)السمة المباشرة (أودو 16–19)ملاحظات
attrs="{'invisible': [('state', '=', 'done')]}"invisible="state == 'done'"تحقق من التساوي البسيط
attrs="{'invisible': [('state', 'in', ['done', 'cancel'])]}"invisible="state in ('done', 'cancel')"عامل in — استخدم tuple وليس list
attrs="{'invisible': [('partner_id', '=', False)]}"invisible="not partner_id"التحقق من الفراغ لحقل Many2one
attrs="{'invisible': [('partner_id', '!=', False)]}"invisible="partner_id"التحقق من الوجود — اسم الحقل وحده كافٍ
attrs="{'readonly': [('state', 'in', ['done', 'cancel'])]}"readonly="state in ('done', 'cancel')"للقراءة فقط عند وجود قيمة ضمن مجموعة
attrs="{'required': [('invoice_type', '=', 'out_invoice')]}"required="invoice_type == 'out_invoice'"حقل إلزامي مشروط
attrs="{'invisible': [('type', '!=', 'product'), ('state', '!=', 'draft')]}" (منطق AND)invisible="type != 'product' and state != 'draft'"نطاق AND → Python and
attrs="{'invisible': ['|', ('type', '=', 'service'), ('state', '=', 'done')]}" (منطق OR)invisible="type == 'service' or state == 'done'"نطاق OR (البادئة '|') → Python or
إخفاء عمود عبر invisible في عرض الشجرةcolumn_invisible="parent.state == 'draft'"استخدم column_invisible (وليس invisible) لأعمدة عرض القائمة; ارجع إلى سجل الرأس عبر parent.

أمثلة على الكود قبل/بعد

مثال 1 — حقل عرض نموذج بسلوكيات متعددة

xml
<!-- BEFORE — Odoo 15 (attrs, do not use in Odoo 16+) -->
<field name="amount_total"
       attrs="{
           'invisible': [('state', '=', 'draft')],
           'readonly':  [('state', 'in', ['done', 'cancel'])],
           'required':  [('invoice_type', '=', 'out_invoice')]
       }"/>

<!-- AFTER — Odoo 16 / 17 / 18 / 19 -->
<field name="amount_total"
       invisible="state == 'draft'"
       readonly="state in ('done', 'cancel')"
       required="invoice_type == 'out_invoice'"/>

مثال 2 — رؤية عمود عرض القائمة

xml
<!-- BEFORE — Odoo 15 (attrs in tree view) -->
<tree>
    <field name="name"/>
    <field name="amount" attrs="{'invisible': [('state', '=', 'draft')]}"/>
    <field name="state"/>
</tree>

<!-- AFTER — Odoo 16+ (column_invisible for columns) -->
<list>  <!-- tree was renamed to list in Odoo 16 -->
    <field name="name"/>
    <field name="amount" column_invisible="parent.state == 'draft'"/>
    <field name="state"/>
</list>

مثال 3 — منطق OR

xml
<!-- BEFORE — Odoo 15 (OR domain with '|' prefix) -->
<field name="discount"
       attrs="{'invisible': ['|', ('type', '=', 'service'), ('state', '=', 'done')]}"/>

<!-- AFTER — Odoo 16+ (Python or) -->
<field name="discount"
       invisible="type == 'service' or state == 'done'"/>

مثال 4 — رؤية الزر

xml
<!-- BEFORE — Odoo 15 -->
<button name="action_confirm" string="Confirm"
        attrs="{'invisible': [('state', '!=', 'draft')]}"/>

<!-- AFTER — Odoo 16+ -->
<button name="action_confirm" string="Confirm"
        invisible="state != 'draft'"/>

سمة states — مهملة أيضًا

بالإضافة إلى `attrs`، دعم أودو 15 أيضًا سمة `states` المختصرة التي تضبط الرؤية بناءً على حقل `state` في السجل. تم إهمالها في أودو 16 جنبًا إلى جنب مع `attrs`. استبدلها بـ `invisible` باستخدام نفس نمط التعبير.

xml
<!-- BEFORE — Odoo 15 (states shorthand) -->
<button name="action_confirm" string="Confirm" states="draft"/>

<!-- AFTER — Odoo 16+ -->
<button name="action_confirm" string="Confirm"
        invisible="state != 'draft'"/>

البحث عن attrs في قاعدة الكود

ملاحظات الإصدار

صيغة تعبيرات العرض عبر إصدارات أودو
إصدار أودوattrsstatesinvisible / readonly / requiredcolumn_invisibletree مقابل list
أودو 15✓ مدعوم✓ مدعومغير متاحغير متاحtree فقط
أودو 16⚠ مهمل (تحذير في السجلات)⚠ مهمل✓ مُدخَل✓ مُدخَلlist (الاسم المستعار tree يعمل)
أودو 17✗ محذوف (خطأ تحليل XML)✗ محذوف✓ مطلوب✓ مطلوب للأعمدةlist (الاسم المستعار tree محتفظ به)
أودو 18 و19✗ محذوف✗ محذوف✓ قياسي✓ قياسيlist (الاسم المستعار tree محتفظ به)

هل تُرقّي وحداتك المخصصة في أودو إلى أودو 17 أو 18 أو 19؟

يتولى فريقنا المعتمد من أودو ترحيل الوحدات وإعادة هيكلة attrs إلى التعبيرات واختبار الترقية الكاملة للشركات السعودية — بما في ذلك التحقق من الامتثال لـ ZATCA وGOSI على الإصدار الجديد.

واتساب

الأسئلة الشائعة

هل ستعمل وحدتي من أودو 15 التي تحتوي على attrs في أودو 16؟
نعم، لكن مع تحذيرات الإهمال في سجلات الخادم. لا يزال أودو 16 يُحلّل `attrs` ويُقيّمها — ويُسجّل تحذيرًا لكل عنصر عرض يستخدم الصيغة المهملة. ستعمل الوحدة، لكن يجب ترحيل `attrs` إلى السمات المباشرة قبل الترقية إلى أودو 17، حيث تُحذف السمة بالكامل وتُسبّب خطأ تحليل.
ما الفرق بين invisible وcolumn_invisible؟
`invisible` على حقل داخل عرض قائمة/شجرة يُخفي قيمة الخلية لصف معين لكن يُبقي العمود مرئيًا (رأس العمود لا يزال يظهر). `column_invisible` يُخفي العمود بالكامل، بما في ذلك الرأس، لجميع الصفوف. استخدم `column_invisible` عندما لا يجب أن يظهر العمود على الإطلاق بناءً على حالة سجل الرأس. استخدم `invisible` عندما تحتاج صفوف معينة فقط إلى إخفاء القيمة.
هل يمكنني استخدام دوال Python مثل len() أو isinstance() داخل تعبيرات invisible؟
لا. وضع الحماية للتعبيرات محدود عمدًا — يدعم قيم الحقول وعوامل المقارنة (`==` و`!=` و`>` و`<` و`>=` و`<=`) والعوامل المنطقية (`and` و`or` و`not`) وعوامل `in` و`not in` وحرفيات Python. الدوال المضمّنة الكاملة في Python مثل `len()` و`isinstance()` أو تعبيرات القائمة غير متاحة. إذا كنت تحتاج إلى منطق معقد، احسب النتيجة في حقل محسوب `@api.depends` واستند إلى ذلك الحقل في التعبير.
كيف أجعل مجموعة أو علامة تبويب صفحة غير مرئية في عرض النموذج؟
طبّق `invisible` مباشرة على عنصر `` أو `` أو `` — صيغة التعبير ذاتها تعمل للحاويات وليس فقط للحقول. مثال: ``. جميع الحقول داخل مجموعة أو صفحة مخفية تُخفى معها تلقائيًا ولا تُرسَل قيمها.
قمت بالترقية إلى أودو 17 وجميع عروضي المخصصة تُظهر نموذجًا فارغًا. ما الذي حدث؟
يُثير أودو 17 خطأ تحليل XML عند مواجهة `attrs` — يتسبب ذلك عادةً في فشل العرض بصمت ويُعرض فارغًا. تحقق من سجل خادم أودو للأسطر التي تحتوي على `Invalid field` أو `Unknown attribute attrs`. شغّل `grep -rn 'attrs=' --include='*.xml' .` من مجلد إضافاتك لتحديد جميع التكرارات، ثم قم بترحيلها إلى السمات المباشرة باستخدام جدول التحويل في هذا الدليل.
هل تحتاج سمة domain على حقل علائقي إلى الترحيل أيضًا؟
لا. سمة `domain` على حقول Many2one وMany2many وOne2many منفصلة عن قاموس `attrs` المهمل. تُصفّي خيارات القائمة المنسدلة المعروضة عندما يختار المستخدم سجلًا مرتبطًا، وتستمر في استخدام صيغة قائمة نطاق أودو القياسية في أودو 16–19. فقط قاموس `attrs` (واختصار `states`) يحتاج إلى ترحيل — `domain` للتصفية لم يتغير.
iWesabe Editorial Team

iWesabe Editorial Team

رؤى عملية حول Odoo ERP وامتثال ZATCA والعمليات الرقمية للشركات السعودية — بقلم فرق الاستشارات والمالية والهندسة في iWesabe.

عن iWesabe

مقالات ذات صلة