Just simply give right permission to update state field.
Or
over ride write method & do proper code & raise message that you can't do this.
def write(self, cr, uid, ids, vals, context=None): res = super(crm_lead, self).write(cr, uid, ids, vals, context) warning = {} if vals.get('stage_id'): stage = self.pool.get('crm.case.stage').browse(cr, uid, vals['stage_id'], context=context) if stage.name == 'Pre Sale': #raise osv.except_osv(_('Error!'),_('You cannot confirm a sales order which has no line.')) dummy,group_id = self.pool.get('ir.model.data').get_object_reference(cr, 1, 'base', 'group_sale_manager') user_groups = self.pool.get('res.users').read(cr, uid, [uid], context)[0]['groups_id'] if group_id not in user_groups: raise osv.except_osv(_('Warning!'), _('You are not a sales manager and so you are not allowed to win this thing')) return res