Как сделать поле readonly основанным на группе и статусе?

Я хочу сделать полевое чтение на основе группы и статуса.

Как у меня есть две проблемы 1. Группа менеджеров 2. Группа пользователей

Если я дам Группа пользователей для любого пользователя, а затем Статус Готово, то поле будет доступно только для этого пользователя.

Надеюсь, что я смогу понять, что нужно понимать

Спасибо

Ответ 1

Создать функциональное поле типа boolean. Если зарегистрированный пользователь находится под группой пользователей и состояние выполнено, верните значение true. Затем в представлении укажите attrs="{'readonly':[('boolean_field_name','=',True)]}"

ИЛИ

Сначала создайте вид формы. Затем наследуйте представление и укажите группы. например, в форме формы заказа на продажу, я хочу, чтобы поле ссылки клиента было только для пользователя группы, когда состояние не находится в черновике или отправлено.

<record id="view_order_form_cust_ref_readonly" model="ir.ui.view">
    <field name="name">sale.order.form.readonly.cust</field>
    <field name="model">sale.order</field>
    <field name="inherit_id" ref="sale.view_order_form"/>
    <field name="groups_id" eval="[(6, 0, [ref('base.group_user') ])]"/>
    <field name="arch" type="xml">
        <field name='client_order_ref'" position="attributes">
            <attribute name="attrs">{'readonly':[('state','not in',['draft','sent'])]}</attribute>
        </field>
    </field>
</record>

Ответ 2

вы можете применить правило доступа на уровне поля в OpenERP, например, в py

'name': fields.char('Name', size=128, required=True, select=True,
 read=['base.group_user'] ),

И для статуса в xml:

<field name="name " attrs="{'readonly': [('state','=','done')]}"/>

Ответ 3

Есть еще один сладкий способ добиться этого. Создайте одно функциональное поле и проверите для группы, назначенной этому пользователю, и не храните это поле. В поле "Просмотр" используйте это поле в attrs.

Скажем, в продукте вы не хотите разрешать любому пользователю изменять Внутреннюю ссылку, если пользователь не входит в группу Изменить продукт.

Создайте одну группу.

<data noupdate="1" >
    <record model="res.groups" id="group_product_modify">
        <field name="name">Product Modify</field>
        <field name="users" eval="[(4, ref('base.user_root'))]"/> 
    </record>
</data>     

Файл Python

class product_template(models.Model):
    _inherit="product.template"

    @api.one
    def set_access_for_product(self):
        self.able_to_modify_product = self.env['res.users'].has_group('product_extended_ecom_ept.group_product_modify')

    able_to_modify_product = fields.Boolean(compute=set_access_for_product, string='Is user able to modify product?')

Файл XMl должен выглядеть,

<record model="ir.ui.view" id="product_template_update_internal_code_ept">
            <field name="name">Product Template extension</field>
            <field name="inherit_id" ref="product.product_template_only_form_view"/>
            <field name="model">product.template</field>
            <field name="priority" eval="50" />
            <field name="arch" type="xml">
                <field name="default_code" position="before">
                    <field name="able_to_modify_product" invisible="1" />
                </field>
                <field name="default_code" position="attributes">
                    <attribute name="attrs">{'readonly' : [('able_to_modify_product','=',False)]}</attribute>
                </field>
            </field>
        </record>   

Ответ 4

В случае, если вы используете веб-клиент Odoo (GUI) вместо кода, существует немного неортодоксальный способ сделать это. Просто сделайте копию поля, которое будет содержать то же значение, что и исходное (дающее исходное имя поля в Related Field под Advanced Properties) и пометьте его как доступное только для чтения.

введите описание изображения здесь Затем вы можете скрыть исходное поле от пользователей, которые не могут редактировать это поле, и скрыть поле копирования от тех, кто может редактировать, используя атрибут групп.

введите описание изображения здесь

Ответ 5

Эта функция не поддерживается в openerp.

Почему вы не идете на тритон, это fork openerp.

Если вы хотите сделать это, вы можете использовать один tric, сделать вид из двух форм одного и того же объекта, показать его одному пользователю менеджера, а другому пользователю группы пользователей и сделать поле только для чтения

Спасибо