2025, Dec 08 03:01
Как показать товары на портале Odoo: правила записей и доступ к sale.order.line
Почему на портале Odoo видны заказы, но не подтягиваются товары, и как это исправить: дайте доступ к sale.order.line. Разбор правил и связанных моделей.
При публикации бизнес-объектов в сайте/портале Odoo легко натолкнуться на ограничения правил записей и прав доступа. Типичный сценарий — показать пользователям портала заказы на продажу и связанные с ними товары: заказы видны, а товары упорно не подгружаются. Настройки на первый взгляд корректны, но сайт так и не выводит данные о продуктах.
Постановка задачи
Цель — показывать на сайте и заказы, и товары для пользователей из base.group_portal. Были добавлены правила записей и права доступа для sale.order, product.template и product.product. Результат: заказы стали видны, а товары — нет.
Ниже приведены правила и права, иллюстрирующие ситуацию.
<record id="rule_portal_so_by_final_recipient_alt" model="ir.rule">
<field name="name">Portal: SO by Final Recipient (alt)</field>
<field name="model_id" ref="sale.model_sale_order"/>
<field name="groups" eval="[(4, ref('base.group_portal'))]"/>
<field name="domain_force">[('final_recipient_id', '=', user.partner_id.id)]</field>
</record>
<record id="rule_portal_prod_template_open_alt" model="ir.rule">
<field name="name">Portal: Product Template (alt)</field>
<field name="model_id" ref="product.model_product_template"/>
<field name="global" eval="False"/>
<field name="groups" eval="[(4, ref('base.group_portal'))]"/>
<field name="domain_force">[]</field>
</record>
<record id="rule_portal_prod_product_open_alt" model="ir.rule">
<field name="name">Portal: Product Variant (alt)</field>
<field name="model_id" ref="product.model_product_product"/>
<field name="global" eval="False"/>
<field name="groups" eval="[(4, ref('base.group_portal'))]"/>
<field name="domain_force">[]</field>
</record>
acc_prod_product_user,acc_prod_product_user,product.model_product_product,base.group_user,1,1,1,1
acc_prod_product_portal,acc_prod_product_portal,product.model_product_product,base.group_portal,1,0,0,0
acc_prod_template_user,acc_prod_template_user,model_product_template,base.group_user,1,1,1,1
acc_prod_template_portal,acc_prod_template_portal,model_product_template,base.group_portal,1,0,0,0
acc_sale_order_portal,acc_sale_order_portal,model_sale_order,base.group_user,1,1,1,1
acc_sale_order_user,acc_sale_order_user,model_sale_order,base.group_portal,1,0,0,0
Даже принудительный тривиальный домен вроде (1, "=", 1) не менял результат, и никаких других пересекающихся правил в конфигурации группы портала не было.
Почему так происходит
В Odoo доступ к данным проверяется для каждой модели, задействованной в запросе. Сделать видимым лишь sale.order недостаточно, если сайт проходит по связанным моделям. Если представление или контроллер извлекает/отображает поля, зависящие от других объектов, каждая из этих моделей тоже должна быть доступна для чтения в текущем контексте безопасности пользователя. Если хотя бы одно звено цепочки не имеет разрешающего правила записей, на этом разрешение данных обрывается, и соответствующий участок интерфейса остаётся пустым.
В данном случае путь, по которому подтягивается информация о товарах, также затрагивает sale.order.line. При правилах только для sale.order, product.template и product.product у пользователя портала всё ещё не было доступа к необходимым связанным записям, поэтому часть с товарами не отображалась.
Решение
Проблему решило добавление правила, дающего пользователям портала доступ на чтение к sale.order.line. В похожих случаях важно убедиться, что для каждой связанной модели, задействованной маршрутом или представлением сайта, есть соответствующее правило.
<record id="rule_portal_so_line_open_alt" model="ir.rule">
<field name="name">Portal: Sale Order Line (alt)</field>
<field name="model_id" ref="sale.model_sale_order_line"/>
<field name="groups" eval="[(4, ref('base.group_portal'))]"/>
<field name="domain_force">[]</field>
</record>
Почему это важно
Функции портала часто затрагивают несколько моделей: заказы, строки, товары, шаблоны. Если хотя бы для одной из них нет правила, согласованного с требуемой видимостью, итоговый интерфейс оказывается неполным. Понимание того, что Odoo проверяет доступ на каждом шаге, экономит часы экспериментов и избавляет от рискованных обходных путей.
Выводы
Публикуя данные для пользователей портала, мыслите всей графовой структурой данных. Начните с объекта, который показываете, перечислите связанные модели, к которым обращаются ваши представления и маршруты, и убедитесь, что для каждой есть нужное правило записей и права доступа. Если что-то отображается частично — например, видны заказы, но не товары, — проверьте промежуточные модели на этом пути и добавьте недостающее правило. Такой точечный подход сохраняет безопасность и гарантирует стабильный вывод данных на сайте.