2016-01-11 65 views
0

這個問題從這裏開始:How to manage security with One2many fields in Odoo?。但是現在,我簡化了這個問題,問題不一樣。如何管理Odoo 8中的相關字段和權限?

的環境和問題是相同的:

class mother(models.Model): 
    _name = 'mother' 

    name = fields.Char(string='Name', size=64, required=True) 
    is_a_good_mother = fields.Boolean(string='Is a good mother?') 

    @api.multi 
    def write(self, vals): 
     _logger.info('I DO NOT KNOW WHY WHEN CREATING A CHILD THIS ORM ' 
        'METHOD IS BEING EXECUTED, RECEIVING THE KEY ' 
        'is_a_good_mother') 
     return super(mother, self).write(vals) 


class child(models.Model): 
    _name = 'child' 

    mother_id = fields.Many2one(comodel_name='mother', 
           string='Mother', ondelete='cascade') 
    has_a_good_mother = fields.Boolean(
     string='Does the child have a good mother?', 
     related='mother_id.is_a_good_mother', 
     related_sudo=True) 

我有打開兒童形式的菜單選項。此表單由Odoo自動生成。

問題

我有誰可以創建和修改的孩子,而不是母親的用戶。當該用戶創建該孩子時,安全錯誤會提示用戶屬於無法修改模型的組。這是由於行related='mother_id.is_a_good_mother',如果我刪除它,並且我創建一個新的孩子,ORM write方法母親未被調用。

所以,如果具有了個關子指着一個任何領域,與您共創的新紀錄,ORM write方法的被調用。

我有一個安全組my_group,與read 1 create 1 write 1 unlink 1read 1 create 0 write 0 unlink 0。由於此羣組的用戶無法編寫A,因此創建B記錄時發生錯誤。

我該如何避免這個錯誤?我曾嘗試過related_sudo=True,但它沒有奏效,可能是我沒有很好地使用它。

任何人都可以幫助我嗎?

+1

用於創建子項的表單是否包含「has_a_good_mother」字段?如果是這樣的字段只讀或不是? –

+0

是的,它的確如此,它不是隻讀的。 – forvas

+0

@LudwikTrammer這就是問題所在!我必須將相關字段設置爲只讀,否則調用ORM'write'方法。把你的評論作爲答案,我會把它設置爲正確的。非常感謝你! – forvas

回答

2

相關字段值存儲在「母親」對象的原始字段中。因此,當您嘗試在「子」對象上進行更改時,Odoo會在幕後對其進行更新。如果進行更改的用戶沒有更改「母親」對象的權限,則會引發異常。

您需要確保無權更改目標對象的用戶無法設置/更改指向該對象的相關字段的值。例如,您可以只讀(readonly=True)。