Правила записи Odoo 13: доступ на запись для определенных записей

#python #xml #odoo #odoo-13

#питон #xml #odoo #odoo-13

Вопрос:

Я работаю над модулем, расширяющим посещаемость Odoo. Моя цель — сделать редактируемыми только записи, удовлетворяющие условию, в то время как другие остаются доступными только для чтения.

Я создал дополнительное поле user_editable для имитации будущего состояния, но, увы, это не работает. Все отображаемые записи доступны только для чтения.

Что я упускаю из виду?

Это мои правила записи, адаптированные из существующих.

 <odoo>
    <record id="mymodule_attendance_rule_create" model="ir.rule">
        <field name="name">user: modify own attendance only</field>
        <field name="model_id" ref="hr_attendance.model_hr_attendance"/>
        <field name="domain_force">[('employee_id.user_id','=',user.id)]</field>
        <field name="perm_read" eval="0"/>
        <field name="perm_write" eval="0"/>
        <field name="perm_create" eval="1"/>
        <field name="perm_unlink" eval="0"/>
        <field name="groups" eval="[(4,ref('base.group_user'))]"/>
    </record>

    <record id="mymodule_attendance_rule_change" model="ir.rule">
        <field name="name">user: modify only last three workdays' attendance</field>
        <field name="model_id" ref="hr_attendance.model_hr_attendance"/>
        <field name="domain_force">[
            ('user_editable','=',True),
            ('employee_id.user_id','=',user.id)
            ]</field> 
        <field name="perm_read" eval="0"/>
        <field name="perm_write" eval="1"/>
        <field name="perm_create" eval="0"/>
        <field name="perm_unlink" eval="1"/>
        <field name="groups" eval="[(4,ref('base.group_user'))]"/>
    </record>
</odoo>
 

Насколько я понимаю, второй вариант должен оцениваться, когда пользователь пытается отредактировать запись, которая, однако, не редактируется во внешнем интерфейсе после установки модуля.

Вот определение моего дополнительного поля:

 class HrAttendance(models.Model):
    _inherit = "hr.attendance"

    user_editable = fields.Boolean(string='User editable',
                                    store=True,
                                    compute='_compute_user_editable')

 

_compute_user_editable в настоящее время просто устанавливается «True».

Спасибо!

Ответ №1:

Я нашел источник проблемы. Представления, от которых я наследовал, были доступны для редактирования членами групп офицеров и администраторов. Это было достигнуто путем установки условия:

     <record id="view_attendance_tree_inherit" model="ir.ui.view">
        <field name="name">hr.attendance.tree.inherit</field>
        <field name="model">hr.attendance</field>
        <field name="inherit_id" ref="hr_attendance.view_attendance_tree"/>
        <!-- the line hier was causing the problem -->
        <field name="groups_id" eval="[(4, ref('hr_attendance.group_hr_attendance_user'))]"/>
        <field name="arch" type="xml">
            <tree position="attributes">
                <attribute name="edit">1</attribute>
                <attribute name="editable">bottom</attribute>
            </tree>
        </field>
    </record>
 

group_hr_attendance_user на самом деле это группа офицеров. Таким образом, любой член группы ручного посещения не может редактировать записи. Эта проверка условий запрещает это.

Итак, мой подход заключался в том, чтобы просто создать собственное представление (в основном измененную копию этого) с надлежащей групповой проверкой. group_hr_attendance является группой посещаемости вручную. И чтобы это работало, я добавил

     <field name="view_ids" eval="[(5, 0, 0),
                                    (0, 0, {'view_mode': 'tree', 'view_id': ref('mymodule.view_attendance_tree')}),
                                    (0, 0, {'view_mode': 'kanban', 'view_id': ref('hr_attendance.view_hr_attendance_kanban')}),
                                    (0, 0, {'view_mode': 'form', 'view_id': ref('mymodule.attendance_view_form')})]"/>
 

к моему действию меню. Я attendance_view_form также сделал копию, поскольку у нее было то же групповое ограничение, что и в древовидном представлении.