Расширенный доступ для `записи` на res.partner - PullRequest
0 голосов
/ 10 мая 2018

Доступны ли данные, которые были переданы в write() с параметром (vals) из метода check_access_rights?

Я унаследовал от res.partner и переопределил метод check_access_rights с намерением разрешить пользователю без прав записи на res.partner обновлять child_ids (этого партнера), если этот ребенок был создан этим пользователем (create_uid = Идентификатор пользователя) . Я надеюсь, что смогу где-нибудь реализовать (в методах write или check_access_rights) этот псевдокод:

if `the user belongs to a group "GroupX"` and `user tries to only update field "child_ids" with records that are created by that user`
    then `allow this write operation on res.partner`
    else `raise AccessError`

1 Ответ

0 голосов
/ 14 мая 2018

Чтобы позволить пользователю (из "Группы X") изменять объекты res.partner, которые были созданы им, и позволять изменять child_ids объектов res.partner, которые были созданы кем-либо:

сначала создайте группу «Группа X» с правами: a) r, w, c, u на res.partner; b) r, w, c на ir.property.

Затем создайте класс, который наследуется от res.partner и переопределите метод write.

# -*- coding: utf-8 -*-

class InheritedResPartner(models.Model):
    """Description""" 
    _inherit = 'res.partner'

    @api.multi
    def write(self, vals):
        is_in_group = 'Group X' in map(lambda x: x.name, self.env.user.groups_id)
        if is_in_group:
            operation = 'write'
            owns_record = self.create_uid == self.env.user

            if owns_record:
                True
            else:
                allowed = True

                # Do all checks further and set `allowed` to either True or False 
                ...<omitted intentionaly> put your logic here
                #

                if not allowed:
                    raise AccessError(_('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') % (self._description, operation))
        return super(InheritedResPartner, self).write(vals)

Примечание: мы предоставляем полные права на res.partner, но переопределим метод записи и вызовем AccessError, если обнаружено нежелательное действие.

...