Extending create() and write()
Extending create() method
To include any additional functionality while creating a record of the model, we can extend a model's create() function.
Let's use adding a "notes" field to the "sale.order" as an example.
In this case, editing the notes field will result in a "UserError" for users who are not members of the "Administration/Access Rights" group.
class SaleOrder(models.Model):
_inherit = 'sale.order'
notes = fields.Text(string='Notes')
def create(self,vals):
res = super(SaleOrder,self).create(vals)
if 'notes' in vals and not self.env.user.has_group('base.group_erp_manager'):
raise UserError(_("You cannot edit the field 'notes'"))
return res
As an example of the write() method, we can do the same thing.
Before writing, we evaluate the group and occurrence of the field in the vals to write, and if there is a problem, we raise a UserError exception.
def write(self,vals):
res = super(SaleOrder,self).write(vals)
if 'notes' in vals and not self.env.user.has_group('base.group_erp_manager'):
raise UserError(_("You cannot edit the field 'notes'"))
return res
Overriding _name_search()
By redefining name search, we can search for a record in the Many2one widget using any field in the model.
Let’s take an example: In the Many2one field, we can search for a partner by name, phone number, or email.
class ResPartner(models.Model):
_inherit = 'res.partner'
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
args = args or []
domain = []
if name:
domain = ['|', '|', ('name', operator, name), ('phone', operator, name), ('email', operator, name)]
return self._search(domain + args, limit=limit, access_rights_uid=name_get_uid)
To begin, we must inherit the res.partner class and override the _name search() function.
Most of the arguments we receive are passed on in their original form to the method's super() implementation:
- name is a string containing the value that the user has typed thus far, the user input.
- As a prefilter for the potential records, args can either be None or a search domain. (It could be derived from the domain parameter of the Many2one relation, for instance.)
- operator is a string that contains the match operator. Generally, you will have 'ilike' or '='.Customizing how records are searched
- The maximum number of rows to retrieve is specified by limit.
- name_get_uid can be used to specify a different user when calling name_get() to compute the strings to display in the widget.