Odoo، یک پلتفرم همه کاره ERP منبع باز، به توسعه دهندگان این امکان را می دهد که ایجاد، به روز رسانی و حذف رکوردها را از طریق روش های "create"، "write" و "unlink" به خوبی کنترل کنند. در این وبلاگ، باز نویسی یا override کردن این روشها در Odoo 17 را کشف میکنیم و بررسی میکنیم که چگونه این سفارشیسازی به توسعهدهندگان قدرت میدهد تا چرخه عمر دادهها را مطابق با نیازهای منحصر به فرد کسبوکار شکل دهند.
متدهای "create"، "write" و "unlink" مراحل کلیدی در چرخه عمر رکوردها در پایگاه داده را تشکیل می دهند:
- create: هنگامی که یک رکورد جدید به یک مدل اضافه می شود، فراخوانی می شود.
- write: هنگامی که یک رکورد موجود در حال تغییر یا به روز رسانی است، فعال می شود.
- unlink: زمانی اجرا می شود که یک رکورد در حال حذف یا جدا شدن از مدل اصلی آن باشد.
بازنویسی فرآیند ایجاد رکورد
همانطور که قبلا ذکر شد، متد Create() زمانی فراخوانی می شود که یک رکورد جدید برای مدل خاص ایجاد شود. برای مثال، در اینجا، اجباری کردن فیلد "موبایل" با بازنویسی روش ایجاد مدل res.partner را پیاده سازی کردهایم:
class ResPartner(models.Model): _inherit = "res.partner" @api.model_create_multi def create(self, values): # Check if 'mobile' field is provided in the values if 'mobile' not in values or not values.get('mobile'): raise exceptions.ValidationError("Mobile is a mandatory field. " "Please provide a mobile number.") # Call the original create method to create the res.partner partner = super(ResPartner, self).create(values) return partner
توصیف عملکرد کد
class ResPartner (models.Model):
_inherit = "res.partner"
نشان می دهد که این مدل (ResPartner) از مدل استاندارد Odoo res.partner به ارث می برد. محدودیت مدل "_inherit" برای به ارث بردن یک مدل از مدل والد آن استفاده می شود.
@api.model_create_multi
def create(self, values):
یک دکوریتور به متد ایجاد رکوردها اضافه می کند، که نشان می دهد این یک روش مدل Odoo API است. متد create زمانی فراخوانی می شود که یک رکورد جدید برای مدل res.partner ایجاد شود.
# Check if 'mobile' field is provided in the values if 'mobile' not in values or not values.get('mobile'): raise exceptions.ValidationError("Mobile is a mandatory field. " "Please provide a mobile number.")
بررسی می کند که آیا فیلد 'موبایل' در مقادیر ارائه شده است و خالی نبودن آن. اگر نه، یک خطای اعتبار سنجی ایجاد می کند.
# Call the original create method to create the res.partner partner = super(ResPartner, self).create(values) return partner
متد ایجاد اصلی کلاس والد (res.partner) را فراخوانی می کند. این تضمین می کند که رفتار استاندارد ایجاد یک شریک در حین اجرای اعتبارسنجی سفارشی حفظ می شود.
بازنویسی فرآیند به روز رسانی رکورد
همانطور که قبلا ذکر شد، روش "نوشتن" زمانی فراخوانی می شود که یک رکورد موجود به روز شود. در مورد قبلی، روش create را لغو کرده و فیلد موبایل را به عنوان اجباری اجرا می کنیم. بنابراین ما نمیتوانیم یک رکورد جدید بدون فیلد تلفن همراه ایجاد کنیم، اما همچنان میتوانیم یک رکورد موجود را بدون افزودن فیلد تلفن همراه بهروزرسانی کنیم. برای محدود کردن این، برای مثال، باید روش نوشتن را لغو کنیم.
def write(self, values): # Check if 'mobile' field is provided in the values if 'mobile' not in values or not values.get('mobile'): raise exceptions.ValidationError("Mobile is a mandatory field. " "Please provide a mobile number.") # Call the original write method to update the res.partner record result = super(ResPartner, self).write(values) return result
توصیف عملکرد کد
def write(self, values):
روش نوشتن هنگام به روز رسانی رکوردها برای مدل res.partner فراخوانی می شود.
# Check if 'mobile' field is provided in the values if 'mobile' not in values or not values.get('mobile'): raise exceptions.ValidationError("Mobile is a mandatory field. " "Please provide a mobile number.")
مانند قبل، بررسی می کند که آیا فیلد 'موبایل' در مقادیر ارائه شده است یا خیر و آیا خالی نیست. اگر نه، یک خطای اعتبار سنجی ایجاد می کند.
# Call the original write method to update the res.partner record result = super(ResPartner, self).write(values) return result
- متد نوشتن اصلی کلاس والد (res.partner) را فراخوانی می کند. این تضمین میکند که رفتار استاندارد بهروزرسانی یک رکورد شریک در حین اجرای اعتبارسنجی سفارشی حفظ میشود.
بازنویسی متد حدف
همانطور که قبلا ذکر شد، روش unlink زمانی فراخوانی می شود که یک رکورد حذف شود. بیایید مثالی را برای ایجاد یک استثنا بررسی کنیم، زمانی که یک کاربر غیر ادمین رکوردی را با نادیده گرفتن روش unlink (res.partner) حذف میکند.
def unlink(self): # Check if the user is the admin if not self.env.user.has_group('base.group_erp_manager'): raise exceptions.UserError("Only the admin can delete partners.") # Call the original unlink method to delete the res.partner record result = super(ResPartner, self).unlink() return result
توصیف عملکرد کد
def unlink(self):
روش unlink هنگام حذف رکوردهای مدل res.partner فراخوانی می شود.
# Check if the user is the admin if not self.env.user.has_group('base.group_erp_manager'): raise exceptions.UserError("Only the admin can delete partners.")
بررسی می کند که آیا کاربر فعلی دارای امتیازات مدیریت است یا خیر با بررسی اینکه آیا آنها به گروه
"base.group_erp_manager" تعلق دارند یا خیر، اگر کاربر مدیر نباشد، خطای کاربر ایجاد می کند.
# Call the original unlink method to delete the res.partner record result = super(ResPartner, self).unlink() return result
متد unlink اصلی کلاس والد (res.partner) را فراخوانی می کند. این تضمین می کند که رفتار استاندارد حذف یک رکورد شریک در حین اجرای منطق سفارشی حفظ می شود.
نتیجه گیری
نادیده گرفتن روشهای ایجاد، نوشتن و لغو پیوند به توسعهدهندگان اجازه میدهد تا رفتار پیشفرض ایجاد، اصلاح و حذف رکورد را در یک مدل خاص بدون تغییر کد اصلی اصلی سفارشی کنند.
برای مطالعه بیشتر در مورد روشهای ایجاد، نوشتن و لغو پیوند در Odoo 16، به وبلاگ ما مراجعه کنید چگونه روشهای ایجاد، نوشتن و حذف را در Odoo 16 لغو کنیم.
چگونه روشهای ایجاد، به روز رسانی و حذف رکورد را در Odoo 17 بازنویسی کنیم